Нахождение значения равно значению любого элемента массива в MATLAB - PullRequest
7 голосов
/ 14 марта 2010

Может кто-нибудь сказать мне, есть ли способ (в MATLAB) проверить, равно ли определенное значение любому из значений, хранящихся в другом массиве?

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

Таким образом, если индексы элементов, которые соответствуют критериям, хранятся в матрице ниже:

criteriacheck = [3 5 6 8 20];

Проходя через основной массив (называемый array) и проверяя, совпадает ли индекс:

for i = 1:numel(array)
  if i == 'Any value stored in criteriacheck'
    %# "Do this"
  end
end

Кто-нибудь имеет представление о том, как я могу поступить об этом?

Ответы [ 5 ]

19 голосов
/ 14 марта 2010

Превосходный ответ, который ранее дал @ woodchips , также применим и здесь:

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

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

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

Конечно, find (или любой) также будет работать. Но они не векторизованы в том смысле, в каком они были. Мы можем проверить, находится ли 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)
3 голосов
/ 14 марта 2010

Примечание. Хотя этот ответ не затрагивает вопрос, указанный в заголовке, он затрагивает более фундаментальную проблему, связанную с тем, как вы разрабатываете цикл for (решение которого сводит на нет необходимость делать то, что вы просите в название). ;)

Исходя из написанного цикла for, ваш массив criteriacheck представляется набором индексов в array, и для каждого из этих индексированных элементов вы хотите выполнить некоторые вычисления. Если это так, вот альтернативный способ разработки цикла for:

for i = criteriacheck
  %# Do something with array(i)
end

Это зациклит все значения в criteriacheck, установив i для каждого последующего значения (т. Е. 3, 5, 6, 8 и 20 в вашем примере). Это более компактно и эффективно, чем зацикливание на каждом элементе array и проверка, находится ли индекс в criteriacheck.

ПРИМЕЧАНИЕ: Как указывает Джонас, вы должны убедиться, что criteriacheck - это вектор строки для цикла for для правильной работы. Вы можете сформировать любую матрицу в вектор-строку, следуя ей с помощью синтаксиса (:)', который преобразует ее в вектор-столбец , а затем транспонирует ее в вектор-строку:

for i = criteriacheck(:)'
...
3 голосов
/ 14 марта 2010

вы можете использовать команду поиска

if (~isempty(find(criteriacheck == i)))
    % do something
end
1 голос
/ 06 ноября 2012

Исходный вопрос «Может кто-нибудь сказать мне, есть ли способ (в MATLAB) проверить, равно ли определенное значение любому из значений, хранящихся в другом массиве?»может быть решена без какой-либо петли.

Просто используйте функцию setdiff .

0 голосов
/ 10 апреля 2013

Я думаю, что функция INTERSECT - это то, что вы ищете.

C = intersect (A, B) возвращает значения, общие для A и B. значения C расположены в отсортированном порядке.

http://www.mathworks.de/de/help/matlab/ref/intersect.html

На вопрос if i == 'Any value stored in criteriacheck также можно ответить таким образом, если вы считаете i тривиальной матрицей. Тем не менее, вы, вероятно, лучше с any(i==criteriacheck)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...