Первый ответ хороший, но я бы порекомендовал до не используя arrayfun
. Есть более красноречивые способы делать то, что вы просите. Используйте ismember
в сочетании с all
, затем проиндексируйте в матрицу A
, когда закончите. В основном, ваша проблема заключается в том, чтобы определить, имеет ли строка все значения, найденные в x
, и игнорирование нулевых значений. В этом случае мы можем найти все значения в матрице A
, которые фактически равны нулю, а затем использовать это для увеличения нашего результата.
Использование A
как первый вход и x
как второй вход возвращает матрицу того же размера, как и A
, что говорит вам, является ли элемент в A
находится в x
. Если вы хотите проверить, есть ли все элементы в матрице A
для строки в x
, проверьте, все элементов в строке 1
. Кроме того, найдите все элементы, которые равны нулю, затем с выходом ismember
установите их равными 1. Это можно сделать с помощью logical
OR. После этого вы можете использовать all
и проверить каждую строку независимо, используя вывод ismember
в качестве первого ввода в all
и установив второй аргумент в 2. Затем будут возвращены все строки в матрице A
, где любой столбец находится в x
игнорируя любые значения, которые равны нулю для строки в A
что то, что вы ищете:
A = [1 2; 3 0; 4 0];
x = [1 2 3];
mask = ismember(A, x);
ind = all(mask | A == 0, 2);
Я также в пользу острот.Мы можем объединить это в одну строку кода:
ind = all(ismember(A, x) | A == 0, 2);
Даже короче просто инвертировать A
. Все нулевые элементы становятся true
и false
иначе:
ind = all(ismember(A, x) | ~A, 2);
ind
бы, таким образом:
>> ind
ind =
3×1 logical array
1
1
0
Так как вы хотите, фактические индексы строк, вы можете просто использовать find
на вершине этого:
>> find(ind)
ans =
1
2
Чтобы проверить, давайте воспользуемся вашим вторым примером в ваших комментариях:
>> A = [1 2;3 5;4 0];
>> x = [1 2 3];
>> ind = all(ismember(A, x) | ~A, 2)
ind =
3×1 logical array
1
0
0
>> find(ind)
ans =
1
Я думаю, что это просто выводит первую строку A, а не индексы строк 1 и 2. – jonem
@jonem А вы хотите индексы строк? Хорошо, позвольте мне изменить. – rayryeng
Да, мне было тяжело, потому что вся функция возвращает нуль для строки 2 из-за нулевого элемента в элементе (2,2), хотя я не хочу включать элемент (2,2) в сравнении. – jonem