匿名関数出力をセル配列の代わりに単一の値にすることはできません。このようにして、accumarray
は行列のセル配列を与えます。完了したら、すべての行列を1つの行列に連結することができます。あなたの提案されている無名関数は、行ベクトルとしてmin
,max
とmean
ですが、期待される結果はの列ベクトルです。したがって私はこれをあなたの無名関数の中に入れ替えました。
私たちが考慮する必要があるのは、塗りつぶし値です。指定した塗りつぶし値は、スカラーである必要があります。したがって、これを残すことで不正行為を行うことができますが、結果には0で埋め込まれた結果の行の代わりに、空の行列がセルに含まれます。空のすべてのセルを見つけ出し、あなたが完了したら、それをすべてまとめてください。 accumarray
出力のどの行が空になるか把握するには、cellfun
とisempty
を組み合わせて使用して、結果のどの要素が空であるかを調べることができます。これを行うには滑らかな印象の方法は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の動作を実際に知る必要があります。
Statistics toollboxの[grpstats](https://www.mathworks.com/help/stats/repeatedmeasuresmodel.grpstats.html)を使用するか、[regionprops](https://www.mathworks)を使用することができます。ライセンスをお持ちの場合は、画像処理ツールボックスのcom/help/images/ref/regionprops.html)をご覧ください。 – rahnema1
@ rahnema1、min/mean/maxは、私の問題を示すための具体的な例に過ぎませんでした。私の実際の関数accumarrayはmin/mean/maxとは全く異なるので、grpstatsは私を助けません。私は毎日regionpropsを使用しますが、私はあなたが何を記述しているのか分かりません。 – John
regionpropsを使用して、リージョンの統計プロパティを見つけることができます。使用法: 'stats = regionprops(subs、vals、 'MaxIntensity'、 'MeanIntensity'、 'MinIntensity')'。あなたが実際に使っているaccumarrayの関数がmin/mean/maxと全く違うので、regionpropsも役に立ちません。 – rahnema1