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 のすべての単語をセル配列の単語と比較し、sum を使用して、strcmp によって返される配列の合計を計算することです。

誰かがそれを最適化するのを手伝ってくれることを願っています.... 6単語で1秒は多すぎます。

編集: ismember はさらに遅いです。

4

2 に答える 2

3

uniqueの3番目の出力を一緒に使用すると、ループを完全に削除できます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
于 2012-06-30T20:13:49.710 に答える
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'}]);
于 2014-03-03T09:12:26.677 に答える