我正在尝试用三个向量构建三维矩阵,其中我将每个向量的每个元素之间的最小平方距离作为矩阵的条目。
例如对于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)次数,但我觉得应该有一种方法来做这个没有循环。
有什么想法吗?谢谢
答案 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计算成对距离矩阵。