2012-02-05 5 views
1

나는 각 벡터의 각 요소 사이의 최소 제곱 거리를 행렬의 항목으로 삼는 3 개의 벡터 중 3 차원 행렬을 작성하려고합니다. 3 차원 매트릭스 D에 대한 예를 들어 루프없이 3D 최소 제곱 거리 매트릭스를 작성 하시겠습니까?

,

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 

내 질문 할 수있는 빠르고, 영리한 방법이 있는지 여부입니다 예를 들어 이것을 사용할 수있는 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 버전의 이중 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을 사용하는 것을 고려했지만 두 개의 인수 max를 해결할 방법을 찾지 못했습니다. – user1185474

0

당신은 당신의 필요에 따라 pdist 또는 pdist2을 시도해야합니다. pdist는 내부 거리를 계산하고 pdist2는 쌍 거리 메트릭스를 계산합니다.

관련 문제