如何使用bsxfun加速MATLAB中的列式操作?

时间:2017-06-11 20:02:09

标签: matlab

我正在尝试计算两个矩阵中每列之间的平方欧几里德距离,并存储在矩阵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时出错:两个输入数组的非单一维度必须相互匹配。

我认为bsxfunarrayfun是处理此类问题的好方法。但是不知道这样做的正确方法。

提前谢谢你。

1 个答案:

答案 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