2012-06-12 4 views
0

Je calcule le comportement PT1 dans Matlab en utilisant le vecteur d'entrée u:Matlab supprimer boucle pour calculer 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 

Comment puis-je retirer la boucle pour obtenir le même résultat?

+0

il y a une relation avec les valeurs précédentes de x dans le calcul de x (i), donc vous ne pouvez supprimer la boucle que si vous supprimez cette relation et explicite x (i) –

+0

Je pensais que l'utilisation de cumsum ou quelque chose de similaire pouvait aider? – Philipp

Répondre

3

Ceci est en fait un premier ordre filtre IIR, de sorte que vous pouvez utiliser filter pour que:

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

Si vous écrivez x (i) pour un couple de valeurs, vous verrez un modèle dans il:

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) 
... 

vous repérerez facilement l'être motif:

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

qui est maintenant explicite f onction.

Vous pouvez l'appliquer pour supprimer votre boucle, mais en réalité, cette fonction explicite doit elle-même calculer une somme importante. Faire cela pour chaque index de x prend probablement plus de temps que de boucler et de réutiliser les résultats précédents.

+0

Je ne pense pas que ce soit plus lent qu'une boucle 'for', mais clairement [convolution] (http://www.mathworks.com/help/techdoc/ref/conv.html) serait une meilleure approche que celle-ci. –

+0

@EitanT Je pense toujours à un moyen d'écrire simplement ceci avec quelques opérations vectorisées, mais je ne peux pas en trouver immédiatement une; d'où la remarque sur la vitesse. Une application directe d'un filtre existant est en effet plus appropriée. –

+0

Il n'y a pas besoin de solutions de contournement, puisque cette somme est la définition même de [convolution] (http://en.wikipedia.org/wiki/Convolution#Discrete_convolution) :) –