如何在矩阵中找到重复的值以及它们属于哪些行?

时间:2018-05-19 06:01:48

标签: matlab matrix duplicates

我有一个m-by-1矩阵A。我想找出哪些元素是重复的并获取它们的行值。 (只是行值,因为矩阵是m-by-1。)

我试过

k = find(~unique(A));

但是k包含错误的值。

这是我正在尝试做的一个例子。考虑数组A;

A = [4
     5
     5
     5
     7
     8
     4];

由于4和5是重复的元素,我想得到这些元素的行值并将它们放在一个新的数组中。结果数组将是

RowValues= [1
            2
            3
            4
            7];

注意:上面只是一个例子,我正在处理的实际数组包含数组A中类型-0.0038,1.3438等的有理数。

2 个答案:

答案 0 :(得分:4)

以下是使用intersect的解决方案:

s = sort(A);
c = intersect(s(1:2:end),s(2:2:end));
RowValues = find(ismember(A,c));

我使用@SardarUsama提出的方法compared使用Octave中的大[1 x 10000000]输入。结果如下:

=======INTERSECT==========
Elapsed time is 1.94979 seconds.

=======ACCUMARRAY==========
Elapsed time is 2.5205 seconds.

答案 1 :(得分:2)

使用uniqueaccumarray查找A的每个元素的计数,过滤掉非重复值,使用ismember获取重复值的逻辑索引然后使用find将它们转换为线性索引。

[C, ~, ic] = unique(A);    
RowValues = find(ismember(A, C(accumarray(ic,1)>1)));

为什么你的代码会得到错误的索引?
在唯一值向量上应用logical NOT会将它们转换为在唯一值为零的索引处包含true的逻辑向量,并在其为非零时将其转换为false,从而找到非-zero(在这种情况下为false)这样一个向量的元素将无处可去。