2017-04-24 329 views
0

我有一個矩陣B 1631x5。 Download matfile在Matlab中查找重複值的索引並替換它們的索引

第2列和第3列分別代表X和Y座標。 (i + j,2)== B(i + j,2)& B(i + k,3)== B(i + j,3)。請注意,可能有多個重複項。

下面是識別重複的腳本:

%% 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); 

當執行代碼,我們得到2矩陣:duplicate_ind(1x149)和DUPLICATE_VALUE(149x2)。

讓我們考慮duplicate_ind的第4個值爲例:

>> 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 

現在我可以找到原始和重複:

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

ans = 

    1 
    61 

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

ans = 

    57 
    77 

在這種情況下,原始值的索引是1,並且副本的索引te是61.在其他情況下:原件: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

歡迎使用堆棧溢出!目前這個問題相當模糊。請[編輯]這個問題來澄清你的意思。至少包括輸入,因爲Stack Overflow不是代碼編寫服務,所以你的代碼放在[mcve]中。最後,你可能有興趣閱讀[問]這裏。 – 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