【问题标题】:Easy way to get metric matrix in Matlab在 Matlab 中获取度量矩阵的简单方法
【发布时间】:2015-04-11 00:33:43
【问题描述】:

假设我有一个字符串向量,我编写了一个函数来查找两个字符串之间的距离。

我想得到这个函数确定的距离矩阵。 我知道使用循环的蛮力方法,但是还有其他更简单的方法吗?

例如:

我的功能:

function [value] = func(str1, str2)
    value = abs(str1(1) - str2(1))
end

获取度量矩阵的艰苦方式

v = ['str'; 'rew'; 'ter'];
num = length(v);
metrMat = zeros(num);
for ii = 1:num
    for jj = 1:num
        metrMat(ii,jj) = func(v(ii),v(jj));
    end
end
metrMat

>metrMat =

>     0     1     1
>     1     0     2
>     1     2     0

【问题讨论】:

  • 与它分享您尝试过的代码、示例输入数据和预期输出?
  • @Divakar,我已经用一个例子更新了这个问题
  • 您使用的字符串之间距离的实际定义是什么?取决于此,代码可以向量化或不向量化

标签: matlab matrix vector metric


【解决方案1】:

为什么你这么不愿意使用 for 循环?它们的速度非常快。

利用度量矩阵的对称性,可以改进for循环:

for ii = 1:num
    for jj = 1:ii
        metrMat(ii,jj) = func(v(ii),v(jj));
    end
end

metrMat = metrMat + tril(metrMat)'

如果您可以访问统计工具箱,这可以在一行中实现:

metrMat = squareform(pdist(v(1:num)'));

【讨论】:

    【解决方案2】:

    这将是一个 vectorized approachbsxfun -

    metrMat = abs(bsxfun(@minus,v(:,1),v(:,1).'))
    

    示例运行 -

    >> v
    v =
    str
    rew
    ter
    >> metrMat = abs(bsxfun(@minus,v(:,1),v(:,1).'))
    metrMat =
         0     1     1
         1     0     2
         1     2     0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-24
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多