这里有一个更便宜的选择:
[s ii] = sort(a);
x = [false s(2:end)==s(1:end-1)]
y = [x(2:end)|x(1:end-1) x(end)]
z(ii) = y;
result = a(z);
假设输入为
a =
1 1 8 8 3 1 4 5 4 6 4 5
我们对列表
s
进行排序,并获取排序后的列表索引
ii
。
s=
1 1 1 3 4 4 4 5 5 6 8 8
我们可以找到重复元素的索引,方法是检查一个元素是否等于前一个元素。
x =
我们无法翻译没有上下文的内容,请提供更多信息。
0 1 1 0 0 1 1 0 1 0 0 1
但是在x
中,每个块的第一个元素被省略了。为了找到它,我们可以在每个元素与前一个元素之间应用[or]
y =
1 1 1 0 1 1 1 1 1 0 1 1
我们现在已经对重复元素进行了逻辑索引排序。它应该按照原始顺序重新排序。为此,我们使用已排序元素的索引
ii
:
z =
1 1 1 1 0 1 1 1 1 0 1 1
最后使用z提取出仅重复的元素。
result =
1 1 8 8 1 4 5 4 4 5
以下是Octave*测试的结果,针对以下输入:
a = randi([1 100000],1,10000000);
-------HIST--------
Elapsed time is 5.38654 seconds.
----ACCUMARRAY------
Elapsed time is 2.62602 seconds.
-------SORT--------
Elapsed time is 1.83391 seconds.
-------LOOP--------
Doesn't complete in 15 seconds.
*由于Octave中尚未实现histcounts
函数,所以我使用了hist
函数。
您可以测试它 在线