查找重复值的索引并在 Matlab 中替换它们的索引
Find the indexes of duplicate values and replace their indexes in Matlab
我有一个矩阵 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和duplicate: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
...
已解决:
%% 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
我有一个矩阵 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和duplicate: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
...
已解决:
%% 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