Questions similar to this have been asked before, but I've struggled to understand the answers. I am looking to speed up my Matlab programs by avoiding for loops. I have seen the remark that Matlab is a high level programming language and so things like for loops shouldn't be necessary, but if anyone could help me figure out how to avoid them in my simple example I would very much appreciate it.
The following script simulates the motion of a pendulum quite well:
length=0.1;
g=9.81;
omega(1)=0;
theta(1)=2;
t(1)=0;
timeStep = 0.01;
t = t(1):timeStep:t(1)+(timeStep*9999);
for i=2:10000
omega(i) = omega(i-1) + (g/length)*sin(theta(i-1))*timeStep;
theta(i) = theta(i-1)+omega(i)*timeStep;
end
plot(t,theta);
xlabel('Time (s)');
ylabel('Theta (rad)');
I have figured out how to vectorize t, shown before the start of the for loop. The issue is that omega and theta are both part of two simultaneous equations, where the next value of theta needs to be calculated based on the previous value of omega, and the next value of omega needs to be calculated based on the previous value of theta.
Is it possible to do this to use vectorization instead of a for loop?
Thank you,
Kyle
P.S. This is for teaching, my students will appreciate anything that speeds up their work!

5 Kommentare

KALYAN ACHARJYA
KALYAN ACHARJYA am 19 Feb. 2021
Bearbeitet: KALYAN ACHARJYA am 19 Feb. 2021
"P.S. This is for teaching, my students will appreciate anything that speeds up their work!"
Slightly higher speed by considering preallocation of the arrays. Suggested avoid the "length" as a variable name, as MATLAB have it's own inbuilt function named as "length"
len=0.1;
g=9.81;
timeStep = 0.01;
t =0:timeStep:timeStep*9999;
omega=zeros(1,length(t));
theta=[2,zeros(1,length(t)-1)];
for i=2:length(t)
omega(i) = omega(i-1) + (g/len)*sin(theta(i-1))*timeStep;
theta(i) = theta(i-1)+omega(i)*timeStep;
end
plot(t,theta);
xlabel('Time (s)');
ylabel('Theta (rad)');
Time in my system
Elapsed time is 0.144906 seconds.
Kyle Baldwin
Kyle Baldwin am 19 Feb. 2021
Good point about length :), and thanks for the tip about pre-allocating arrays
Stephen23
Stephen23 am 19 Feb. 2021
Bearbeitet: Stephen23 am 19 Feb. 2021
"I am looking to speed up my Matlab programs by avoiding for loops. I have seen the remark that Matlab is a high level programming language and so things like for loops shouldn't be necessary"
Sometimes loops are necessary.
Sometimes loops are faster.
Sometimes vectorized code is faster.
It depends on many factors which cannot be summarized into one little nugget of advice like that.
KALYAN ACHARJYA
KALYAN ACHARJYA am 19 Feb. 2021
Bearbeitet: KALYAN ACHARJYA am 19 Feb. 2021
@Stephen Cobeldick Finally I have confirmed in this case. Sir, thanks for your valuable advices.
Kyle Baldwin
Kyle Baldwin am 19 Feb. 2021
@Stephen Cobeldick Thank you Stephen. I must admit that I was surprised when I kept seeing this advice, but I am still fairly new to this language, so I assumed it must be correct. I'll try and keep this in mind next time I can't decide whether a loop or vectors are the way to go.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

James Tursa
James Tursa am 20 Feb. 2021
Bearbeitet: James Tursa am 20 Feb. 2021

1 Stimme

No, in general you cannot vectorize loops such as this. What you are doing in this particular loop is solving a 2nd order differential equation numerically. At each step, the derivative depends on the current state. Thus, you have to iterate through the time steps to integrate from state to state. Since you don't know all of these states ahead of time, you can't vectorize the results with some type of matrix calculation. You will need to have the loop as you are currently doing. Even if you were to call a function such as ode45( ) for this, there would still be iteration loops embedded in ode45( ) to calculate the result.

1 Kommentar

Kyle Baldwin
Kyle Baldwin am 21 Feb. 2021
Thank you. I guess I let the general advice that for loops should never be used in Matlab convince me that there must be a way to vectorize it! Your answer makes sense.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Programming finden Sie in Hilfe-Center und File Exchange

Produkte

Version

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by