1x1矩阵的第一个元素与1x1矩阵的所有元素之间的差异

时间:2013-09-23 12:50:07

标签: matlab matrix

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 个答案:

答案 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)也会给你1size(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来说,使用与大矩阵一致的不同结果,对于单个元素矩阵总是做同样的事情,这是一个非常合理的设计选择。