在Matlab中将空矩阵分配给空子矩阵

时间:2014-06-19 09:49:54

标签: matlab matrix

在Matlab中运行以下代码时:

a = magic(3);
b = [];

a([],:) = [] % works
a([],:) = b  % doesn't work

使用变量'b'时出错:

>> tmp
a =
     8     1     6
     3     5     7
     4     9     2
Subscripted assignment dimension mismatch.
Error in tmp (line 5)
a([],:) = b 

有谁知道这里发生了什么?为什么一项任务有效,另一项没有?

1 个答案:

答案 0 :(得分:3)

这是我对Matlab行为的原因的猜测:

我认为分配给[]可以被视为特殊运算符,即a(1,:) = []基本上会删除a的第一行。因此即使size(a(1,:))size([])不同,我认为Matlab解释器知道这种特殊情况不是赋值。

a(1,:) = b b=[]a([],:) = b会给您下标维度不匹配时。我认为这是正确的行为,因为在这种情况下你正在分配,并且你试图将0-by-0分配给1-by-3,这是一个维度不匹配。同样适用于a = magic(3); a2 = magic(4); b = []; ,你试图将0乘0放入0乘3的空间,这又是一个不匹配。

总而言之,第二种情况是赋值运算符,因此错误是有意义的。第一种情况是特殊的删除操作符,因此没有错误。

我没有任何参考文献(this is all I could find in the docs,但它并没有涵盖所有内容)


但是我不认为这解释了所有的行为,从评论中提出了一些例子:

假设:

a([],:) + a2([],:)
  1. a([],:) = a2([],:)会出现预期的尺寸不匹配错误。
  2. a([],:) = b(:)不会抛出错误......对我来说不是预期
  3. (:)也不会抛出错误......这也很奇怪,除非我们可以假设{:}操作返回一个逗号分隔的列表,就像a([],:) = zeros(0,0) a([],:) = zeros(0,2) a([],:) = zeros(0,3) a([],:) = zeros(0,4) 一样(尽管我知道情况并非如此)???
  4. 这些案件似乎与我不一致。

    我们可以扩展案例2:

    {{1}}

    只有他第一个案例抛出错误而其他3个被Matlab接受。看起来这个答案只是在创造更多问题:/