在matlab中矢量化余弦相似度

时间:2017-04-29 14:55:39

标签: matlab matrix vectorization

我有一个1000x1000x3的3d矩阵。我想计算某个集合的每个3d矢量与每个3d矢量之间的角度的余弦,我可以从3d矩阵中垂直提取。然后我应该能够创建一个1000x1000矩阵,其中矢量索引与原始数据具有最大余弦相似度(即最小角度)。

如何对此计算或至少某些部分进行矢量化?目前我使用嵌套for循环(大量的时间和开销)。

1 个答案:

答案 0 :(得分:0)

我无法找到一个能够超越第三维度的函数,但我认为这也是有用的。

a = rand(1000,1000,3)-.5; %dataset
na = sqrt(a(:,:,1).^2+a(:,:,2).^2+a(:,:,3).^2); %the norm of each vector
b = [1.2,1,3]; %vector to compare angle against
nb = norm(b); %the norm of the compare vector
b = repmat(b,[1000,1000]);
b = reshape(b,[1000,1000,3]); %1000x1000 copies of b
pl = a.*nb + na.*b; 
mn = a.*nb - na.*b;
npl = sqrt(pl(:,:,1).^2+pl(:,:,2).^2+pl(:,:,3).^2);  
nmn = sqrt(mn(:,:,1).^2+mn(:,:,2).^2+mn(:,:,3).^2);  
theta = 2 * atan(nmn./npl); %angle between [0 and pi] as expected

数学是这个公式的改编:

theta = 2 * atan(norm(x*norm(y) - norm(x)*y) / norm(x * norm(y) + norm(x) * y))