根据行列子得到满足一定条件的逻辑矩阵
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
我有一个大小为 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