2012-05-17 3 views

답변

4

dsearchn을 사용하면 각 지점에 가장 가까운 대표자를 찾을 수 있습니다. 우선 삼각 측량 행렬을 포함하지 않는 버전을 사용하는 것이 좋습니다. 메모리 또는 CPU 성능이 충분하지 않은 경우 삼각 측량에 대해 살펴보십시오.

1

nif 차원 벡터에 의한 IIF 당신은 n 차원 점의 정렬 된 목록을 의미합니다 (즉, 당신이 원하는 것에 대한 나의 이해입니다). 그런 다음 평균 가까운 거리를 사용하여 이것을 수행했습니다. 기본적으로 벡터 1의 각 점에 대해 벡터 2의 점까지의 최소 거리를 찾습니다. 두 벡터 사이의 거리는이 모든 거리의 평균입니다. 그러나 이것은 대칭이 아니므로 벡터 2의 각 점에 대해 벡터 1에 대한 최소 거리를 구한 다음 동일한 최소, 최대 또는 평균 등 두 가지 평균을 구해야합니다.

여기에 있습니다 루프를 사용하여 만든 일부 코드 (3D 벡터 용) :

function mcd = MCD(fiber1, fiber2, option) 

% 

%remove NaNs 
fiber1(find(isnan(fiber1),1):length(fiber1),:) = []; 
fiber2(find(isnan(fiber2),1):length(fiber2),:) = []; 

dist = 0; 


for k = 1:length(fiber1) 

    D = []; 

    for j = 1:length(fiber2) 
     D = [D distance(fiber1(k,:),fiber2(j,:))]; 
    end; 

    dist = dist + min(D); 

end; 

mcd = dist/length(fiber1); 

if nargin > 2 

    dist = 0; 

    for k = 1:length(fiber2) 

     D = []; 

     for j = 1:length(fiber1) 
      D = [D distance(fiber2(k,:),fiber1(j,:))]; 
     end; 

     dist = dist + min(D); 

    end; 

    mcd2 = dist/length(fiber2); 

    if strcmp(option,'mean') 
     mcd = mean([mcd mcd2]); 
    elseif strcmp(option,'min') 
     mcd = min([mcd mcd2]); 
    end; 
end; 

그러나 이것은 나에게 너무 느리다. 그래서 여기에 매우 빠른입니다 벡터화 (하지만 어려운 따라) 버전 : 이것은 위의 사용 거리() 함수는

function mcd = MCD(fiber1, fiber2, option, sampling) 

%MCD(fiber1, fiber2) 
%MCD(fiber1, fiber2, option) 
%MCD(fiber1, fiber2, option, sampling) 



%remove NaNs 
fiber1(find(isnan(fiber1),1):length(fiber1),:) = []; 
fiber2(find(isnan(fiber2),1):length(fiber2),:) = []; 

%sample the fibers for speed. Each fiber is represented by "sampling" 
%number of points. 

if nargin == 4 

    freq = round(length(fiber1)/sampling); 
    fiber1 = fiber1(1:freq:length(fiber1),:); 
    freq = round(length(fiber2)/sampling); 
    fiber2 = fiber2(1:freq:length(fiber2),:); 

end; 

%reshape to optimize the use of distance() for speed 
FIBER2 = reshape(fiber2',[1,3,length(fiber2)]); 
FIBER1 = reshape(fiber1',[1,3,length(fiber1)]); %this is only used in the symmetrical case, i.e when 'min' or 'mean' option is called 


%reshape amd tile filber 1 so as to eliminate the need for two nested for 
%loops thus greatly increasing the computational efficiency. The goal is to 
%have a 4D matrix with 1 row and 3 columns. Dimension 3 is a smearing of 
%these columns to be as long as fiber2 so that each vector (1x3) in fiber1 
%can be placed "on top" as in a row above the whole of fiber2. Thus dim 3 
%is as long as fiber2 and dim 4 is as long as fiber1. 

fiber1 = reshape(fiber1',[1,3,length(fiber1)]); %1x3xF1 
fiber1 = repmat(fiber1,[length(FIBER2),1,1]); %F2x3xF1 
fiber1 = permute(fiber1,[2,1,3]); %3xF2xF1 
fiber1 = reshape(fiber1,[1,3,length(FIBER2),length(FIBER1)]);%1,3,F2,F1 

mcd = mean(min(distance(fiber1, repmat(FIBER2,[1,1,1,length(FIBER1)])))); 

if nargin > 2 

    fiber2 = reshape(fiber2',[1,3,length(fiber2)]); %1x3xF1 
    fiber2 = repmat(fiber2,[length(FIBER1),1,1]); %F2x3xF1 
    fiber2 = permute(fiber2,[2,1,3]); %3xF2xF1 
    fiber2 = reshape(fiber2,[1,3,length(FIBER1),length(FIBER2)]);%1,3,F2,F1 

    mcd2 = mean(min(distance(fiber2, repmat(FIBER1,[1,1,1,length(FIBER2)])))); 

    if strcmp(option,'mean') 
     mcd = mean([mcd mcd2]); 
    elseif strcmp(option,'min') 
     mcd = min([mcd mcd2]); 
    end; 
end; 

, 내 경우에는 내가 유클리드 거리를 사용하지만 당신은 그것을 적용 할 수 있습니다 두 벡터를 받아 들일 수있는 한 무엇이든 최선을 다하겠습니다.

function Edist = distance(vector1,vector2) 

%distance(vector1,vector2) 
% 
%provides the Euclidean distance between two input vectors. Vector1 and 
%vector2 must be row vectors of the same length. The number of elements in 
%each vector is the dimnesionality thereof. 

Edist = sqrt(sum((diff([vector1;vector2])).^2)); 
관련 문제