Я хочу вычислить совокупное косинусное расстояние между наборами векторов.
Естественным представлением набора векторов является матрица ... но как мне векторизовать следующее?
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.