4

ベクトルのセット間の累積コサイン距離を計算したいと考えています。
ベクトルのセットの自然な表現は行列です...しかし、次をベクトル化するにはどうすればよいですか?

function d = cosdist(P1,P2)
    ds = zeros(size(P1,2),1);
    for k=1:size(P1,2)
      %#used transpose() to avoid SO formatting on '
        ds(k)=transpose(P1(:,k))*P2(:,k)/(norm(P1(:,k))*norm(P2(:,k)));
    end
    d = prod(ds);
end

もちろん書けます

fz = @(v1,v2) transpose(v1)*v2/(norm(v1)*norm(v2));
ds = cellfun(fz,P1,P2);

...行列をベクトルのセル配列として再キャストする限り。より良い/完全に数値的な方法はありますか?
また、cellfun、arrayfun などはベクトル命令やマルチスレッドを利用しますか?

現在の会社ではおそらく余分ですが、列ベクトルに対してv1'*v2 == dot(v1,v2)は不要であり、Matlab では大幅に高速であることに注意してください。

4

2 に答える 2

5

P1とは同じサイズなのでP2、ここで要素ごとの操作を行うことができます。v1'*vちなみに、に等しいsum(v1.*v2)

d = prod(sum(P1.*P2,1)./sqrt(sum(P1.^2,1) .* sum(P2.^2,1)));
于 2011-02-03T12:38:24.587 に答える
3

@Jonasは正しい考えを持っていましたが、正規化分母が正しくない可能性があります。代わりにこれを試してください:

%# matrix of column vectors
P1 = rand(5,8);
P2 = rand(5,8);

d = prod( sum(P1.*P2,1) ./ sqrt(sum(P1.^2,1).*sum(P2.^2,1)) );

これをPDIST2関数によって返される結果と比較できます。

%# PDIST2 returns one minus cosine distance between all pairs of vectors
d2 = prod( 1-diag(pdist2(P1',P2','cosine')) );
于 2011-02-03T15:42:18.453 に答える