Как найти повторяющиеся значения в матрице и к каким строкам они принадлежат? - PullRequest
0 голосов
/ 19 мая 2018

У меня матрица м-1, A.Я хочу выяснить, какие элементы являются дубликатами и получить их значения строк.(Только значения строк, потому что матрица m-by-1.)

Я пробовал

k = find(~unique(A));

, но k содержит неправильные значения.

Вотпример того, что я пытаюсь сделать.Рассмотрим массив A;

A = [4
     5
     5
     5
     7
     8
     4];

Поскольку 4 и 5 являются здесь повторяющимися элементами, я хотел бы получить значения строк этих элементов и поместить их в новый массив.Результирующий массив будет иметь вид

RowValues= [1
            2
            3
            4
            7];

Примечание. Вышеприведенный пример является лишь примером, и фактический массив, с которым я имею дело, содержит рациональные числа типа -0.0038, 1.3438 и т. Д. В массиве A.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Вот решение с использованием intersect:

s = sort(A);
c = intersect(s(1:2:end),s(2:2:end));
RowValues = find(ismember(A,c));

У меня есть по сравнению этот метод с методом, предложенным @SardarUsama с большим [1 x 10000000] вход в октаву.Вот результат:

=======INTERSECT==========
Elapsed time is 1.94979 seconds.

=======ACCUMARRAY==========
Elapsed time is 2.5205 seconds.
0 голосов
/ 19 мая 2018

Найдите количество элементов A, используя unique и accumarray, отфильтруйте неповторяющиеся значения, используйте ismember, чтобы получить логические индексы повторяющихся значений, а затем использовать find для преобразования их в линейные индексы.

[C, ~, ic] = unique(A);    
RowValues = find(ismember(A, C(accumarray(ic,1)>1)));

Почему вы получаетеневерные индексы с вашим кодом?
Применение логического НЕ к вектору уникальных значений приведет к их преобразованию в логический вектор, содержащий true вИндекс, где уникальное значение равно нулю, и false, где он ненулевой, и, следовательно, поиск ненулевых (false в данном случае) элементов такого вектора ни к чему не приведет.

...