MATLAB:如何找到重复元素的坐标?

时间:2015-01-12 20:36:40

标签: matlab duplicates

我有两个相同大小的列向量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。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

如果ind包含Xfixed中每个唯一值的第一个位置,只需创建一个从1开始到X为止的向量,并使用ind从此向量中删除这些条目。结果将是一个包含Xfixed中非唯一条目的向量。因此,请尝试:

val = 1 : numel(X);
val(ind) = [];
Xfinal = X(val);
Yfinal = Y(val);

前两行代码正是我之前谈到过的。 val将包含那些不包含唯一元素的索引。然后,我们会使用val索引XY来抓取我们的内容,这些内容会存储到XfinalYfinal


以下是一个例子:

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);

显示valXfinalYfinal是什么,我们得到:

>> 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索引XY来检索这些非唯一值。如果您查看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);