【问题标题】:Get a logical matrix which satisfies certain conditions based on row and column sub根据行列子获取满足一定条件的逻辑矩阵
【发布时间】:2015-04-30 05:34:03
【问题描述】:

我有一个大小为5x7 的矩阵A

如果我想根据满足特定条件的元素从A 中得到一个逻辑矩阵,我可以这样做:

A = [10    47    16    33    47    11    10
    19    39    26    19    44    16    12
    32    25    26    41    28    24     9
    40    22    41    27    32    12    12
     5    23    40    18    30    43    22]

>> A > 25 | A < 10

ans =

 0     1     0     1     1     0     0
 0     1     1     0     1     0     0
 1     0     1     1     1     0     1
 1     0     1     1     1     0     0
 1     0     1     0     1     1     0

问题:如果我想为行和列索引指定条件,最好的方法是什么?

我有一个类似i(行子)的条件应该小于j(子列)。

我可以使用triu 做到这一点,但有没有使用逻辑索引的简单方法?

预期输出

0    1    1    1    1    1    1
0    0    1    1    1    1    1
0    0    0    1    1    1    1
0    0    0    0    1    1    1
0    0    0    0    0    1    1

另一个例子:

大小: 5x3

条件: (i &gt; j+1) | i == 1 | i == 2

预期输出:

 1     1     1
 1     1     1
 1     0     0
 1     1     0
 1     1     1

【问题讨论】:

    标签: matlab matrix indexing


    【解决方案1】:

    我想出了一个使用bsxfun的方法

    [rows, cols] = size(A);
    
    out = bsxfun(@(A,B) A > B+1 | A == 2 | A == 1 ,(1:rows).',1:cols);
    

    结果:

    >> out
    
    out =
    
     1     1     1     1     1     1     1
     1     1     1     1     1     1     1
     1     0     0     0     0     0     0
     1     1     0     0     0     0     0
     1     1     1     0     0     0     0
    

    【讨论】:

      【解决方案2】:

      这里有两种条件,元素位置的条件和元素值的条件。我要做的是创建 2 个矩阵,一个用于位置,一个用于值:

      loc = triu(ones(size(A)),1)
      val = A > 25 | A < 10
      

      然后使用or 组合它们:

      or(loc,val) %// or loc|val
      

      如果您想使用逻辑索引(即不是triu/tril/等),那么我认为您必须创建索引矩阵并对它们进行逻辑索引:

      [I,J]=ndgrid(1:size(A,1),1:size(A,2))
      loc=I>J+1
      

      【讨论】:

      • 感谢您的帮助。 ndgrid 方法很好。为此 +1 :)
      • 我想直接构造矩阵通常会更有效,但使用逻辑索引更容易。如果此答案解决了您的问题,请考虑接受它,以便其他人知道它已解决。
      • 有了ndgrid 和逻辑索引,我可以像loc = I &gt; J+1 | I == 1 | I == 2 一样直接获得输出。我不能一步使用tril。如果没有更好的解决方案,我会在一个小时内接受答案:)
      • 是的,那些更复杂的条件使用逻辑索引会容易得多!只要确保你没有忘记:P
      • 阅读您的回答后,我想到了使用bsxfun 解决这个问题。 :)
      猜你喜欢
      • 1970-01-01
      • 2019-03-09
      • 2020-02-11
      • 2011-07-20
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      相关资源
      最近更新 更多