在 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(:,:) = []
看到这个之后我的问题是:
为什么以不同的方式分配给同一事物会导致四种不同的结果?
最佳答案
这似乎只是一个一致性问题。
让我们考虑一个更大的矩阵,看看行为是否与 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 1 1 ...
矩阵)
案例 2:
X(1) = []
这导致 X
使得 size(X)
为 1
-by-8
,MATLAB如果指定线性索引,似乎很乐意将矩阵线性化。这对我来说很有意义,并且再次与 1
-by-1
情况一致,因为它导致 1
-by-numel(X)-1
矩阵(即 1
-by-0
for X = 1
)
案例三:
X(1,:) = []
这很简单,删除第一行,所以现在我们有一个 n-1
-by-m
矩阵。所以 3
-by-3
变成了 2
-by-3
所以我很高兴 在这种情况下,code>1
-by-1
变成了 0
-by-1
。请注意,X(:,1) = []
也以类似的方式保持一致。
案例 4:
X(:) = []
这个才有意义,重新赋值整个矩阵。没有问题。没有歧义。
所以即使是肯定的,它们都可以明确表示同一件事。我认为对于 MATLAB 来说,与对单个元素矩阵总是做同样的事情相比,获得与更大矩阵一致的不同结果是一个完全合理的设计选择。
关于matlab - 1x1 矩阵的第一个元素与 1x1 矩阵的所有元素之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18959702/