2

配列があるとします

A = zeros([1,10]);

重複の可能性があるいくつかのインデックスがあります。

indSeq = [1,1,2,3,4,4,4];

インデックス シーケンスA(i)の の数を増やすにはどうすればよいでしょうか。iA(1) = 2, A(2) = 1, A(3) = 1, A(4) = 3

コードA(indSeq) = A(indSeq)+1が機能しません。

次の for ループを使用して目標を達成できることはわかっていますが、for ループを回避できる方法はあるのでしょうか? indSeqがソートされていると仮定できます。

for ループ ソリューション:

for i=1:length(indSeq)
  A(indSeq(i)) = A(indSeq(i))+1;
end;
4

3 に答える 3

3

accumarrayこのようなラベルベースのカウントジョブに使用できます-

accumarray(indSeq(:),1)

ベンチマーク

で提案されているように、other answerも使用できますhist/histc。大きなデータサイズについて、これら 2 つのベンチマークを実行してみましょう。私が使用したベンチマーク コードには -

%// Create huge random array filled with ints that are duplicated & sorted
maxn = 100000;
N = 10000000;
indSeq = sort(randi(maxn,1,N));

disp('--------------------- With HISTC')
tic,histc(indSeq,unique(indSeq));toc

disp('--------------------- With ACCUMARRAY')
tic,accumarray(indSeq(:),1);toc

ランタイム出力 -

--------------------- With HISTC
Elapsed time is 1.028165 seconds.
--------------------- With ACCUMARRAY
Elapsed time is 0.220202 seconds.
于 2015-12-17T06:54:58.383 に答える
1

これはランレングス エンコーディングであり、次のコードでうまくいくはずです。

A=zeros(1,10);
indSeq = [1,1,2,3,4,4,4,7,1];
indSeq=sort(indSeq); %// if your input is always sorted, you don't need to do this
pos = [1; find(diff(indSeq(:)))+1; numel(indSeq)+1];
A(indSeq(pos(1:end-1)))=diff(pos)

返す

A =
     3     1     1     3     0     0     1     0     0     0

このアルゴリズムは、Luis Mendo によって MATL 用に作成されました。

于 2015-12-17T03:29:57.690 に答える
1

あなたが探しているのは、配列の一意の値の出現回数だと思います。これは、次の方法で実現できます。

[num, val] = hist(indSeq,unique(indSeq));

あなたの例の出力は次のとおりです。

num = 2 1 1 3
val = 1 2 3 4

したがって、num は val が発生する回数です。つまり、あなたの例では1が2回発生します

于 2015-12-17T04:45:01.433 に答える