在Matlab中计算字符串的单元格数组中字符串的出现次数

时间:2012-02-21 03:26:12

标签: string matlab count

我有两个不同长度的细胞阵列,d = {'神经','身体','肌肉','骨'}和e = {'身体','身体','肌肉'}。我必须比较这两个数组并计算e中每个字符串的出现次数。预期结果应该是一个向量count_string =(0,2,1,0)。 以下是我编写的代码,但是我得到错误:单元格内容分配给非单元格数组对象。我是matlab编程的初学者。对此非常感谢。

count_string=size(d)
for i=1:length(d)    
count_string{i}=sum(ismember(e{i},d));
end

完成以下所有建议之后,这就是我所拥有的模块。

for i=1:length(d_union)
count_string1=cellfun(@(x) sum(ismember(d1,x)), d_union);
count_string2=cellfun(@(x) sum(ismember(d2,x)), d_union);
count_string3=cellfun(@(x) sum(ismember(d3,x)), d_union);
count_string4=cellfun(@(x) sum(ismember(d4,x)), d_union);
count_string5=cellfun(@(x) sum(ismember(d5,x)), d_union);
count_string6=cellfun(@(x) sum(ismember(d6,x)), d_union);
count_string7=cellfun(@(x) sum(ismember(d7,x)), d_union);
count_string8=cellfun(@(x) sum(ismember(d8,x)), d_union);
count_string9=cellfun(@(x) sum(ismember(d9,x)), d_union);
count_string10=cellfun(@(x) sum(ismember(d10,x)), d_union);
count_string11=cellfun(@(x) sum(ismember(d11,x)), d_union);
count_string12=cellfun(@(x) sum(ismember(d12,x)), d_union);
count_string13=cellfun(@(x) sum(ismember(d13,x)), d_union);
count_string14=cellfun(@(x) sum(ismember(testdoc,x)), d_union);    end   

我的matlab编译器将永远执行此模块。 'd_union'是1x1216单元阵列,每个d1到testdoc大约是1x240单元阵列。我得计算从上面的操作中得到的向量的余弦相似度。有没有办法加快这个过程?请帮忙。谢谢。

3 个答案:

答案 0 :(得分:3)

您可以计算de的字符串出现次数,如下所示:

count_string = cellfun(@(x) sum(ismember(e,x)), d);

对于样本数据,您将获得向量[0 2 1 0];

d数组是否只包含唯一字符串?

<强>更新

以下是另一种将字符串临时转换为GRP2IDX的数字并使用HISTC计算数字的方法。它假定e中的d中的所有字符串都存在。

[gi g] = grp2idx([d e]);
gn = histc(gi(numel(d)+1:end),1:numel(g));

g将包含唯一字符串(可能与d相同),gn将成为计数。 gi是用于计数的临时数值数组。

您需要使用统计工具箱来访问GRP2IDX功能。

答案 1 :(得分:2)

开始
count_string = cell(1,size(d));  

您正在索引e,但控制d大小的循环。

for i=1:length(d)
   count_string{i}=sum(ismember(d{i},e));
end

答案 2 :(得分:0)

关于原始for循环解决方案的错误,macduff已经提到过它们:

  • 您需要使用CELLZEROS初始化count_string

    count_string = cell(size(d));   %# A 1-by-4 cell array
    %# OR
    count_string = zeros(size(d));  %# A 1-by-4 numeric array
    
  • count_string添加值时,您应该使用() - 数字数组的索引和{} - 为单元格数组建立索引。

  • 您需要在调用ISMEMBER时调用de,并使用循环变量而不是d索引e

关于使用循环的替代方法,yuk使用CELLFUN为您提供了一个解决方案。另一种向量化解决方案是使用ISMEMBERACCUMARRAY

的组合
>> [~, index] = ismember(e,d);  %# Find where each entry in e occurs in d
>> count_string = accumarray(index.', 1, [numel(d) 1]).'  %# Accumulate indices

count_string =

     0     2     1     0
相关问题