我有两个不同长度的细胞阵列,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单元阵列。我得计算从上面的操作中得到的向量的余弦相似度。有没有办法加快这个过程?请帮忙。谢谢。
答案 0 :(得分:3)
您可以计算d
中e
的字符串出现次数,如下所示:
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已经提到过它们:
您需要使用CELL或ZEROS初始化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时调用d
和e
,并使用循环变量而不是d
索引e
。
关于使用循环的替代方法,yuk使用CELLFUN为您提供了一个解决方案。另一种向量化解决方案是使用ISMEMBER和ACCUMARRAY:
的组合>> [~, 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