7

在找到了如何处理空结构的一些逻辑之后,我想检查一下它是如何推广到矩阵的。

在这里,我注意到以下内容:

如果您有一个 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(:,:) = []

看到这个后,我的问题是:

为什么以不同的方式分配给同一事物会导致四种不同的结果?

4

1 回答 1

9

这似乎是一个一致性的事情。

让我们考虑一个更大的矩阵,看看行为是否与1逐个1矩阵一致(剧透警报,在我看来):

X = rand(3);

情况1:

X(1,1) = []

这没有任何意义。我们无法保留形状并删除单个元素,因此会出现尺寸不匹配错误,这与您的观察结果一致。维度不匹配也是一个适当的错误,因为我们试图将一个矩阵强制0转换0为一个11。(顺便说一句,你说size(z)给了你,[1 1]size(z, 3)也给了你1,等等,size(z,7)所以实际上它是一个[1 1 1 ...矩阵)

案例二:

X(1) = []

这导致了X这样size(X)的结果,如果您指定线性1索引8,MATLAB 似乎很乐意线性化您的矩阵。这对我来说很有意义,并且再次与1-by- 1case 一致,因为它导致了1-by-numel(X)-1矩阵(即1-by- 0for X = 1

案例3:

X(1,:) = []

这很简单,删除第一行,所以现在我们有一个n-1逐个m矩阵。所以a 3-by-3变成了2-by- 3,所以我很高兴在这种情况下a 1-by-1变成了0-by- 。1请注意,这X(:,1) = []也是类似的一致。

案例4:

X(:) = []

这很有意义,重新分配整个矩阵。没有问题。没有歧义。

因此,即使可以肯定,它们都可以明确表示同一件事。我认为对于 MATLAB 来说,与更大的矩阵一致的不同结果比对单个元素矩阵总是做同样的事情是一个完全合理的设计选择。

于 2013-09-23T13:06:48.097 回答