7

获取数组A并输出unique(A)[即 的唯一数组元素的集合A] 以及将 in 的第 i 个条目的第 i 个多重性放在其第 i 个位置的多重性数组unique(A)的最快方法是什么A

这是一口,所以这里有一个例子。鉴于A=[1 1 3 1 4 5 3],我想要:

  1. unique(A)=[1 3 4 5]
  2. mult = [3 2 1 1]

这可以通过一个乏味的 for 循环来完成,但想知道是否有办法利用 MATLAB 的数组特性。

4

3 回答 3

7
uA = unique(A);
mult = histc(A,uA);

或者:

uA = unique(A);
mult = sum(bsxfun(@eq, uA(:).', A(:)));

基准测试

N = 100;
A = randi(N,1,2*N); %// size 1 x 2*N

%// Luis Mendo, first approach
tic
for iter = 1:1e3;
    uA = unique(A);
    mult = histc(A,uA);
end
toc

%// Luis Mendo, second approach    
tic
for iter = 1:1e3;
    uA = unique(A);
    mult = sum(bsxfun(@eq, uA(:).', A(:)));
end
toc

%'// chappjc
tic
for iter = 1:1e3;
    [uA,~,ic] = unique(A);    % uA(ic) == A
    mult= accumarray(ic.',1);
end
toc

结果N = 100

Elapsed time is 0.096206 seconds.
Elapsed time is 0.235686 seconds.
Elapsed time is 0.154150 seconds.

结果N = 1000

Elapsed time is 0.481456 seconds.
Elapsed time is 4.534572 seconds.
Elapsed time is 0.550606 seconds.
于 2014-02-11T19:07:58.550 回答
2
[uA,~,ic] = unique(A);    % uA(ic) == A
mult = accumarray(ic.',1);

accumarray非常。不幸的是,unique有 3 个输出会变慢。


后期添加:

uA = unique(A);
mult = nonzeros(accumarray(A(:),1,[],@sum,0,true))
于 2014-02-11T19:33:27.633 回答
2
S = sparse(A,1,1);
[uA,~,mult] = find(S);

我在旧的新闻组线程中找到了这个优雅的解决方案。

使用Luis Mendo的基准测试N = 1000

Elapsed time is 0.228704 seconds. % histc
Elapsed time is 1.838388 seconds. % bsxfun
Elapsed time is 0.128791 seconds. % sparse

(在我的机器上,accumarray结果Error: Maximum variable size allowed by the program is exceeded.

于 2017-02-06T22:08:51.893 回答