В этом примере показано, как отфильтровать элементы массива путем применения условий к массиву. Например, можно исследовать ровные элементы в матрице, найти местоположение всего 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 ложь) состояние, чтобы указать, ли соответствующий элемент A выполняет условие A < 9. Например, A(1,1) 13, так B(1,1) логический 0 ложь). Однако 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 ложь) вместо 10-х. Логическая операция NOT, ~A, преобразует числовой массив в логический массив, таким образом что A&C возвращает матрицу логического 0 ложь) значения и A|C возвращает матрицу логического 1 TRUEЗначения.
and | find | isnan | Logical Operators: Short Circuit | nan | not | or | xor