【问题标题】:Difference between first element of 1x1 matrix and all elements of 1x1 matrix1x1 矩阵的第一个元素与 1x1 矩阵的所有元素之间的差异
【发布时间】:2013-09-23 12:50:06
【问题描述】:

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(:,:) = []

看到这个后我的问题是:

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

【问题讨论】:

  • 您只是感兴趣,还是对您来说这是一个实际问题?
  • @DennisJaheruddin 你应该在 TMW 的 QA 团队工作 :)
  • @SamRoberts 问题why 主要是出于兴趣,但尤其是第一种情况和第四种情况之间的差异让我担心我的代码的健壮性。因此,这不仅是一个问题,也是一个警告。
  • @DennisJaheruddin 我想你的意思是z(1,:) = []; 最后一个案例? z(:,1) = []; 给了我一个空的 1×0 矩阵
  • @Dan 正确,已修复!

标签: matlab matrix


【解决方案1】:

这似乎是一种一致性。

让我们考虑一个更大的矩阵,看看行为是否与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 @ 987654346@)

案例 3:

X(1,:) = []

这很简单,删除第一行,所以现在我们有一个n-1-by-m 矩阵。所以3-by-3 变成2-by-3 所以我很高兴1-by-1 变成0-by-1这个案例。请注意,X(:,1) = [] 也以类似的方式保持一致。

案例 4:

X(:) = []

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

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

【讨论】:

  • 错字:case 3 应该是X(1,:)=[] 与描述一致
  • 我认为这是我第一次看到X(:)X([1:numel(X)]') 之间的功能差异(尝试将[] 分配给它们并比较结果)。我猜X(:) 不一定会线性化。
猜你喜欢
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多