[Scilab-users] vector operation replacing for loop

Samuel Gougeon sgougeon at free.fr
Thu Nov 1 15:16:03 CET 2018


Le 01/11/2018 à 13:40, Samuel Gougeon a écrit :
> Hello,
>
> Le 01/11/2018 à 09:27, Heinz Nabielek a écrit :
>> Sorry, Scilab friends, I am still not fluid with vector operations.
>> Can someone rewrite the for loop for me into something much more efficient?
>>
>> n=1000;
>> Z=grand(1,n,'nor',0,1);
>> r=0.9;
>> V=Z;
>> for i=2:n;
>> 	V(i)=r*V(i-1)+sqrt(1-r^2)*Z(i);
>> end;
>>
>> The transformation generates an autocorrelated (here rho=0.9) normal distribution V from an uncorrelated normal distribution Z and eventually I will need it for very much larger n values....
>
> You may use filter(), with a feedback component (since V(i) depends on 
> the previous state V(i-1) computed at the previous step).
> However, as shown below, a quick trial shows an initial discrepancy 
> between filter() result and yours with the explicit loop.
> I don't know why. May be the setting for the initial condition should 
> be carefully considered/tuned...

This is certainly the reason. For i=1, V(i-1) is unknown and must be 
somewhat provided. The last filter() option zi is not really documented 
(i have no time to go to the reference to get clear about how "the 
initial condition relative to a "direct form II transposed" state space 
representation." works. Trying to provide a value V(0) such that 
V(1)==Z(1) decreases the initial discrepancy by a factor 10. But it is 
still non zero.

y  =  filter(sqrt(1-r^2), [1  -r],  Z,   Z(1)*(1-sqrt(1-r^2))/r);


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20181101/4ec41bbd/attachment.htm>


More information about the users mailing list