Найти индексы повторяющихся значений и заменить их индексы в Matlab

У меня есть матрица B 1631x5. Скачать 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).

Давайте рассмотрим первые 4 значения duplicate_ind в качестве примера:

>> 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 ответ

Решение

Решено:

%% 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
Другие вопросы по тегам