【问题标题】:Logical statement where all matrix elements must be greater than those in another matrix所有矩阵元素必须大于另一个矩阵中的元素的逻辑语句
【发布时间】:2016-03-28 21:10:33
【问题描述】:

我正在寻找一种方法来测试矩阵的 所有 元素是否大于或等于另一个矩阵中的相应索引值,如果不停止评估。这是用于设置值下限的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的长度,则总和将小于@的长度987654334@。我一直在想有一个简单而更优雅的解决方案,我忽略了它,如果有任何想法,我将不胜感激。谢谢!

【问题讨论】:

  • 看看all(A<=B)any 相当于测试一个非零条目。对多维矩阵使用all(A(:)<=B(:))
  • 顺便说一句,C[i,j] 等不是有效的 MATLAB 语法。使用实际代码对大家更有帮助...
  • 谢谢!将删除 [i,j] 部分。只是想强调我正在寻找一个元素明智的答案。

标签: matlab logical-operators


【解决方案1】:

MATLAB 有一个用于执行此操作的内置函数all。您可以在逻辑矩阵上使用它来确定所有值是否为真。在您的情况下,您将传递逻辑矩阵:B >= A

A = [4,5,6,7];
B = [7,8,9,10];

all(B(:) >= A(:))

    1

请注意,我在上面使用了(:),它确保AB 在执行比较之前都是列向量。这样,它们可以是任意维度,all 的结果将始终是标量。

在您使用它的同时,您还可以查看any

【讨论】:

  • 非常感谢,这正是我想要的。我浏览了 MATLAB 逻辑运算符文档,但找不到。谢谢!
  • @metathor 如果它解决了您的问题,请考虑接受它作为答案。
【解决方案2】:

您确实必须依赖逻辑索引。要检查给定矩阵B 的元素是否大于或等于另一个给定矩阵A 中的相应索引值,您可以执行以下操作:

if (sum(sum(B>=A))==numel(A))
    %enter if body here
end

如果B(i,j)>=A(i,j),语句B>=A 将返回一个逻辑矩阵,1 在位置(i,j)。然后,您将此类矩阵中的所有 1s 相加,然后检查此类总和是否等于 A(或 B)中的元素数(numel())。

在你的例子中。给定

A=[4 5 6 7];
B=[7 8 9 10];

语句B>=A 将返回

ans =

     1     1     1     1

因为B 中的所有元素都大于A 中的元素。对这个向量求和,你会得到 4。和 (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()的快速解释到此结束。

【讨论】:

  • 很好,感谢您的详细回答。这绝对是对我所做的改进。
【解决方案3】:

我认为 优雅 解决方案是指更有效的解决方案。 让我们创建测试数据:

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 秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多