查找符合条件的数组元素
此示例说明如何通过对数组应用条件来过滤数组元素。例如,您可以检查矩阵中的偶数元素、查找多维数组中所有 0 值的位置,或者替换数据中的 NaN
值。您可以通过组合使用关系运算符和逻辑运算符来执行这些任务。关系运算符(>
、<
、>=
、<=
、==
、~=
)将不同的条件应用于数组,您可以使用逻辑运算符 and
、or
和 not
(分别用符号 &
、|
和 ~
表示)将它们连接起来,从而应用多个条件。
应用单个条件
要应用单个条件,请首先创建一个 5×5 矩阵,该矩阵包含介于 1 和 15 之间的随机整数。将随机数生成器重置为默认状态,以实现可再现性。
rng default
A = randi(15,5)
A = 5×5
13 2 3 3 10
14 5 15 7 1
2 9 15 14 13
14 15 8 12 15
10 15 13 15 11
使用小于号关系运算符 <
确定 A
中的哪些元素小于 9。将结果存储在 B
中。
B = A < 9
B = 5x5 logical array
0 1 1 1 0
0 1 0 1 1
1 0 0 0 0
0 0 1 0 0
0 0 0 0 0
结果为一个逻辑矩阵。B
中的每个值都表示为逻辑值 1
(true
) 或逻辑值 0
(false
) 的状态,以指示 A
的对应元素是否符合条件 A < 9
。例如,A(1,1)
为 13
,因此 B(1,1)
为逻辑值 0
(false
)。但是,A(1,2)
为 2
,因此 B(1,2)
为逻辑值 1
(true
)。
虽然 B
包含有关 A
中哪些元素小于 9 的信息,但它不会指出这些元素的具体值是多少。您可以使用 B
创建 A
的索引,而不必逐元素比较这两个矩阵。
A(B)
ans = 8×1
2
2
5
3
8
3
7
1
结果为一个由 A
中小于 9 的元素组成的列向量。由于 B
为逻辑矩阵,因此该运算称为逻辑索引。在本例中,用作索引的逻辑数组与另一个数组的大小相同,但这不是必需的。有关详细信息,请参阅数组索引。
某些问题需要符合条件的数组元素的位置信息,而非其实际值。在此示例中,您可以使用 find
函数查找 A
中小于 9 的所有元素。
I = find(A < 9)
I = 8×1
3
6
7
11
14
16
17
22
结果为一个由线性索引组成的列向量。每个索引描述 A
中一个小于 9 的元素的位置,因此实际上 A(I)
与 A(B)
返回的结果相同。差别在于 A(B)
使用逻辑索引,而 A(I)
使用线性索引。
应用多个条件
您可以使用逻辑 and
、or
和 not
运算符将任意多个条件应用于一个数组;条件的数量并不局限于一个或两个。
首先,使用逻辑 and
运算符(由 &
表示)指定两个条件:元素必须小于 9 且大于 2。将这些条件指定为逻辑索引,以查看符合两个条件的元素。
A(A<9 & A>2)
ans = 5×1
5
3
8
3
7
结果为 A
中同时符合这两个条件的元素的列表。务必使用单独的语句指定每个条件,并用逻辑运算符连接起来。例如,您不能通过 A(2<A<9)
指定以上条件,因为其计算结果为 A(2<A | A<9)
。
接下来,查找 A
中小于 9 且为偶数的元素。
A(A<9 & ~mod(A,2))
ans = 3×1
2
2
8
结果为 A
中小于 9 的所有偶数元素的列表。使用逻辑 NOT 运算符 ~ 将矩阵 mod(A,2)
转换为逻辑矩阵,并在可被 2 整除的元素位置放置逻辑值 1
(true
)。
最后,查找 A
中小于 9、为偶数且不等于 2 的元素。
A(A<9 & ~mod(A,2) & A~=2)
ans = 8
结果 8 为偶数、小于 9 并且不等于 2。该元素是 A
中符合所有三个条件的唯一元素。
使用 find
函数获取等于 8 的元素(符合这些条件)的索引。
find(A<9 & ~mod(A,2) & A~=2)
ans = 14
结果指示 A(14) = 8
。
替换符合条件的值
有时,同时更改多个现有数组元素的值会很有用。将逻辑索引与简单的赋值语句一起使用,可替换数组中符合条件的值。
将 A
中大于 10 的所有值替换为数值 10。
A(A>10) = 10
A = 5×5
10 2 3 3 10
10 5 10 7 1
2 9 10 10 10
10 10 8 10 10
10 10 10 10 10
然后,将 A
中不等于 10 的所有值替换为 NaN
值。
A(A~=10) = NaN
A = 5×5
10 NaN NaN NaN 10
10 NaN 10 NaN NaN
NaN NaN 10 10 10
10 10 NaN 10 10
10 10 10 10 10
最后,将 A
中的所有 NaN
值替换为 0,并应用逻辑 NOT 运算符 ~A
。
A(isnan(A)) = 0; C = ~A
C = 5x5 logical array
0 1 1 1 0
0 1 0 1 1
1 1 0 0 0
0 0 1 0 0
0 0 0 0 0
生成的矩阵用逻辑值 1
(true
) 取代 NaN
值,用逻辑值 0
(false
) 取代 10。逻辑 NOT 运算 ~A
将数值数组转换为逻辑数组,因此 A&C
返回逻辑值 0
(false
) 的矩阵,A|C
返回逻辑值 1
(true
) 的矩阵。
另请参阅
nan
| Short-Circuit
AND
| Short-Circuit
OR
| isnan
| find
| and
| or
| xor
| not