我想从Octave(版本4.4.1)的单位矩阵的每一列中减去向量v
,例如v = [1; 1]
。
为什么自动广播对命令eye
不起作用?
eye(2) - [1; 1]
说
错误:运算符-:不一致的参数(op1为2x2,op2为1x2)
bsxfun(@minus,eye(2),[1; 1])
和[1, 0; 0, 1] - [1; 1]
都产生时
[0, -1; -1, 0]
为什么八度音阶在自动广播中如此区分?为什么eye(2)
不等于[1, 0; 0, 1]
?
注意:在Matlab R2016a中,我没有自动广播功能,因此只能使用bsxfun(@minus,eye(2),[1; 1])
,这是一致的,因此不易混淆。
对此的技术答案(至少以八度为单位)是eye(2)不会产生与[1,0; 0,1]相同的类型;它产生一个内存有效的对角矩阵,并且八度音阶没有为对角矩阵类型(yet *)实现可广播的减号函数。
> typeinfo([1,0;0,1])
ans = matrix
> typeinfo(eye(2))
ans = diagonal matrix
> diag([1,1])- [1;1]
% error: operator -: nonconformant arguments (op1 is 2x2, op2 is 2x1)
> full( diag([1,1]) ) - [1;1]
% works
实际上,如果您尝试广播等效的稀疏矩阵,则会遇到相同的问题:
> sparse([1,0;0,1]) - [1;1]
%error: operator -: nonconformant arguments (op1 is 2x2, op2 is 2x1)
[如果您要进行广播而不将其转换为完整的矩阵(例如,通过full(eye(2)) - [1; 1]
),则可以使用bsxfun
,这是旨在显式执行广播的功能。
已经说过,bsxfun的输出是一个普通矩阵,这意味着如果您先从特殊类型中'收集'full
矩阵,然后按预期使用广播,您将得到相同的结果,因此我怀疑在这种情况下,使用bsxfun可以提高效率。相反,如果将bsxfun与计算成本很高的反模式(例如bsxfun( @(x,y) x-y, eye(2), [1;1] )
)一起使用,则可能会导致性能下降(这是很常见的现象,但值得庆幸的是,您所做的并不是)。
*话虽如此,如果这不是一个错误,那么它肯定是一个功能。值得在八度Bugtracker上打开一张票(如果还没有的话!)。
在R2016b中,Matlab更改了隐式扩展