В этом примере показано, как фильтровать элементы массива путем применения условий к массиву. Например, можно изучить четные элементы в матрице, найти местоположение всех 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
) значения.
and
| find
| isnan
| Logical Operators: Short Circuit
| nan
| not
| or
| xor