2012-02-05 40 views
1

我想從三個向量中構建一個三維矩陣,其中我將每個向量的每個元素之間的最小平方距離作爲矩陣的條目。建立一個沒有環路的3D最小二乘距離矩陣?

例如,對於3D矩陣d,

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

我目前正在與三做這個循環:

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 

我的問題是,是否有做一個更快,更聰明的方式這例如對於這個我可以使用的二維版本:​​

%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 

無論是喬治施密茨是誰來了用一種方法來使用repmat替換2d版本中的double for循環。我當然可以適應這種方法,並用循環替換我的三重循環,重複repmat方法(o)多次,但我覺得應該有一種方法來做到這一點沒有循環。

任何想法?由於

回答

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)); 
+0

啊輝煌,我考慮使用bsxfun,但無法找出解決最大兩個參數的方法。 – user1185474 2012-02-05 15:29:19

0

你應該嘗試pdist或pdist2根據您的需要。 pdist計算內部距離,而pdist2計算成對距離矩陣。