2017-04-24 14 views
0

행렬 B 1631x5가 있습니다. Download matfile중복 값의 인덱스를 찾아서 Matlab에서 인덱스를 대체하십시오.

열 2와 3은 각각 X 좌표와 Y 좌표를 나타냅니다.

B (i + k, 2) == B (i + j, 2) & B (i + k, 3) == B (i + j, 3) 인 인덱스를 식별하고 싶습니다. 두 개 이상의 복제본이있을 수 있습니다. duplicate_ind (1x149)와 duplicate_value (149x2) : 코드가 실행되면

%% X coordinate 
[~, indX] = unique(B(:, 2), 'rows'); 
% duplicate indices 
duplicate_indX = setdiff(1:size(B, 1), indX); 
% duplicate values 
duplicate_valueX = B(duplicate_indX, 2); 


%% Y coordinate 
[~, indY] = unique(B(:, 3), 'rows'); 
% duplicate indices 
duplicate_indY = setdiff(1:size(B, 1), indY); 
% duplicate values 
duplicate_valueY = B(duplicate_indY, 3); 

%% Both coordinates 
duplicate_ind=intersect(duplicate_indX,duplicate_indY); 
duplicate_value = B(duplicate_ind, 2:3); 

, 우리는이 행렬을 얻을 :

다음은 중복을 식별하는 스크립트입니다.

find(B(:,2)==duplicate_value(1,1)) 

ans = 

    1 
    61 

>> find(B(:,2)==duplicate_value(2,1)) 

ans = 

    57 
    77 
:이 인덱스에 대한

>> duplicate_ind(1:4) 

ans = 

    61 77 106 111 

에 해당하는 값이 지금은 원본과 복제본을 찾을 수 있습니다

>> duplicate_value(1:4,:) 

ans = 

    355.3035 176.9755 
    364.7316 182.2644 
    354.4987 202.1553 
    350.5895 226.7602 

있습니다

의 예로 들어 duplicate_ind의 처음 4 개 값을 생각해 보자

이 경우 원래 값의 색인은 1이고 사본의 색인 다른 경우에는 : 원본 : 57 및 중복 : 77.

이제 중복 된 색인을 원래 색인으로 교체하고 싶습니다. 우리의 경우 61은 1로 대체됩니다 (77은 57로 대체됩니다). 위의 고려, 내가 크기 1631x3이있는 매트릭스를 구축하려는 (매트릭스 B로 같은 수의 행이 있어야 함), 및 다음과 같습니다 :

1 1 2 
2 2 3 
3 3 4 
... 
57 57 58 
... 
61 1 62 
... 
77 57 78 
78 78 79 
... 
+2

이 질문을 정의 "당신이 무엇을 요구하고 있는지 불분명합니다." 지금은 매우 혼란 스럽기 때문에 다시 말하십시오. –

+2

Welcome To Stack Overflow! 현재이 질문은 다소 모호합니다. 당신이 의미하는 바를 명확히하기 위해 질문을 편집하십시오. 스택 오버플로는 코드 작성 서비스가 아니기 때문에 최소한 입력을 포함하고 [mcve]에 코드를 포함하십시오. 마지막으로 [ask]에 대한 정보를 얻으실 수 있습니다. – Adriaan

+0

답변 해 주셔서 감사합니다. 질문이 편집되어 이제는 더 명확 해지기를 바랍니다. –

답변

0

가 해결 :

%% X coordinate 
[~, indX] = unique(B(:, 2), 'rows'); 
% duplicate indices 
duplicate_indX = setdiff(1:size(B, 1), indX); 
% duplicate values 
duplicate_valueX = B(duplicate_indX, 2); 


%% Y coordinate 
[~, indY] = unique(B(:, 3), 'rows'); 
% duplicate indices 
duplicate_indY = setdiff(1:size(B, 1), indY); 
% duplicate values 
duplicate_valueY = B(duplicate_indY, 3); 

%% Both coordinates 
duplicate_ind=intersect(duplicate_indX,duplicate_indY); 
duplicate_value = B(duplicate_ind, 2:3); 

indexes=zeros(3,size(duplicate_value,1)); 
for i=1:size(duplicate_value,1) 
    if size(find(B(:,2)==duplicate_value(i,1)&B(:,3)==duplicate_value(i,2)),1)==2 
     indexes(1:2,i)=find(B(:,2)==duplicate_value(i,1)&B(:,3)==duplicate_value(i,2)); 
    end 
    if size(find(B(:,2)==duplicate_value(i,1)&B(:,3)==duplicate_value(i,2)),1)==3 
     indexes(1:3,i)=find(B(:,2)==duplicate_value(i,1)&B(:,3)==duplicate_value(i,2)); 
    end  
end 

for j=1:size(B,1)-1 
    lines(j,1:2)=j; 
    lines(j,3)=j+1; 
end 

for j=1:size(lines,1) 
    for i=1:1:size(indexes,2) 
     if indexes(3,i)==0 
      if lines(j,2)==indexes(2,i) 
       lines(j,2)=indexes(1,i); 
      end 

      if lines(j,3)==indexes(2,i) 
       lines(j,3)=indexes(1,i); 
      end 
     end 

     if indexes(3,i)~=0 
      if lines(j,2)==indexes(3,i) 
       lines(j,2)=indexes(1,i); 
      end 

      if lines(j,3)==indexes(3,i) 
       lines(j,3)=indexes(1,i); 
      end 

      if lines(j,2)==indexes(2,i) 
       lines(j,2)=indexes(1,i); 
      end 

      if lines(j,3)==indexes(2,i) 
       lines(j,3)=indexes(1,i); 
      end 
     end 

    end 
end