我有一个多维单元格数组attributes
(763x6单元格)。属性:
我没有语法错误。由我的代码生成的距离矩阵D
对于每一行具有相同的值。我不知道我的距离函数如何能够处理多行/实例。
我的数据样本5x6单元格:
'low back pain risk factor staff' 'low back pain' 'low back pain risk factor staff' 'back pain pain risk factor epidemiology' 'spiritual comment comment care be' 'spiritual comment comment care be'
'psd psd antipsychotic essential receptor' 'ht ht 5' 'antipsychotic protein signal receptor drug' 'cell protein signal cell receptor' 'spiritual comment comment care be' 'spiritual comment comment care be'
'school of medicine' 'case western reserve university' 'antidepressant action 5 for in' 'ht ht 5' 'spiritual comment comment care be' 'spiritual comment comment care be'
'spiritual comment comment care be' 'heal holistic comment india india' 'heal religious mental disorder psychiatric symptom' 'heal religious mental disorder psychiatric psychiatric' 'spiritual comment comment care be' 'spiritual comment comment care be'
答案 0 :(得分:1)
这不是一个解决方案,但是太长而无法作为评论。问题在于pdist2
如何计算成对距离。
为了快速检查这个,我们可以传递一个距离函数,该函数只打印出传递给它的XI
和XJ
个参数(从pdist2
调用时):
X = {'foo1', 'foo2', 'foo3', 'foo4', 'foo5', 'foo6';...
'bar1', 'bar2', 'bar3', 'bar4', 'bar5', 'bar6'};
% call distance function via pdist2
D = pdist2(X,X,@printArgsIn);
在函数文件中:
function D2 = printArgsIn(XI,XJ)
disp('XI'); disp(XI);
disp('XJ'); disp(XJ);
D2 = 1;
end
返回以下内容:
XI
'foo1' 'foo2' 'foo3' 'foo4' 'foo5' 'foo6'
XJ
'foo1' 'foo2' 'foo3' 'foo4' 'foo5' 'foo6'
XI
'foo1' 'foo2' 'foo3' 'foo4' 'foo5' 'foo6'
XJ
'foo1' 'foo2' 'foo3' 'foo4' 'foo5' 'foo6'
'bar1' 'bar2' 'bar3' 'bar4' 'bar5' 'bar6'
XI
'bar1' 'bar2' 'bar3' 'bar4' 'bar5' 'bar6'
XJ
'foo1' 'foo2' 'foo3' 'foo4' 'foo5' 'foo6'
'bar1' 'bar2' 'bar3' 'bar4' 'bar5' 'bar6'
忽略第一个XI, XJ
对(如果你仔细查看pdist2,你会看到距离函数被调用一次以测试它是否有效),你可以看到它调用{{{{ 1}}反对XI
的所有观察结果。
换句话说,它希望您的距离函数能够处理多个行/实例,并返回距离的列向量。我没有详细看过你的距离函数,但我认为你不允许这样做。
答案 1 :(得分:0)
问题在于你的距离函数,当第二个参数中有多行时,它需要能够返回多个距离,详见pdist2
documentation中的表格。
它似乎也在处理由regexp
错误生成的单元格数组。通过使用cellfun
将单词的单元格数组传递给intersect
,系统会要求intersect
函数比较不同单词中的字母。
我相信以下函数会返回具有所需效果的值:
function D2 = intersection(XI,XJ)
wordsI = regexp(XI, '\s+', 'split');
wordsJ = regexp(XJ, '\s+', 'split');
D2 = zeros(size(XJ,1),1);
for i=1:numel(D2)
D2(i) = sum(cellfun(@(wI,wJ) numel(intersect(wI,wJ)), wordsI, wordsJ(i,:)));
end