我有一个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等的有理数。
答案 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)
使用unique
和accumarray
查找A
的每个元素的计数,过滤掉非重复值,使用ismember
获取重复值的逻辑索引然后使用find
将它们转换为线性索引。
[C, ~, ic] = unique(A);
RowValues = find(ismember(A, C(accumarray(ic,1)>1)));
为什么你的代码会得到错误的索引?
在唯一值向量上应用logical NOT会将它们转换为在唯一值为零的索引处包含true
的逻辑向量,并在其为非零时将其转换为false
,从而找到非-zero(在这种情况下为false
)这样一个向量的元素将无处可去。