【问题标题】:Why can't I use short circuit logical operators on vectors in Matlab?为什么我不能在 Matlab 中对向量使用短路逻辑运算符?
【发布时间】:2011-12-15 04:03:55
【问题描述】:

FD是一个excel文件,A是FD第5列的数据。(第5列的每个单元格包括1、2或3)

如果FD中第5列的单元格包含2或3,那么... 否则,如果 FD 中第 5 列中的单元格包括 1 或 3,则 .. ... 否则,如果第 5 列中的所有单元格仅包含 1,则 .. ...

A = FD (:,5); C = 3x3 矩阵

If A == 2 || A == 3
   Avg = sum(diag(C)./sum(C+eps,2))/2;
elseif A == 1 || A == 3
   Avg = sum(diag(C)./sum(C+eps,2))/2;
elseif A == 1 || A == 2
   Avg = sum(diag(C)./sum(C+eps,2))/2;
elseif A == 1
   Avg = C(1,1)/sum(sum(C));
elseif A == 2
   Avg = C(2,2)/sum(sum(C));
elseif A == 3
   Avg = C(3,3)/sum(sum(C));
else
   Avg = sum(diag(C)./sum(C,2))/3;
end

但是,上面的代码有错误。 ??? || 的操作数和 && 运算符必须可转换为逻辑标量值。

有人可以帮忙吗?

【问题讨论】:

  • 你得到什么错误? A=FD(:,5) 是什么意思? (什么是 FD?A 是单个数字还是向量?)此外,看起来最后 4 个 elseif 语句永远不会到达,因为它们被前两个覆盖(如果 A 是 1,2,或 3 则至少满足以下条件之一:if A==2||A==3elseif A==1||A==3,这意味着您的 elseif A==1elseif A==2elseif A==3 将永远无法到达...
  • @mathematical.coffee,刚刚编辑了问题。是的,elseif A==1...无法到达..so..我要如何修改它?
  • 学习使用all()any()

标签: matlab


【解决方案1】:

快捷运算符仅适用于标量。快捷操作符的要点是除非需要,否则不会评估 RHS。所以在下面的例子中,A==2 永远不会被评估:

A = 1;
I = A == 1 && A == 2

考虑到这一点,以下应该怎么做?

A = [1 3]
I = A == 1 && A == 2;

此外,if 子句应该具有标量条件。这段代码应该做什么?

if [true false], disp('true'), else disp('false'), end

您可能希望allany 组合矢量元素。

无论如何,我认为您的 if 子句的顺序也有误。试试:

if all(A == 1)
   Avg = C(1,1)/sum(sum(C));
elseif all(A == 2)
   Avg = C(2,2)/sum(sum(C));
elseif all(A == 3)
   Avg = C(3,3)/sum(sum(C));
elseIf all(A == 2 | A == 3)
   Avg = sum(diag(C)./sum(C+eps,2))/2;
elseif all(A == 1 | A == 3)
   Avg = sum(diag(C)./sum(C+eps,2))/2;
elseif all(A == 1 | A == 2)
   Avg = sum(diag(C)./sum(C+eps,2))/2;
else
   Avg = sum(diag(C)./sum(C,2))/3;
end

【讨论】:

  • I = A == 1 && A == 2 中,第二部分A == 2 肯定会被评估。 && (AND) 的快捷运算符仅在第一个参数的计算结果为 false 时才有效。但是,|| (OR) 语句中的第二个参数未计算,第一个参数计算为 true,如 I = A == 1 || A == 2
  • A = [1 2]时,A == 1等于true还是等于false
  • 我上面的评论指的是这个答案中给出的最上面的例子:“所以在下面的例子中,A==2 永远不会被评估:A = 1; I = A == 1 && A == 2
【解决方案2】:

您不能在 matlab 中对数组使用短路操作。 如果您考虑一下,那是很合乎逻辑的。如果第一个操作数导致表达式为真/假,而不管其他操作数如何,短路运算符将停止计算。但这在向量中是不可能的。

所以,尝试使用“|”和“&”而不是“||”和“&&”

【讨论】:

  • @rock,请为我的回答投票,如果对您有帮助,请接受。
猜你喜欢
  • 1970-01-01
  • 2018-06-07
  • 2012-02-04
  • 2015-05-13
  • 2014-06-14
  • 2012-03-05
相关资源
最近更新 更多