7

配列を取得して[つまり、 の一意の配列要素のセット] と、 inの i 番目のエントリの i 番目の多重度を i 番目の場所に取る多重度配列のA両方を出力する最速の方法は何ですか。unique(A)Aunique(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 に答える