2012-06-12 26 views
0

我使用的輸入向量u計算在Matlab PT1行爲:Matlab的去除循環計算PT1

u(20:50,1) = 2; 
k = 0.8; 
x=zeros(50,1); 
for i=2:size(u,1) 
    x(i) = k*x(i-1) + (1-k)*u(i); 
end 

如何刪除for循環得到同樣的結果呢?

+0

在x(i)的計算中存在與以前x值的關係,所以只能刪除循環,如果刪除此關係並且顯式x(i) –

+0

我認爲使用cumsum或類似的東西可能會有所幫助? – Philipp

回答

3

這實際上是一階IIR濾波器,所以你可以使用filter爲:

u(20:50, 1) = 2; 
k = 0.8; 
x = filter(1 - k, [1, -k], u); 
0

如果你寫X(我)出來的一對夫婦的價值觀,你會看到在一個模式它:

x(1) = 0; % since the loop starts at i=2 
x(2) = k*x(1) + (1-k)*u(2) 
    = 0  + (1-k)*u(2) 
x(3) = k*x(2) + (1-k)*u(3) 
    = k*(1-k)*u(2) + (1-k)*u(3) 
x(4) = k*x(3) + (1-k)*u(4) 
    = k^2*(1-k)*u(2) + k*(1-k)*u(3) + (1-k)*u(4) 
... 

所以你會很容易發現的圖案是:

x(i) = (1-k) * sum(k^(i-j)*u(j), j=2..i) 

現在是一個明確的˚F結。

你可以應用這個去除你的循環,但實際上這個顯式函數本身必須計算一個大數。針對x的每個索引執行此操作所需的時間可能比循環和重新使用之前的結果所需的時間要多。

+0

我不認爲這比'for'循環慢,但很清楚[卷積]會比這更好的方法。 –

+0

@EitanT我仍然想着一種簡單的寫幾個向量化操作的方法,但不能立即想出一個;因此有關速度的評論。現有過濾器的直接應用確實更合適。 –

+0

有沒有必要的解決方法,因爲這個總和是[卷積](http://en.wikipedia.org/wiki/Convolution#Discrete_convolution)的當然定義:) –