Найдите элементы массива, которые удовлетворяют условию

Этот пример показывает, как отфильтровать элементы массива путем применения условий к массиву. Например, можно исследовать ровные элементы в матрице, найти местоположение всего 0s в многомерном массиве или заменить значения 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. Использование логического НЕ оператор, ~, преобразовывает матричный mod(A,2) в логическую матрицу со значением логического 1 (true), расположенный, где элемент является равномерно делимым 2.

Наконец, найдите элементы в 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

Наконец, замените все значения NaN в A с нулями и примените логическое НЕ оператор, ~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) значения.

Смотрите также

| | | | | | |