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

В этом примере показано, как фильтровать элементы массива путем применения условий к массиву. Например, можно изучить четные элементы в матрице, найти местоположение всех 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. Использование логического оператора NOT, ~, преобразует матрицу 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 с нулями и применить логический оператор 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) значения.

См. также

| | | | | | |