2017-03-10 9 views
1

MATLABのaccumarrayは、多くのアプリケーションで信じられないほど強力です。私の問題は、自分の入力に適用するaccumarray関数が3つの出力を持ち、accumarrayがスカラー出力しか扱えないということです。私はちょうどaccumarray 3回実行することができますが、私の機能が遅く、実行していると仮定しaccumarrayを使って行列を出力する

1.0000 1.0000   0 1.0000 1.0000 
1.0000 1.5000   0 3.0000 1.0000 
1.0000 2.0000   0 5.0000 1.0000 

subs = [1;2;4;2;4;5]; 
vals = [1;1;1;2;5;1]; 
accumarray(subs, vals, [], @(x)[min(x),mean(x),max(x)],0) 

accumarrayリターンを持っている:例えば、私はこのような何かをしたいと思いますaccumarrayは3回実行するよりもはるかに高速です。私はちょうどここに縛られていますか

+0

Statistics toollboxの[grpstats](https://www.mathworks.com/help/stats/repeatedmeasuresmodel.grpstats.html)を使用するか、[regionprops](https://www.mathworks)を使用することができます。ライセンスをお持ちの場合は、画像処理ツールボックスのcom/help/images/ref/regionprops.html)をご覧ください。 – rahnema1

+0

@ rahnema1、min/mean/maxは、私の問題を示すための具体的な例に過ぎませんでした。私の実際の関数accumarrayはmin/mean/maxとは全く異なるので、grpstatsは私を助けません。私は毎日regionpropsを使用しますが、私はあなたが何を記述しているのか分かりません。 – John

+0

regionpropsを使用して、リージョンの統計プロパティを見つけることができます。使用法: 'stats = regionprops(subs、vals、 'MaxIntensity'、 'MeanIntensity'、 'MinIntensity')'。あなたが実際に使っているaccumarrayの関数がmin/mean/maxと全く違うので、regionpropsも役に立ちません。 – rahnema1

答えて

3

匿名関数出力をセル配列の代わりに単一の値にすることはできません。このようにして、accumarrayは行列のセル配列を与えます。完了したら、すべての行列を1つの行列に連結することができます。あなたの提案されている無名関数は、行ベクトルとしてmin,maxmeanですが、期待される結果はの列ベクトルです。したがって私はこれをあなたの無名関数の中に入れ替えました。

私たちが考慮する必要があるのは、塗りつぶし値です。指定した塗りつぶし値は、スカラーである必要があります。したがって、これを残すことで不正行為を行うことができますが、結果には0で埋め込まれた結果の行の代わりに、空の行列がセルに含まれます。空のすべてのセルを見つけ出し、あなたが完了したら、それをすべてまとめてください。 accumarray出力のどの行が空になるか把握するには、cellfunisemptyを組み合わせて使用​​して、結果のどの要素が空であるかを調べることができます。これを行うには滑らかな印象の方法はzerosの最初の事前に割り当て行列になり、その後にのみ、それを仕上げるためaccumarrayの出力に非空の位置に対応する行を移入:

subs = [1;2;4;2;4;5]; 
vals = [1;1;1;2;5;1]; 
out = accumarray(subs, vals, [], @(x){[min(x),mean(x),max(x)].'}); 
ind_empty = cellfun('isempty', out); 
out_final = zeros(3, numel(out)); 
out_final(:, ~ind_empty) = cat(2, out{:}); 

テイクノートの指定された次元で行列を連結するcatの使用。 out{:}を実行すると、comma-separated listという名前が生成されますので、accumarrayの各列を個別の引数としてcatに入れて、すべての列をまとめて1つの行列にまとめるのと同じですが、私はスライスしています空ではない場所にデータを入力するような方法で出力に出力します。あなたのテスト入力して

、私はあなたが得るものと一致:

>> out_final 

out_final = 

    1.0000 1.0000   0 1.0000 1.0000 
    1.0000 1.5000   0 3.0000 1.0000 
    1.0000 2.0000   0 5.0000 1.0000 

しかし、私は正直に言うことができるかどうか - あなたが唯一のビンに三つの値を持っているとしていることを確かに知っている場合accumarrayに入れると、それを3回呼び出すだけで、完了したらすべてを連結する方が速いかもしれません。私はそれがより読みやすく、あなたがしていることを非常に明確にしていると主張します。上のセル配列で行ったように、MATLABの動作を実際に知る必要があります。