构建一个没有循环的3D最小二乘距离矩阵?

时间:2012-02-05 02:21:50

标签: matlab

我正在尝试用三个向量构建三维矩阵,其中我将每个向量的每个元素之间的最小平方距离作为矩阵的条目。

例如对于3d矩阵d,

d(m,n,o)=(vec1(m)-vec2(n))^2+(vec1(m)-vec3(o))^2+(vec2(n)-vec1(o))^2

我目前正在使用三重for循环:

d=zeros(N,M,O);
for o=1:O
    for n=1:N
        for m=1:M
            d(n,m,o)=(((t(n)-r(m))^2)+((t(n)-z(o))^2)+((r(m)-z(o))^2));
        end
    end
end

我的问题是,是否有更快,更聪明的方法来执行此操作,例如我可以使用的2d版本:

%for n=1:N
%    for m=1:M
%        d(n,m)=(t(n)-r(m))^2;
%    end
%end
d=(repmat(t(:),1,M)-repmat(r(:)',N,1)).^2; %this replaces the nested for loops from       above Thanks Georg Schmitz

Georg Schmitz提出了一种使用repmat替换2d版本中的for for循环的方法。我当然可以调整这个方法并用一个for循环替换我的三重for循环,重复repmat方法(o)次数,但我觉得应该有一种方法来做这个没有循环。

有什么想法吗?谢谢

2 个答案:

答案 0 :(得分:1)

您确实可以对计算进行矢量化:

%# properly reshape the vectors
vec1 = vec1(:); %# n-by-1
vec2 = reshape(vec2,1,[]); %# 1-by-m
vec3 = reshape(vec3,1,1,[]); %# 1-by-1-by-o 

%# use bsxfun to efficiently replicate the arrays
d = bsxfun(@plus,bsxfun(@plus,...
    bsxfun(@minus,vec1,vec2).^2,...
    bsxfun(@minus,vec2,vec3).^2)),...
    bsxfun(@minus,vec3,vec1).^2));

答案 1 :(得分:0)

您应该根据自己的需要尝试使用pdist或pdist2。 pdist计算内部距离,而pdist2计算成对距离矩阵。