在how empty structs are dealt with中找到一些逻辑后,我想检查这是如何推广到矩阵的。
我注意到以下内容:
如果您有1x1矩阵,并分配给第一个元素。它与分配给所有元素不同。
这让我很吃惊,因为第一个元素与本案例中的所有元素完全相同。以下是我的观察:
x = 1;
y = 1;
z = 1;
x(:) = []; % Evaluates to [] as I expected
y(1) = []; % Evaluates to Empty matrix: 1-by-0, rather than []
z(1,1) = []; %Throws an error: 'Subscripted assignment dimension mismatch.' even though size(z) gives [1 1];
z(1,:) = []; % Evaluates to Empty matrix: 0-by-1, just like z(:,:) = []
看到这个后,我的问题是:
为什么以不同的方式分配同一件事会导致四种不同的结果?
答案 0 :(得分:9)
这似乎是一致性的事情。
让我们考虑一个更大的矩阵,看看行为是否与1
- by - 1
矩阵一致(扰流警报,在我看来):
X = rand(3);
案例1:
X(1,1) = []
这样做是没有意义的。我们无法保留形状并丢弃单个元素,因此我们得到尺寸不匹配误差,这与您的观察结果一致。此外,维度不匹配是一个恰当的错误,因为我们试图将0
- by - 0
矩阵强制转换为1
- by - 1
广告位。 (顺便提一下,你说size(z)
会给你[1 1]
,但size(z, 3)
也会给你1
,size(z,7)
也是如此,所以实际上它是{{1} }}}矩阵)
案例2:
[1 1 1 ...
这导致X(1) = []
X
size(X)
- { - 1}},如果指定线性索引,MATLAB似乎很乐意线性化矩阵。这对我来说很有意义,并且再次与1
- by - 8
一致,因为它会产生1
- by - 1
矩阵(即{{1} } { - 1
代表numel(X)-1
)
案例3:
1
这很简单,删除第一行,现在我们有一个0
- by - X = 1
矩阵。因此X(1,:) = []
- by - n-1
成为m
- by - 3
所以我对3
- by - 2
感到满意在这种情况下成为3
- by - 1
。请注意,1
也是类似的。
案例4:
0
这个有意义,重新分配整个矩阵。没有问题。没有歧义。
所以即使确定,他们都可以毫不含糊地指出同样的事情。我认为,对于MATLAB来说,使用与大矩阵一致的不同结果,对于单个元素矩阵总是做同样的事情,这是一个非常合理的设计选择。