【发布时间】:2019-12-23 08:37:13
【问题描述】:
我想从 Octave(版本 4.4.1)中单位矩阵的每一列中减去一个向量 v,例如v = [1; 1].
为什么自动广播对命令eye 不起作用?
eye(2) - [1; 1] 说
error: operator -: nonconformant arguments (op1 is 2x2, op2 is 1x2)
而bsxfun(@minus,eye(2),[1; 1]) 和[1, 0; 0, 1] - [1; 1] 都产生了
[0, -1; -1, 0]
为什么 Octave 在自动广播中做出这种区分?为什么eye(2) 不等于[1, 0; 0, 1]?
注意:在Matlab R2016a中,我没有自动广播,所以我只能使用bsxfun(@minus,eye(2),[1; 1]),这样是一致的,不会那么混乱。
【问题讨论】:
-
输入
isequal([1, 0; 0, 1], eye(2)),无论他们是否相等,您都会得到答案 -
我刚刚在工作中检查了 matlab (R2018b),可以确认
eye(2)-[1;1]产生了预期的广播结果。此外,对于任何感兴趣的人(参考下面我的回答),在 matlab 中,eye(2)返回一个标准的完整矩阵,而不是像 Octave 中的内存优化对象。 -
@LuisMendo 在 matlab 中,是的。它们都是完整的矩阵。然而,在八度音程中,情况并非如此。第一个创建一个“矩阵”类型的对象(双精度类),而后者创建一个“对角矩阵”类型的对象(双精度类)。创建两者并比较 matlab 和 octave 中的“whos”以了解我的意思。另请参阅下面的我的答案。
typeinfo函数仅存在于 octave 中,但据我了解,它指的是其他内置对象的类型(而不是用户创建的类,这是一种不同的机制),并暗示这些类型是如何实现的引擎盖。 -
@Tasos 啊,我明白了。我对 Octave 不太熟悉,但我记得冒号表达式创建“范围”对象而不是向量的类似内容
-
@DaveFar:DaveFar 感谢您的补充,但是,我已经恢复了这一点,因为
[ <specialised matrix> ]语法不能保证将专用矩阵转换为其正常(即“完整”)版本。执行此操作的适当函数是full函数(例如full(eye(2))、full(sparse[1,0;0,1]))、full(1:10)等
标签: matlab matrix octave broadcast