2011-01-24 2 views
5

Я ищу функцию для поиска наиболее повторяющихся (то есть модальных) строк матрицы в MATLAB. Что-то вроде:Найти самую повторяющуюся строку в матрице MATLAB

>> A = [0, 1; 2, 3; 0, 1; 3, 4] 

A = 

0  1 
2  3 
0  1 
3  4 

Затем работает:

>> mode(A, 'rows') 

вернется [0, 1], в идеале со вторым выходом, давая индексы, где имели место в этой строке (т.е. [1, 3]'.)

Кто-нибудь знает такого функция?

ответ

13

Вы можете использовать UNIQUE, чтобы получить уникальные индексы строк, а затем называть MODE.

[uA,~,uIdx] = unique(A,'rows'); 
modeIdx = mode(uIdx); 
modeRow = uA(modeIdx,:) %# the first output argument 
whereIdx = find(uIdx==modeIdx) %# the second output argument 
+1

Спасибо. Я думаю, что последняя строка должна выглядеть примерно так: 'whereIdx = find (uIdx (modeIdx) == uIdx)' хотя. –

+0

@Bill Cheatham: Да, конечно. Это то, что я получаю за добавление строки * после * тестирования. – Jonas

+2

это может быть неверно. Попробуйте A = [2, 3; 0, 1; 3, 4; 0, 1] – sinoTrinity

2

Ответ может быть неправильным. Попробуйте A = [2, 3; 0, 1; 3, 4; 0, 1]. Должно быть:

[a, b, uIdx] = unique(A,'rows'); 
modeIdx = mode(uIdx); 
modeRow = a(modeIdx,:) %# the first output argument 
whereIdx = find(ismember(A, modeRow, 'rows')) %# the second output argument