比较单元格数组中的字符串

时间:2013-11-08 23:18:36

标签: string matlab compare cell-array

我正在尝试在单词列表中找到最常用的单词。到目前为止,这是我的代码:

uniWords = unique(lower(words));
for i = 1:length(words)
    for j = 1:length(uniWords)
        if (uniWords(j) == lower(words(i)))
            freq(j) = freq(j) + 1;
        end
    end
end

当我尝试运行脚本时,出现以下错误:

Undefined function 'eq' for input arguments of
type 'cell'.

Error in Biweekly3 (line 106)
    if (uniWords(j) == lower(words(i)))

感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

您需要使用{}提取单元格的内容

strcmpi(uniWords{j},words{i})

此外,我建议将字符串与strcmp或本案例strcmpi, which ignores case进行比较,这样您就不需要致电lower

在字符串上使用==时要小心,因为它们的长度必须相同,否则会出错:

>> s1='first';
>> s2='second';
>> s1==s2
Error using  == 
Matrix dimensions must agree. 

答案 1 :(得分:2)

我想你需要这样做:

if (uniWords{j} == lower(words{i}))

另外,我建议not using i and j as variables in MATLAB

<强>更新

正如Chappjc指出的那样,最好使用strcmp(或者在您的情况下strcmpi并跳过lower),因为您要忽略案例。

答案 2 :(得分:2)

无需循环。 unique为每个单词提供唯一标识符,然后您可以使用sparse对每个标识符的出现次数求和。从那里你很容易找到最大值和最大化的单词:

[~, ~, jj ] = unique(lower(words));
freq = full(sparse(ones(1,length(jj)),jj,1)); % number of occurrences of each word
m = max(freq);
result = lower(words(jj(freq==m))); % return more than one word if there's a tie

例如,使用

words = {'The','hello','one','bye','the','one'}

结果是

>> result

result = 

    'one'    'the'