找到重复值的索引并在Matlab中替换它们的索引

时间:2017-04-24 15:21:28

标签: matlab replace duplicates find identify

我有一个矩阵B 1631x5。Download matfile

第2列和第3列分别代表X和Y坐标。

我想识别其中B(i + k,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,重复索引是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
...

1 个答案:

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