【问题标题】:Matlab: Calculating the pairwise distance for a multidimensional cell arrayMatlab:计算多维单元阵列的成对距离
【发布时间】:2016-08-30 17:58:03
【问题描述】:

我有一个多维元胞数组attributes(763x6 元胞)。属性:

我没有语法错误。我的代码产生的距离矩阵D 对每一行都有相同的值。我不知道我的距离函数如何能够处理多行/实例。

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'

【问题讨论】:

  • 你能提供一个我们可以测试代码的数据样本吗?
  • 很遗憾,不可以。我正在处理的数据有版权,我不能分享它。
  • 不一定是真实的数据,只要一些数据具有你的数据的形状和属性。如果是数字,我已经生成了一些随机数据,但是对于字符串,拥有一些类似于真实数据的小数据(购买样本或发明一个)会更有效
  • 我已经通过添加示例数据 5X6 单元格来编辑我的问题
  • 为什么要从问题中删除作为问题主题的代码?

标签: matlab logic intersection cell-array


【解决方案1】:

这不是一个解决方案,但太长,无法作为评论。问题在于pdist2 如何计算成对距离。

为了快速检查这一点,我们可以向它传递一个距离函数,它只打印出传递给它的 XIXJ 参数(当它从 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,您会看到调用了一次距离函数来测试它是否有效),您可以看到它在XI 的观察1 上调用了距离函数反对XJ 的所有观察结果。

换句话说,它希望您的距离函数能够处理多行/实例,并返回距离的列向量。我没有详细查看您的距离函数,但我认为您不允许这样做。

【讨论】:

  • 如果我正确理解了您的距离函数,它期望接收两个参数,每个参数都是单元格数组的单行,并返回 D2 单个距离。相反,它的第二个参数将是几行,它需要返回一列距离,第二个参数中的每一行都有一个距离。
【解决方案2】:

问题在于您的距离函数,当在第二个参数中给出多行时,它需要能够返回多个距离,如pdist2 documentation 中的表中所述。

它似乎也处理了regexp 错误生成的单元格数组。通过使用cellfun 将单词元胞数组传递给intersectintersect 函数被要求比较不同单词中的字母。

我相信以下函数会返回具有预期效果的值:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 2020-04-12
    • 2015-09-14
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2016-04-06
    相关资源
    最近更新 更多