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

String 在Matlab中计算字符串单元格数组中字符串的出现次数,string,matlab,count,String,Matlab,Count,我有两个不同长度的字符串单元格数组,d={'nerve','body','muscle','bone'}和e={'body','body','muscle'}。我必须比较这两个数组,并计算每个字符串在e和d中的出现次数。预期结果应该是一个向量,count_string=(0,2,1,0)。 下面是我编写的代码,但我得到了错误:单元格内容分配给非单元格数组对象。我是matlab编程的初学者。非常感谢在这方面的任何快速帮助 count_string=size(d) for i=1:length(d)

我有两个不同长度的字符串单元格数组,d={'nerve','body','muscle','bone'}和e={'body','body','muscle'}。我必须比较这两个数组,并计算每个字符串在e和d中的出现次数。预期结果应该是一个向量,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'是一个1x216单元阵列,d1到testdoc的每个单元阵列大约为1x240单元阵列。我要计算从上面的运算中得到的向量的余弦相似性。有没有办法加快这个过程?请帮忙。多谢各位

count_string = cell(1,size(d));  
您正在索引到
e
,但是在
d
的大小上控制循环

for i=1:length(d)
   count_string{i}=sum(ismember(d{i},e));
end
[gi g] = grp2idx([d e]);
gn = histc(gi(numel(d)+1:end),1:numel(g));

您可以在
e
中计算
d
中字符串的出现次数,如下所示:

count_string = cellfun(@(x) sum(ismember(e,x)), d);
对于示例数据,您将获得向量[0 2 1 0]

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

更新

下面是另一种方法,它将字符串临时转换为数字,并使用进行计数。它假定
e
中的所有字符串也存在于
d

for i=1:length(d)
   count_string{i}=sum(ismember(d{i},e));
end
[gi g] = grp2idx([d e]);
gn = histc(gi(numel(d)+1:end),1:numel(g));
g
将包含唯一的字符串(可能与
d
相同),而
gn
将是计数
gi
是用于计数的临时数字数组


您需要统计工具箱来访问GRP2IDX函数。

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

  • 您需要使用或初始化
    count\u string

  • 将值添加到
    count\u string
    时,应使用
    ()
    -数值数组索引和
    {}
    -单元格数组索引

  • 您需要在对的调用中交换
    d
    e
    ,并使用循环变量而不是
    e
    索引
    d

关于使用循环的替代方案,给出了一个使用循环的解决方案。另一种矢量化解决方案是结合使用和:


我现在没有带matlab,但我认为这应该会让你朝着正确的方向前进。我尝试了上面的代码,“count_string”在e和d中每出现一个字符串,就会显示1。但是如何计算每个字符串的出现次数呢?如中所示,如果“body”在e中出现两次,“muscle”在e中出现一次,则count_字符串应显示(0,2,1,0)。谢谢你的帮助。我只是格式化了答案,没有更改代码。第一行应该是
count_string=0(大小(d))。在for循环中:
count\u字符串(i)=…
。和
d
e
应该像问题中那样切换。这非常有效!谢谢。是,d数组只包含唯一的字符串。此外,我还需要在13个其他单元阵列上执行此函数,每个单元阵列的字符串约为1x140。有没有办法加快这个过程?我还必须计算从上述操作中得到的13个向量的余弦相似性。我的matlab编译器要花很长时间来执行代码。你能帮忙吗?grp2idx函数救了我!我以前不知道这件事。matlab中的另一个新学习。谢谢你的帮助。如果答案是有用的,考虑一下投票和/或接受它。你必须使用字符串吗?看起来您可能拥有的字符串数量非常少;你不能用一个数字替换每个字符串吗?这可能会大大加快速度!嗯,我必须使用字符串。我在读一个文本文件,它有几个文档段落,d1到d13。我必须用这些来进行其他计算。所以,我不确定用数字替换每个字符串是否适合我。还有其他方法吗?你不需要for循环,
cellfun
会处理这个问题。您只需多次运行相同的代码,并获得相同的结果。