How to vectorize matrixvector multiplications with previous-dependent input?

How to avoid the for loop in the following code, creating a 2D polymer structure with a new random created bending angle of the following segment:
N=10;
K=200;
Xi=50;
l=0.311;
Fi=normrnd(0,sqrt(l/Xi),[1,1,K])
dna=zeros(2,K);
t=ones(2,K);
for i=2:K
A=[cos(Fi(i)) -sin(Fi(i));sin(Fi(i)) cos(Fi(i))]
t(:,i)=A*t(:,i-1);
dna(:,i)=dna(:,i-1)+t(:,i);
end

 Accepted Answer

The for-loop can be eliminated, but I doubt that it will save you any time.
K = 200;
Xi = 50;
l = 0.311;
t = [rand(2,1),zeros(2,K-1)]; % <-- You choose t(:,1)
Fi = normrnd(0,sqrt(l/Xi),[1,1,K])
Gi = cumsum(reshape(Fi(1,1,2:K),1,[]),2); % cumsum the angles in Fi
sG = sin(Gi);
cG = cos(Gi);
t(1,2:K) = cG*t(1,1)-sG*t(2,1);
t(2,2:K) = sG*t(1,1)+cG*t(2,1);
dna = [zeros(2,1),cumsum(t(:,2:K),2)];

More Answers (1)

Most of the operations can be moved out of the loop:
t = ones(2,K);
B = [cos(Fi),-sin(Fi);sin(Fi),cos(Fi)];
for k = 2:K
t(:,k) = B(:,:,k) * t(:,k-1);
end
t(:,1) = 0;
dna = cumsum(t,2);
but because of the mtimes * the t calculation is easiest to do in a loop.

Categories

Find more on Genomics and Next Generation Sequencing in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!