Уменьшите логические массивы до одного значения

В этом примере показано, как использовать any и all функции для сокращения всего массива до одного логического значения.

The any и all функции являются естественными расширениями логического | (OR) и & (И) операторы, соответственно. Однако, вместо того, чтобы сравнивать только два элемента, any и all функции сравнивают все элементы в конкретной размерности массива. Это как если бы все эти элементы были соединены & или | операторы и any или all функции вычисляют получившиеся длинные логические выражения. Поэтому, в отличие от основных логических операторов, any и all функции уменьшают размер измерения массива, с которым они работают, так что он имеет размер 1. Это позволяет сократить количество логических значений в одно логическое условие.

Сначала создайте матрицу A который содержит случайные целые числа от 1 до 25. Установите генератор случайных чисел в состояние по умолчанию для повторяемости.

rng default
A = randi(25,5)
A = 5×5

    21     3     4     4    17
    23     7    25    11     1
     4    14    24    23    22
    23    24    13    20    24
    16    25    21    24    17

Далее используйте mod функция наряду с логическим оператором NOT, ~, для определения элементов в A ровные.

A = ~mod(A,2)
A = 5x5 logical array

   0   0   1   1   0
   0   0   0   0   0
   1   1   1   0   1
   0   1   0   1   1
   1   0   0   1   0

Получившиеся матрицы имеют значения логических 1 (true) где элемент четный, и логический 0 (false) где элемент нечетный.

Начиная с any и all функции сокращают размерность, с которой они работают, до размера 1, обычно требуется два приложения одной из функций, чтобы уменьшить матрицу 2-D в одно логическое условие, такое как any(any(A)). Однако, если вы используете обозначение A(:) для учета всех элементов A в качестве одного вектора-столбца можно использовать any(A(:)) получить ту же логическую информацию без вложения вызовов функций.

Определите, есть ли элементы в A ровные.

any(A(:))
ans = logical
   1

Вы можете выполнить логические и реляционные сравнения в рамках вызова функции к any или all. Это облегчает быстрое тестирование массива на наличие различных свойств.

Определите, все ли элементы в A нечетные.

all(~A(:))
ans = logical
   0

Определите, являются ли какие-либо основные или супер диагональные элементы в A ровные. Поскольку векторы вернулись по diag(A) и diag(A,1) не те же размеры, вам сначала нужно уменьшить каждую диагональ до одного скалярного логического условия, прежде чем сравнивать их. Можно использовать оператор короткая схема || для выполнения сравнения, поскольку если какие-либо элементы в первой диагонали даже являются, то все выражение вычисляется как true независимо от того, что появляется на правой стороне оператора.

any(diag(A)) || any(diag(A,1))
ans = logical
   1

См. также

| | | | |