我正在尝试计算两个矩阵中每列之间的平方欧几里德距离,并存储在矩阵D
中。
im_patches
81 * 60840 double
codebook
81 * 456 double
SquareEuclidean = @(x, y) x'*x+y'*y-2*x'*y;
% Get N*K distance matrix D between the N patches extracted
% from the image (im patches) and the K prototypes in the codebook
D=zeros(size(im_patches,2),size(codebook, 2));
for i=1:size(im_patches,2)
for j=1:size(codebook, 2)
D(i,j)=SquareEuclidean(im_patches(:,i),codebook(:,j));
end
end
然而,这非常低效,在我的笔记本电脑上花费超过10分钟。
我想知道是否有更好的方法来使用bsxfun
。所以我试过了:
D2 = bsxfun(@(x,y) x'.*x+y'.*y-2.*x'.*y,im_patches,codebook);
给出错误:
使用bsxfun时出错:两个输入数组的非单一维度必须相互匹配。
我认为bsxfun
或arrayfun
是处理此类问题的好方法。但是不知道这样做的正确方法。
提前谢谢你。
答案 0 :(得分:1)
你的循环可以简化为:
bsxfun(@plus,sum(im_patches.'.^2,2),sum(codebook.^2)-2*im_patches.'*codebook)
在MATLAB r2016b中,不需要bsxfun:
sum(im_patches.'.^2,2)+sum(codebook.^2)-2*im_patches.'*codebook