ベクトルのセット間の累積コサイン距離を計算したいと考えています。
ベクトルのセットの自然な表現は行列です...しかし、次をベクトル化するにはどうすればよいですか?
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 では大幅に高速であることに注意してください。