我正在寻找一种方法来测试矩阵的所有元素是否大于或等于另一个矩阵中的相应索引值,如果不是停止评估。这是用于设置值下限的elseif
语句的一部分,因此作为简化示例:
下界矩阵:A = [4 5 6 7]
新值矩阵:B = [7 8 9 10]
是B>=A
然后是,接受并继续
而
下界矩阵:A = [4 5 6 7]
新值矩阵:C = [5 3 5 8]
C>=A
?然后,C
的所有元素都不大于A
,拒绝并停止
到目前为止我的解决方案有点陈词滥调:
sum(C>=A) < length(C)
?不,然后拒绝并停止
这给出了比较C>=A
中的真/假值的总和,如果C
的所有值都更大,则等于C
的长度,否则总和将是小于C
的长度。我一直在想,这是一个简单而优雅的解决方案,我可以忽视,并会对任何想法感激不尽。谢谢!
答案 0 :(得分:2)
MATLAB有一个用于执行此操作的内置函数,名为all
。您可以在逻辑矩阵上使用它来确定所有值是否都为真。在您的情况下,您将传递逻辑矩阵:B >= A
。
A = [4,5,6,7];
B = [7,8,9,10];
all(B(:) >= A(:))
1
请注意,我在上面使用了(:)
,确保在执行比较之前A
和B
都是列向量。这样,它们可以是任意维度,all
的结果将始终是标量。
当你接触它时,你也可以查看any
。
答案 1 :(得分:0)
您必须确实依赖于逻辑索引。要检查给定矩阵B
是否在另一个给定矩阵A
中具有大于或等于其对应索引值的元素,您可以执行以下操作:
if (sum(sum(B>=A))==numel(A))
%enter if body here
end
如果B>=A
,语句1
将返回(i,j)
位置B(i,j)>=A(i,j)
的逻辑矩阵。然后,您将此类矩阵中的所有1
求和,然后检查此总和是否等于numel()
(或A
)中的元素数(B
)。< / p>
在你的例子中。给定
A=[4 5 6 7];
B=[7 8 9 10];
语句B>=A
将返回
ans =
1 1 1 1
因为B
中的所有元素都比A
中的元素大。求和这个向量,你得到4. sum(4)是否等于元素数(4)?是。然后,B
中的所有元素都大于或等于A
中的元素。
注意:双sum()
使您的代码更加健壮。它确实也适用于矩阵,而不仅仅是矢量。这是因为如果你在矩阵上做sum()
,默认情况下Matlab不会返回其所有元素的总和,而是返回第一维的总和,其大小不同于1.因此,如果我们的矩阵是:
C =
8 1 6
3 5 7
4 9 2
sum(C)
将返回
ans =
15 15 15
(Matlab取每列的总和)
通过获取这种向量的总和,我们将得到所有元素的总和
这结束了有关嵌套sum()
的快速解释。
答案 2 :(得分:0)
我认为优雅的解决方案意味着更高效的解决方案。 让我们创建测试数据:
A = zeros(100000,100000); B = zeros(100000,100000);
线性循环
for i = 1:numel(A)
if A(i) < B(i)
display('different')
break
end
end
逻辑索引
if (sum(sum(B>=A))~=numel(A))
display('different')
end
当涉及最佳情况(第一个元素更小)时,循环更好:
经过的时间是0.000236秒。经过的时间是0.131802秒。
当平均情况时:
经过的时间是0.001993秒。经过的时间是0.196228秒。
但是 我们只关心最坏的情况:
B(end) = 1;
经过的时间是8.181473秒。经过的时间是0.108002秒。