I have a matrix B 1631×5.
Columns 2 and 3 represent X and Y coordinates respectively.
I want to identify the indexes where B(i+k,2)==B(i+j,2)&B(i+k,3)==B(i+j,3). Note that there can be more than one duplicate.
Below is the script of identifying the duplicates:
%%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 indicesduplicate_indY = setdiff(1:size(B, 1), indY);% duplicate valuesduplicate_valueY = B(duplicate_indY, 3);%%Both coordinates
duplicate_ind=intersect(duplicate_indX,duplicate_indY);duplicate_value = B(duplicate_ind, 2:3);
When the code is executed, we get 2 matrix: duplicate_ind(1×149) and duplicate_value(149×2).
Let's consider first 4 values of duplicate_ind as an example:
>> duplicate_ind(1:4)ans = 61 77 106 111
The corresponding values for these indexes are
>> duplicate_value(1:4,:)ans = 355.3035 176.9755 364.7316 182.2644 354.4987 202.1553 350.5895 226.7602
Now I can find the original and the duplicate:
find(B(:,2)==duplicate_value(1,1))ans = 1 61>> find(B(:,2)==duplicate_value(2,1))ans = 57 77
In this case, the index of the original value is 1 and the index of duplicate is 61. In other case: original: 57 and duplicate:77.
Now, I want to replace the indexes of the duplicates by the original ones. In our case 61 will be replaced by 1 (and 77 will be replaced by 57). Considering above, I want to build a matrix which has the size 1631×3 (must have the same number of rows as matrix B), where the 1st row represents the line number, 2nd and 3rd row – the coordinates of points.
The output is expected to look like:
1 1 22 2 33 3 4...57 57 58...61 1 62...77 57 7878 78 79...
Best Answer