为什么我不能在Matlab中使用矢量上的短路逻辑运算符?

时间:2011-12-15 04:03:56

标签: matlab

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

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

有人可以提供帮助吗?

2 个答案:

答案 0 :(得分:2)

快捷操作符仅适用于标量。短线运营商的观点是,除非需要,否则不对RHS进行评估。因此,在以下示例中,永远不会评估A==2

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

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

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

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

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

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

无论如何,我认为你的if-clauses也是错误的。尝试:

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

答案 1 :(得分:1)

你不能在matlab中使用数组上的短路操作。 如果你考虑一下,这是非常重要的。如果第一个操作数导致表达式为真/假,则无论其他操作数如何,短路运算符都会停止计算。但这在矢量中并非如此。

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