【问题标题】:MATLAB - Equivalent logical indexing leading to two different resultsMATLAB - 导致两个不同结果的等效逻辑索引
【发布时间】:2017-06-28 01:28:11
【问题描述】:

我正在编写一段代码以通过在线评分器提交,如下所示。 B 是某个给定的数组,填充了从 1 到 K 的任何/所有整数,我想提取矩阵 X 的相应逻辑索引并对这些元素执行一些操作,以放入返回数组中:

for i = 1:K

   A = X(B == i, :);
   returnArr(i, :) = sum(A) / length(A);

end

这根本没有通过评分,所以我想改变我的方法,而是首先使用“find”函数间接索引数组 X,如下所示:

for i = 1:K

    C = find(B == i);
    returnArr(i,:) = sum(X(C,:)) / length(C);

end

令我惊讶的是,这段代码毫无问题地通过了评分器。我知道评分者之间存在大量差异,一个人处理特定功能的方式可能与另一个不同,但从 MATLAB 功能/编码的角度来看,我在这两种方法之间的差异方面遗漏了什么?谢谢!

【问题讨论】:

  • 我的第一个想法是length(A)length(C) 可能会返回不同的结果,因为A 是一个矩阵。 AC 的大小是多少?
  • 请参阅minimal reproducible example。你对BK 有解释,然后突然拉出X。提供一个完整的例子,你期望的结果,以及你实际获得的结果。这些方法是不等价的。我想您可以通过查看它们自己来解释这些方法之间的差异......

标签: arrays matlab matrix matrix-indexing


【解决方案1】:

我认为问题在于:

length(C) == sum(B == i)

同时

length(A) == max([sum(B == i) , size(X , 2)])

换句话说,要获得第二个示例与第一个示例相同的结果,您应该这样修改它:

A = X(B == i , :);
returnArr(i, :) = sum(A) / size(A,1);

函数length返回数组最大维度的长度

【讨论】:

  • 我支持这个答案,因为它指出了差异的来源。另外,请小心使用 sum @David。如果您不指定维度参数(第二个),sum 的行为将根据A 的大小而有所不同:多于一行 -> 对列求和,结果将是一个 1×N 向量。一行 -> 对行求和,结果是一个标量。我不确定您的预期行为是什么。
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多