eye(2)与`[1,0; 0,1]`在自动广播中

问题描述 投票:2回答:2

我想从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]),这是一致的,因此不易混淆。

matlab matrix octave broadcast
2个回答
5
投票

对此的技术答案(至少以八度为单位)是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上打开一张票(如果还没有的话!)。


-1
投票

在R2016b中,Matlab更改了隐式扩展

© www.soinside.com 2019 - 2024. All rights reserved.