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

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;

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

clf
subplot(3,1,1),  plot(Z),  ylabel('input Z')
subplot(3,1,2),  plot(V),  ylabel('V')
d  =  abs(y-V);  d(d==0)  =  %nan;
subplot(3,1,3),  plot2d("nl",d),  title('filter() - V')
_______________________________________________
users mailing list
[email protected]
http://lists.scilab.org/mailman/listinfo/users

Reply via email to