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

 Réponse acceptée

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)];

Plus de réponses (1)

Stephen23
Stephen23 le 21 Juin 2016
Modifié(e) : Stephen23 le 21 Juin 2016
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.

Catégories

En savoir plus sur Genomics and Next Generation Sequencing dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by