2016-10-07 82 views
0

我有一個函數,它有一個向量作爲輸入,我想用前一步的輸出將函數應用於每個元素。我已經實現了一個for循環:具有函數的for循環的八度/ 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接受兩個參數併產生一個輸出。也就是說,如果輸入是一個向量(f1,f2,f3),我首先應用procAcc函數(f1,f2),它會產生一個結果(res),並且在下一步中我將函數procAcc(a3,res ),產生最終結果。我的問題是,如果Matlab(或Octave)支持向量化方法,可以讓我跳過for循環。

+3

你需要矢量化'procAcc',而不是'myFunc' – excaza

回答

0

在這種情況下,您不能使用「矢量化」,因爲元素i的計算取決於元素i-1。你的計算必須被鏈接。相反,嘗試使用功能方法 - 「mapreduce」是一個強大的概念,適用於各種情況。在Octave中似乎沒有本地函數,但this回答引用提供了reduce函數的程序包。如果你使用它,在for循環應該是這樣的替換:

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

常用的MapReduce提供了一個for環路一些性能優勢,但在目前的情況下,這將取決於提供的包執行reduce函數。