Кто-либо может сказать мне, если существует путь (в MATLAB), чтобы проверить, равно ли определенное значение какому-либо из значений, сохраненных в другом массиве?
Путем я намереваюсь использовать его, должен проверить, равен ли индекс элемента в одной матрице значениям, сохраненным в другом массиве (где сохраненные значения являются индексами элементов, которые соответствуют определенным критериям).
Так, если индексы элементов, которые соответствуют критериям, хранятся в матрице ниже:
criteriacheck = [3 5 6 8 20];
Прохождение через основного массива (названный array
) и проверяя, соответствует ли индекс:
for i = 1:numel(array)
if i == 'Any value stored in criteriacheck'
%# "Do this"
end
end
У кого-либо есть идея того, как я мог бы пойти об этом?
Примечание. Хотя в этом ответе не рассматривается вопрос в заголовке, он решает более фундаментальную проблему с тем, как вы разрабатываете цикл for ( решение которого отменяет необходимость делать то, что вы просите в заголовке). ;)
Исходя из написанного вами цикла for, ваш массив критериев проверки
выглядит как набор индексов в массив
, и для каждого из этих индексированных элементов вы хотите сделать некоторые вычисления. Если это так, то вот альтернативный способ создания цикла for:
for i = criteriacheck
%# Do something with array(i)
end
Будет выполнен цикл по всем значениям в проверка критериев
, устанавливая i
для каждого последующего значения (т. Е. 3, 5, 6, 8 и 20 в вашем примере).Это более компактно и эффективно, чем перебирать каждый элемент массива
и проверять, входит ли индекс в проверку критериев
.
ПРИМЕЧАНИЕ: Как указывает Джонас, вы хотите убедиться, что critcheck
- это вектор-строка для правильного функционирования цикла for. Вы можете преобразовать любую матрицу в вектор-строку, следуя за ней синтаксисом (:) '
, который преобразует ее в вектор-столбец , а затем преобразует его в вектор-строка:
for i = criteriacheck(:)'
...
Отличный ответ, ранее данный @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)
вы можете использовать команду поиска
if (~isempty(find(criteriacheck == i)))
% do something
end