2016-10-07 17 views
0

私は入力としてベクトルを持つ関数を持っています。前のステップの出力を使って各要素に関数を適用したいと思います。私はforループを実装しています:関数を使ったforループのOctave/Matlabベクトル化

function res = myFunc(F) 
if (numel(F) == 1) 
    res = F(1); 
    return; 
end; 
B = F(1); 
for idx = 2:numel(F) 
    B = procAcc(F(idx),B); 
res = B;  
end 

関数procAccは2つのパラメータをとり、出力を生成します。つまり、入力がベクトル(f1、f2、f3)ならば、関数procAcc(f1、f2)を最初に適用し、結果(res)を生成し、次のステップで関数procAccを適用します最終的な結果が得られます。私の質問は、Matlab(またはOctave)がforループをスキップできるベクトル化手法をサポートしているかどうかです。

+3

'myFunc'ではなく' procAcc'をベクトル化する必要があります。 – excaza

答えて

0

この場合、要素iの計算は要素i-1に依存するため、「ベクトル化」は使用できません。あなたの計算は連鎖する必要があります。代わりに機能的なアプローチを試してみてください。「地図作成」は強力なコンセプトであり、さまざまなケースに適用できます。 Octaveではネイティブ関数がないようですが、this答えはreduce関数を提供するパッケージを参照しています。

res = reduce(@(x,y)(procAcc(x,y)), F); 

一般のMapReduceはforループの上にいくつかのパフォーマンス上の利点を提供しますが、提供パッケージの実装に依存します現在の場合:あなたはそれを使用する場合は、forループは、このようなものに置き換える必要がありますreduce機能です。

関連する問題