Как я могу использовать Any() в многомерном массиве?
-
22-08-2019 - |
Вопрос
Я тестирую массив логических операций произвольного размера и произвольного размера, и мне хотелось бы выяснить, любой или несколько из них верны. any()
работает только с одним измерением одновременно, как и sum()
.Я знаю, что могу проверить количество измерений и повторить any()
пока не получу единого ответа, но мне бы хотелось более быстрого и, честно говоря, более элегантного подхода.
Идеи?
Я использую 2009a (думаю, R17, говоря старым языком).
Решение
Если ваши данные находятся в матрице А, попробуй это:
anyAreTrue = any(A(:));
РЕДАКТИРОВАТЬ: Чтобы объяснить немного больше для тех, кто не знаком с синтаксисом, А(:) использует оператор двоеточия взять все содержимое массива А, независимо от размеров, и преобразуйте их в один вектор-столбец (размера numel(A)-by-1).Только один звонок на ЛЮБОЙ необходим для работы с результирующим вектором-столбцом.
Другие советы
Как уже отмечалось, правильное решение — преобразовать результат в вектор.Тогда любой даст желаемый результат.Таким образом,
любой(А(:))
дает глобальный результат, истинный, если какой-либо из элементов numel(A) был истинным.Вы также могли бы использовать
любой (изменить форму (A, [], 1))
который явно использует оператор изменения формы.Если вы не хотите выполнять дополнительный шаг по преобразованию матриц в векторы для их применения, другой подход — написать собственную функцию.Например, вот функция, которая сделает это за вас:
======================
результат функции = myany(A)
% определяет, был ли вообще какой-либо элемент в A ненулевым
результат = любой(A(:));
======================
Сохраните это как m-файл в пути поиска.Прелесть MATLAB (верно для любого языка программирования) в том, что он полностью расширяем.Если есть какая-то возможность, которую вы хотели бы иметь, просто напишите небольшую идиому, которая ее реализует.Если вы будете делать это достаточно часто, вы настроите среду в соответствии со своими потребностями.