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

标签 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-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 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/

相关文章:

java - 空指针访问

python - 有效检查 numpy ndarray 值是否严格增加

c - matlab 上的旧 gcc 编译器

python - 将 python/numpy "A.argmin(axis=-1)"转换为等效的 matlab 表达式

python - 为什么 numpy.linalg.solve() 提供比 numpy.linalg.inv() 更精确的矩阵求逆?

matrix - 如何在 Keras 中实现矩阵乘法?

c - 矩阵列相乘

matlab - 如何存储几百组生成的向量,并在以后提取和观察它们的内容?

python - 相当于 MATLAB 稀疏函数的 numpy/scipy

matlab - 等值面函数 MATLAB 用法