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

由于P1P2大小相同,因此您可以在此处进行元素操作。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 回答