2012-02-05 7 views
1

私は3つのベクトルから3次元の行列を構築しようとしています。ここでは、各ベクトルの各要素間の最小二乗距離を行列の要素として取ります。 3Dマトリックスdの例えばループなしで3D最小二乗距離行列を作成しますか?

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 

ゲオルク・シュミッツが来ている誰でもrepmatを使用して2dバージョンの2重ループを置き換える方法があります。私はもちろん、この方法を採用して、私のトリプル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の使用を検討しましたが、2つの引数maxを回避する方法を見つけられませんでした。 – user1185474

0

あなたは、あなたのニーズに応じて、PDISTまたはpdist2を試してみてください。 pdistは内側距離を計算し、pdist2はpairwise距離行列を計算します。