Функция для 'содержит ли матрица значение X?' - PullRequest
67 голосов
/ 16 декабря 2009

Есть ли встроенная функция MATLAB, чтобы узнать, содержит ли матрица определенное значение? (аля PHP in_array())

Ответы [ 4 ]

98 голосов
/ 16 декабря 2009

Много способов сделать это. ismember - это первое, что приходит на ум, так как это действие, которое вы хотите предпринять. Таким образом

X = primes(20);
ismember([15 17],X)
ans =
      0    1

Поскольку 15 не простое число, а 17 - это то, что ismember хорошо сработало здесь.

Конечно, найти (или любой) также будет работать. Но они не векторизованы в том смысле, в каком они были. Мы можем проверить, находится ли 15 в наборе, представленном X, но для проверки обоих этих чисел потребуется цикл или последовательные тесты.

~isempty(find(X == 15))
~isempty(find(X == 17))

или

any(X == 15)
any(X == 17)

Наконец, я хотел бы отметить, что тесты на точные значения опасны, если числа могут быть истинными числами с плавающей точкой. Тесты на целочисленные значения, как я показал, просты. Но тесты с числами с плавающей запятой обычно должны использовать допуск.

tol = 10*eps;
any(abs(X - 3.1415926535897932384) <= tol)
11 голосов
/ 16 декабря 2009

вы можете сделать:

A = randi(10, [3 4]);      %# a random matrix
any( A(:)==5 )             %# does A contain 5?

Чтобы сделать все вышеперечисленное векторизованным способом, используйте:

any( bsxfun(@eq, A(:), [5 7 11] )

или как @ woodchips предлагает:

ismember([5 7 11], A)
3 голосов
/ 07 января 2014

Если вам нужно проверить, находятся ли элементы одного вектора в другом, лучшим решением будет ismember, как указано в других ответах.

ismember([15 17],primes(20))

Однако, когда вы имеете дело с числами с плавающей запятой или просто хотите иметь близкие совпадения (+ - 1000 также возможно), лучшим решением, которое я нашел, является довольно эффективная Отправка файлового обмена: ismemberf

Это дает очень практический пример:

[tf, loc]=ismember(0.3, 0:0.1:1) % returns false 
[tf, loc]=ismemberf(0.3, 0:0.1:1) % returns true

Хотя допуск по умолчанию обычно должен быть достаточным, он обеспечивает большую гибкость

ismemberf(9.99, 0:10:100) % returns false
ismemberf(9.99, 0:10:100,'tol',0.05) % returns true
2 голосов
/ 07 марта 2015

Для данных с плавающей запятой вы можете использовать новую ismembertol функцию , которая вычисляет членство в наборе с заданным допуском . Это похоже на функцию ismemberf, найденную в File Exchange, за исключением того, что она теперь встроена в MATLAB. Пример:

>> pi_estimate = 3.14159;
>> abs(pi_estimate - pi)
ans =
   5.3590e-08
>> tol = 1e-7;
>> ismembertol(pi,pi_estimate,tol)
ans =
     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...