2014-10-13 2 views
2

У меня есть большой массив ячеек строк в Matlab. Мне нужно найти индексы повторяющихся строк в этом массиве. То есть результат, который я ожидаю, представляет собой массив индексов строк, которые появляются два или более раз в массиве ячеек строк.Найти повторяющиеся записи в массиве строк?

Как это сделать?

+0

Ваш вопрос непонятен. Строка MATLAB сама по себе является вектором ... – Jubobs

+0

@Jubobs Согласился, что строка MATLAB является вектором. Однако у меня есть вектор строк, который, я полагаю, MATLAB представляет собой матрицу. Как это непонятно? Какая двусмысленность? Можете быть более конкретными? – becko

+0

Вам нужно будет показать нам, что этот «вектор строк» ​​выглядит в вашем вопросе. Некоторые из приведенных ниже ответов предполагают, что у вас есть массив ячеек строк ... – Jubobs

ответ

2

Вы можете заказать массив, а затем проверить каждую ячейку, если она равна следующей ячейке. Runtime = O(N log(N)) Я не помню встроенную функцию для этого.

Arr = ['aa' 'bb' 'cc' 'bb']; 
ArrSort = sort(Arr);// Arr = ['aa' 'bb' 'bb' 'cc'] 

NewArr = ArrSort(1); 
newInd = 1; 
for i=2:length(ArrSort) 
    if NewArr(newInd) ~= ArrSort(i) 
     newInd = newInd + 1; 
     NewArr(newInd) = ArrSort(i) 
    end 
end 
+0

Я не очень хорошо знаком с Matlab. Можете ли вы опубликовать фактический код? – becko

+0

Я добавил код MatLab. Надеюсь, это поможет. – ifryed

+0

Исправлен код: Matlab использует круглые скобки для индексации. – texnic

7

Это может быть сделано с unique:

strings = {'some' 'strings' 'with' 'with' 'duplicate' 'strings' 'strings'}; 
[~, uniqueIdx] =unique(strings) % Find the indices of the unique strings 
duplicates = strings % Copy the original into a duplicate array 
duplicates(uniqueIdx) = [] % remove the unique strings, anything left is a duplicate 
duplicates = unique(duplicates) % find the unique duplicates 
+0

Это также будет работать с массивом без ячеек с флагом 'rows', как в' [uniqueStr, uniqueIdx] = unique (строки, 'rows'); ' – craigim

+0

+1 Хороший подход! –

2

Другой подход: получить целые этикетки с помощью unique, подсчитывать их вхождений с histc, и выбрать те, которые появляются более одного раза:

str = {'hello' 'bye' 'hi' 'farewell' 'hello' 'morning' 'bye' 'bye'}; %// data 
[uniqueStr, ~, ind] = unique(str); %// uniqueStr(ind) equals str 
repeatedStr = uniqueStr(histc(ind,1:max(ind))>1); %// result 
+0

+1. Мне нравится метод «histc» для получения дубликатов индексов (двойной «уникальный» от Andy тоже хорош) – Hoki

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