2012-06-30 5 views
1

Мне нужно подсчитать, как часто определенная строка содержится в массиве ячеек. Проблема в том, что код - это способ замедления, для этого требуется почти 1 секунда.Оптимизация количества вхождений строки

uniqueWordsSize = 6; % just a sample number 
    wordsCounter = zeros(uniqueWordsSize, 1); 
    uniqueWords = unique(words); % words is a cell-array 

    for i = 1:uniqueWordsSize 
     wordsCounter(i) = sum(strcmp(uniqueWords(i), words)); 
    end 

То, что я сейчас делаю, чтобы сравнить каждое слово в uniqueWords с клеточно-массив слов и использовать сумму для того, чтобы вычислить сумму массива, который получает возвращенного STRCMP.

Я надеюсь, что кто-то может помочь мне оптимизировать это .... 1 секунда для 6 слов - это слишком много.

EDIT: ismember еще медленнее.

+0

Кажется, ответ на @Jonas является то, что вы хотите (блестящее решение кстати). Но только потому, что мне любопытно: Сколько слов у вас в массиве ячеек 'words'? Если их много (я бы сказал, по крайней мере, +5000), это может объяснить задержку в 1 секунду. –

+0

uniquewords может быть около 100, а слова около 500-800 зависят от ввода. –

ответ

3

Вы можете оставить петлю полностью, используя третий выход unique вместе с hist:

words = {'a','b','c','a','a','c'} 
[uniqueWords,~,wordOccurrenceIdx]=unique(words) 
nUniqueWords = length(uniqueWords); 
counts = hist(wordOccurrenceIdx,1:nUniqueWords) 

uniqueWords = 
    'a' 'b' 'c' 
wordOccurrenceIdx = 
    1  2  3  1  1  3 
counts = 
    3  1  2 
+0

Хорошее решение Мой код теперь в 10 раз быстрее –

0

хитрый способ без использования явных Fors ..

clc 
close all 
clear all 

Paragraph=lower(fileread('Temp1.txt')); 

AlphabetFlag=Paragraph>=97 & Paragraph<=122; % finding alphabets 

DelimFlag=find(AlphabetFlag==0); % considering non-alphabets delimiters 
WordLength=[DelimFlag(1), diff(DelimFlag)]; 
Paragraph(DelimFlag)=[]; % setting delimiters to white space 
Words=mat2cell(Paragraph, 1, WordLength-1); % cut the paragraph into words 

[SortWords, Ia, Ic]=unique(Words); %finding unique words and their subscript 

Bincounts = histc(Ic,1:size(Ia, 1));%finding their occurence 
[SortBincounts, IndBincounts]=sort(Bincounts, 'descend');% finding their frequency 

FreqWords=SortWords(IndBincounts); % sorting words according to their frequency 
FreqWords(1)=[];SortBincounts(1)=[]; % dealing with remaining white space 

Freq=SortBincounts/sum(SortBincounts)*100; % frequency percentage 

%% plot 
NMostCommon=20; 
disp(Freq(1:NMostCommon)) 
pie([Freq(1:NMostCommon); 100-sum(Freq(1:NMostCommon))], [FreqWords(1:NMostCommon), {'other words'}]); 
Смежные вопросы