2015-04-14 2 views
2

Так что у меня есть два массива:Список всех форумов, используя IsMember

A:14 63 13 
     38 44 23 
     11 12 13 
     38 44 23 

    B:38 44 23 

Я пытаюсь использовать ismember вернуть индекс каждого места, где B найден в A. Все примеры, которые я нашел в Интернете, перечисляют только первое или последнее совпадение, я пытаюсь иметь индексы списка для всех значений, которые соответствуют, даже повторяющиеся. Благодаря

+0

вы ожидаете результаты '[2 4]' даже если 'B' был' [38 23 44] '? вы не знали об этом! –

ответ

6

Использование ismember с 'rows' arugment:

ismember(A, B, 'rows') 

, что приводит к логической матрице [0 1 0 1] который часто ставит тер, чем массив индексов, но если вы хотите, чтобы индексы конкретно, то просто использовать find:

find(ismember(A,B,'rows')) 

вернуть [2,4]

Обратите внимание, что этот метод будет по-прежнему работать, если B имеет несколько строк, например, B = [38 44 23; 11 12 13], он будет возвращать [0; 1; 1; 1]

5

Вы можете использовать bsxfun для comarison:

idx = find(all(bsxfun(@eq, A, B), 2)); %// only where all line matches 

Результаты с

idx = 
2 
4 
+0

Я получаю сообщение об ошибке «Не одиночные размеры двух входных массивов должны соответствовать друг другу». Это потому, что мои A и B имеют разные размеры? мой A - размер 345000x3 и B - размер 19811x3. – Dark

+0

@ Записывайте свои настройки ** разные **, чем те, что указаны в вашем вопросе! что вы ожидаете от 'A' и' B' разных размеров? Вы ищете все индексы для каждой строки 'B'? – Shai

+0

@ Dark, для этих размеров 'A' и' B' используют цикл 'for' для каждой строки' B'. output 'idx' в массив ячеек – Shai

2

Это просто улучшенная версия shai's answer для обработки нескольких строк из B

idx = find(any(all(bsxfun(@eq, A, permute(B,[3 2 1])), 2),3)); 

Образец Run:

A = [14 63 13; 
    38 44 23; 
    11 12 13; 
    38 44 23]; 

B = [38 44 23; 
    11 12 13]; 

idx = find(any(all(bsxfun(@eq, A, permute(B,[3 2 1])), 2),3)); 

>> idx 

idx = 

2 
3 
4 
3

Вы можете посмотреть в pdist2 если вы имеют A и B как Nx3 массивы -

[indA,indB] = ind2sub([size(A,1) size(B,1)],find(pdist2(A,B)==0)); 

ind = [indA,indB] 

Таким образом, в ind вы бы попарные индексы для матчей с первым столбцом, представляющим индексы для A и второй для B.

Пример запуска -

A = 
    14 63 13 
    38 44 23 
    11 12 13 
    14 63 13 
    38 44 23 
B = 
    38 44 23 
    14 63 13 
ind = 
    2  1 
    5  1 
    1  2 
    4  2 
+0

'pdist2' решение очень изящно сравнивается с четким равенством равенства +1 :) –

Смежные вопросы