Нахождение, равно ли значение значению какого-либо элемента массива в MATLAB

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

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

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

criteriacheck = [3 5 6 8 20];

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

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

У кого-либо есть идея того, как я мог бы пойти об этом?

7
задан gnovice 23 May 2017 в 03:29
поделиться

3 ответа

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

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

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

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

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

for i = criteriacheck(:)'
...
3
ответ дан 6 December 2019 в 06:49
поделиться

Отличный ответ, ранее данный @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)
19
ответ дан 6 December 2019 в 06:49
поделиться

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

if (~isempty(find(criteriacheck == i)))
    % do something
end
3
ответ дан 6 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: