2013-04-22 24 views
9

1が優れている、すべての*fun機能(arrayfuncellfunstructfunspfun)を使用して、または単にforループを使用していますか?Matlabの:簡単な対arrayfun、関数cellfun、spfunとstructfun forループ

どのような方法でパフォーマンスが向上し、どのメソッドをコードの可読性という観点から見ればよいでしょうか?

+4

関連質問:[arrayfunはMathWorks社のMATLABでの明示的なループよりも大幅に遅くなる可能性があります。なぜですか?](http://stackoverflow.com/questions/12522888/arrayfun-can-be-significantly-slower-than-an-explicit-loop-in-matlab-why) –

+2

関連[回答](http: /stackoverflow.com/a/15181321/1714410) – Shai

+0

私は、MATLABのリリースではかなり醜いと言います。私のケースでは、MATLAB R2012aはほとんどforループを使用しています – fpe

答えて

16

それは本当にあなたが「パフォーマンス」と呼んでいるものに依存します:)

あなたは最小実行時間を意味している場合、まあ、時々*funが速く(例えば、cellfun('isempty', ...);(はい、文字列引数!)確かビートのためにありますループバージョン)。ループが速いこともあります。 Matlabバージョン< 2006をお持ちの場合は、デフォルトで*fun関数に移動してください。もっと新しいものがある場合は、デフォルトでループを行ってください。どちらが速いのかを知るためには、常にプロファイルを作成する必要があります。

アムロで述べたように、あなたがFP演算を行うことが可能GPU、およびGPGPUをサポートしていますMatlabの最近のバージョンを使用している場合は、その後、gpuArray入力のarrayfunへの呼び出しは、大規模並列化されます。ただし、実行時間を考慮して一般的なステートメントを作成することはできません。小規模な配列や完全に湿ったものに対しては、GPUにすべてをコピーするオーバーヘッドが計算を並列化するというメリットを元に戻すかもしれないので、プロファイリングは本当に確実に知る唯一の方法です。

コーディング最小単位の場合は、操作が簡単である限り、通常は*funという用語でコーディングする方が高速です。何か複雑なことがあれば、通常はループの方がいいです。

あなたは最適な読みやすさを意味する場合は、プロのコンテキストの変化の整備と実施のために必要なので、最小時間は、確かに、ループのために行きます。この時点で

は、本当にあなたの質問:)への明確な単純な答えがありません

関連する問題