2013-01-20 3 views
2

Каков правильный способ проверки того, существует ли в первом случае какой-либо элемент из вектора в матрице? Например, если у меня естьПроверка элементов вектора относительно элементов матрицы

A = [1, 3] 

и

B = [ 1, 2 ; 
     1, 4 ; 
     2, 3 ; 
     2, 4 ; 
     3, 4 ]; 

я должен получить что-то, что возвращает индексы матрицы B, где встретил это условие. Поэтому для примера я должен получить.

INDX = [1, 1]

Я использую MATLAB R2012a

ответ

1

Для того, чтобы найти всех элементов вектора A в матрице B вы можете использовать bsxfun:

tmp = bsxfun(@eq, B(:), A); 

Это сравнение игнорирует матричную форму B и рассматривает ее как стек элементов. В вашем примере B имеют 10 элементов и A имеет 2, поэтому tmp является двоичного матрицы размера 10x2 с true везде, где B равно элементами A.

Чтобы найти первый элемент B, который равен любой элемент A вы просто сделать

idx = find(any(tmp, 2), 1, 'first'); 

Чтобы преобразовать линейный индекс idx в пару строк Col в B

[r c] = ind2sub(size(B), idx); 

Ура!

+0

Я все время забываю об этом, но нет необходимости в' ind2sub', 'find' может также возвращать индексы строк и столбцов. –

+0

@EitanT - в этом случае 'ind2sub' является обязательным - так как я« сплющил »' B' при создании 'tmp'. – Shai

+0

Ах, я пропустил часть 'B (:)'. –

3

вы можете использовать ismember:

vec=ismember(A,B); 

или

vec=ismember(B,A) 

зависит, что вы хотите ликующе (элементы A находятся в B или наоборот). Тогда вы можете просто

[row col]=find(vec,1, 'first') 

, чтобы получить индекс позиции

+0

Почему ты использовать A (1)? Вектор и матрица выше были произвольными.Я не гарантирован, что первый элемент в A будет первым событием в B. По сути, мне нужно что-то вроде этого. [row col] = find (A (1) == B, 1, 'first') и [row col] = find (A (2) == B, 1, 'first'). Мне нужна строка [row col] of B для первой проверки, которая попадает. A (1) может вызвать срабатывание find или A (2). По триггеру я имею в виду условие A (1 или 2) == B. – roldy

+0

Извините, я вас неправильно понял. вы можете использовать 'ismember', я отредактирую свой ответ – bla

2

Придется использовать команду strfind в Matlab.

Вы можете попробовать что-то вроде этого:

res = strfind(B(:)',A) 

Это даст все вхождение А в В. Таким образом, первое вхождение будет res(1)

Надеется, что это помогает

+0

Я решил, что я собираюсь пойти по другому маршруту и ​​попытаться работать из ячейки точек пересечения массив. Но неудивительно, что я нахожусь на месте. Я задал новый вопрос в отношении этого здесь http://stackoverflow.com/questions/14431860/check-if-entries-in-a-cell-are-in-a-cell-arrary. – roldy

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