1が優れている、すべての*fun
機能(arrayfun
、cellfun
、structfun
とspfun
)を使用して、または単にfor
ループを使用していますか?Matlabの:簡単な対arrayfun、関数cellfun、spfunとstructfun forループ
どのような方法でパフォーマンスが向上し、どのメソッドをコードの可読性という観点から見ればよいでしょうか?
1が優れている、すべての*fun
機能(arrayfun
、cellfun
、structfun
とspfun
)を使用して、または単にfor
ループを使用していますか?Matlabの:簡単な対arrayfun、関数cellfun、spfunとstructfun forループ
どのような方法でパフォーマンスが向上し、どのメソッドをコードの可読性という観点から見ればよいでしょうか?
それは本当にあなたが「パフォーマンス」と呼んでいるものに依存します:)
あなたは最小実行時間を意味している場合、まあ、時々*fun
が速く(例えば、cellfun('isempty', ...);
(はい、文字列引数!)確かビートのためにありますループバージョン)。ループが速いこともあります。 Matlabバージョン< 2006をお持ちの場合は、デフォルトで*fun
関数に移動してください。もっと新しいものがある場合は、デフォルトでループを行ってください。どちらが速いのかを知るためには、常にプロファイルを作成する必要があります。
アムロで述べたように、あなたがFP演算を行うことが可能GPU、およびGPGPUをサポートしていますMatlabの最近のバージョンを使用している場合は、その後、gpuArray
入力のarrayfun
への呼び出しは、大規模並列化されます。ただし、実行時間を考慮して一般的なステートメントを作成することはできません。小規模な配列や完全に湿ったものに対しては、GPUにすべてをコピーするオーバーヘッドが計算を並列化するというメリットを元に戻すかもしれないので、プロファイリングは本当に確実に知る唯一の方法です。
コーディング最小単位の場合は、操作が簡単である限り、通常は*fun
という用語でコーディングする方が高速です。何か複雑なことがあれば、通常はループの方がいいです。
あなたは最適な読みやすさを意味する場合は、プロのコンテキストの変化の整備と実施のために必要なので、最小時間は、確かに、ループのために行きます。この時点で
は、本当にあなたの質問:)への明確な単純な答えがありません
関連質問:[arrayfunはMathWorks社のMATLABでの明示的なループよりも大幅に遅くなる可能性があります。なぜですか?](http://stackoverflow.com/questions/12522888/arrayfun-can-be-significantly-slower-than-an-explicit-loop-in-matlab-why) –
関連[回答](http: /stackoverflow.com/a/15181321/1714410) – Shai
私は、MATLABのリリースではかなり醜いと言います。私のケースでは、MATLAB R2012aはほとんどforループを使用しています – fpe