【发布时间】:2017-04-24 15:21:28
【问题描述】:
我有一个矩阵 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
...
【问题讨论】:
-
这个问题定义了“不清楚你在问什么”。你可能想改写它,因为它现在很混乱
-
欢迎来到 Stack Overflow!就目前而言,这个问题相当模糊。请edit这个问题澄清你的意思。至少也包括输入,并且由于 Stack Overflow 不是代码编写服务,因此您的代码在 minimal reproducible example 中。最后,您可能有兴趣在此处阅读How to Ask。
-
感谢您的回答。问题已编辑,我希望现在更清楚。
标签: matlab replace duplicates find identify