2

文字列のベクトルがあり、2 つの文字列間の距離を見つける関数を作成したとします。

この関数によって決定される距離の行列を取得したいと思います。私はループを使って力ずくでそれを行う方法を知っていますが、別の簡単な方法はありますか?

例えば:

私の機能:

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
4

2 に答える 2

3

for ループを使用するのをためらうのはなぜですか? 彼らはかなり速いです。

メトリック行列の対称性を利用して、for ループを改善できます。

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

metrMat = metrMat + tril(metrMat)'

統計ツールボックスにアクセスできる場合、これは 1 行で達成できます。

metrMat = squareform(pdist(v(1:num)'));
于 2015-04-10T15:00:24.207 に答える
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
于 2015-04-10T16:28:58.103 に答える