Main Content

查找符合条件的数组元素

此示例说明如何通过对数组应用条件来过滤数组元素。例如,您可以检查矩阵中的偶数元素、查找多维数组中所有 0 值的位置,或者替换数据中的 NaN 值。您可以通过组合使用关系运算符和逻辑运算符来执行这些任务。关系运算符(><>=<===~=)将不同的条件应用于数组,您可以使用逻辑运算符 andornot(分别用符号 &|~ 表示)将它们连接起来,从而应用多个条件。

应用单个条件

要应用单个条件,请首先创建一个 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) 使用线性索引。

应用多个条件

您可以使用逻辑 andornot 运算符将任意多个条件应用于一个数组;条件的数量并不局限于一个或两个。

首先,使用逻辑 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) 的矩阵。

另请参阅

| | | | | | | |