我有两个相同大小的列向量X和Y,它们是通过遵循Matlab代码得出的:
mask = im2bw(rgb2gray(imread('http://i.stack.imgur.com/ES8w1.jpg')));
separation = bwulterode(mask,'euclidean',[0 0 0; 1 1 1; 0 0 0]).*mask;
[X, Y] = find(separation);
imshow(mask); hold on; plot(Y, X, '.r');
X中的每个元素在Y中都有一个对应的元素。我使用此代码(@VHarisop)删除了X中的重复值以及它们在Y中的对应值:
% 'stable' argument preserves ordering
[Xfixed, ind] = unique(X, 'stable');
% ind now holds the indices of the unique elements
Yfixed = Y(ind);
我需要找到重复元素的坐标:X和Y的元素分别不是Xfixed和Yfixed。任何帮助表示赞赏。
答案 0 :(得分:1)
如果ind
包含Xfixed
中每个唯一值的第一个位置,只需创建一个从1开始到X
为止的向量,并使用ind
从此向量中删除这些条目。结果将是一个包含Xfixed
中非唯一条目的向量。因此,请尝试:
val = 1 : numel(X);
val(ind) = [];
Xfinal = X(val);
Yfinal = Y(val);
前两行代码正是我之前谈到过的。 val
将包含那些不包含唯一元素的索引。然后,我们会使用val
索引X
和Y
来抓取我们的内容,这些内容会存储到Xfinal
和Yfinal
。
以下是一个例子:
X = [1 1 1 2 2 3 3 3 4 4 5 5 6 6 7 7 7 8 8]; %// Example data
Y = [9 8 7 6 5 4 2 1 3 5 6 7 8 9 9 8 8 0 0];
[Xfixed, ind] = unique(X, 'stable'); %// Your code
%// New code
val = 1 : numel(X);
val(ind) = [];
Xfinal = X(val);
Yfinal = Y(val);
显示val
,Xfinal
和Yfinal
是什么,我们得到:
>> Xfinal
Xfinal =
1 1 2 3 3 4 5 6 7 7 8
>> Yfinal
Yfinal =
8 7 5 2 1 5 7 9 8 8 0
>> val
val =
2 3 5 7 8 10 12 14 16 17 19
如果我们还检查ind
,我们会得到:
ind =
1
4
6
9
11
13
15
18
ind
包含那些唯一且第一次遇到的条目。这意味着val
包含那些不唯一的其他条目。您可以使用val
索引X
和Y
来检索这些非唯一值。如果您查看val
并将其与X
中的每个相应位置进行比较,您会看到这些位置与非唯一位置相对应,我们从X
和相应位置选择这些位置在Y
。
答案 1 :(得分:1)
最后三行找到完整索引列表的补充和唯一函数提供的索引。
mask = im2bw(rgb2gray(imread('http://i.stack.imgur.com/ES8w1.jpg')));
separation = bwulterode(mask,'euclidean',[0 0 0; 1 1 1; 0 0 0]).*mask;
[X, Y] = find(separation);
imshow(mask); hold on; plot(Y, X, '.r');
[Xfixed, ind] = unique(X, 'stable');
Yfixed = Y(ind);
ind_repeat=setdiff(1:1:size(X,1),ind);
Xrepeat=X(ind_repeat);
Yrepeat=Y(ind_repeat);