2017-11-29 24 views
2

私は、すべての行が個々の観測値を表すパーセンテージ値を持つ行列を持っています。これらの値が同じ添字に対応する累積積を計算する必要があります。私はaccumarray関数を使用しようとしました。これは、行列ベクトルではなく値として列ベクトルを使用する限り、正常に動作します。 私のバリュー・マトリックスの個々の列をループせずに問題を解決する最良の方法は何ですか?ヴァルスのためにMATLAB:値を行列としたaccumarray(第2の入力パラメータ)

subs = [1;1;1;2;2;2;2;2;3;3;4;4;4]; 
vals1 = [0.1;0.05;0.2;0.02;0.09;0.3;0.01;0.21;0.12;0.06;0.08;0.12;0.05]; 

% This is working as expected 
result1 = accumarray(subs,vals1, [], @(x) prod(1+x) -1) 


vals2 = [vals1,vals1]; 

% This is not working as the second input parameter of accumarray 
% apperently must be a vector (rather than a matrix) 
result2 = accumarray(subs, vals2, [], @(x) prod(1+x) -1) 

答えて

0

は、あなたが1:size(vals2,1)として設定し、vals2の行を抽出するためにそれを使用することができます:

は、ここに私のサンプルコードです。また、関数がセルを返す必要があります。

result2 = accumarray(subs, 1:size(vals2,1), [], @(x) {prod(1+vals2(x,:),1)-1}) 

あなたは電池素子を連結することができる:

result3 = vertcat(result2{:}) 

またはすべてを一列に:入力として[10000 x 200]行列を用いて三の提案された方法を比較オクターブにおける試験の

result3 = cell2mat(accumarray(subs, 1:size(vals2,1), [], @(x) {prod(1+vals2(x,:),1)-1})) 

result3 = 

    0.38600 0.38600 
    0.76635 0.76635 
    0.18720 0.18720 
    0.27008 0.27008 

結果:

subs = randi(1000,10000,1); 
vals2 = rand(10000,200); 

=========CELL2MAT======== 
Elapsed time is 0.130961 seconds. 
=========NDGRID======== 
Elapsed time is 3.96383 seconds. 
=========FOR LOOP======== 
Elapsed time is 6.16265 seconds. 

Online Demo

+0

簡単な解決策のように見えていませんあなたはndgridを使用して2次元の添字の新しいセットを生成することができます。それは働いていますが、imhoではaccumarray関数の読みやすさが低下します。その場合、私は単純なfor-loopソリューションを好むと思います。
'0'の場合:'result2(:、i)= accumarray(subs、vals2(:、i)、[]、@(x)prod(1 + x) - 1); ' ' end' – Andi

+0

forループソリューションは、列数が多い場合には効率が悪い場合があります。 – rahnema1

+0

ええと、私の場合、列の数は10,000までになる可能性があります。 – Andi

0

あなたは(それがN×2となるように)依然としてN要素ベクトルとして渡されなければならないあなたの2Dデータを、処理するためsubsに添字の第2のセットを追加する必要がある(すなわち、 subsの各行に1つの要素)。

[subs1, subs2] = ndgrid(subs, 1:size(vals2, 2)); 
result2 = accumarray([subs1(:) subs2(:)], vals2(:), [], @(x) prod(1+x) -1) 

そして、あなたのサンプルデータと結果:

result2 = 

    0.3860 0.3860 
    0.7664 0.7664 
    0.1872 0.1872 
    0.2701 0.2701 
+0

'vals2'の列数が可変であれば' ngrid'の出力引数をどのように定義しますか? – Andi

+0

@Andi:まさに私が上記のコードで行っていることです。 'ndgrid'の2番目の引数は、1から' size(vals2,2) '(つまり' vals2'の列数)のベクトルです。 – gnovice

関連する問題