根据行列子得到满足一定条件的逻辑矩阵

Get a logical matrix which satisfies certain conditions based on row and column sub

我有一个大小为 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 > j+1) | i == 1 | i == 2

预期输出:

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

这里有两种条件,一种是关于元素位置的条件,另一种是关于元素值的条件。我要做的是创建 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

我想出了一个使用 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