在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
有谁知道这里发生了什么?为什么一项任务有效,另一项没有?
答案 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([],:)
a([],:) = a2([],:)
会出现预期的尺寸不匹配错误。a([],:) = b(:)
不会抛出错误......对我来说不是预期(:)
也不会抛出错误......这也很奇怪,除非我们可以假设{:}
操作返回一个逗号分隔的列表,就像a([],:) = zeros(0,0)
a([],:) = zeros(0,2)
a([],:) = zeros(0,3)
a([],:) = zeros(0,4)
一样(尽管我知道情况并非如此)??? 这些案件似乎与我不一致。
我们可以扩展案例2:
{{1}}
只有他第一个案例抛出错误而其他3个被Matlab接受。看起来这个答案只是在创造更多问题:/