Loops

advertisement
Chapter 4
• Think back to any very difficult quantitative problem that
you had to solve in some science class
• How long did it take?
• How many times did you solve it?
• What if you had millions of data points that had to be
processed using the same solution?
• Only need to solve it once
• Tell the computer to repeat n-times
• This is the basis for the programming concept called a
loop statement
MATLAB provides two types of loops
• A counted loop
• “for”
• Used when you know ahead of time how many times some
action will be repeated
• Repeat n-times
• A conditional loop
• “while”
• Used when you do not know ahead of time how many times
some action will be repeated
• Repeat until some logical statement becomes false
• Used with a pre-defined number of iterations of the loop variable
The “for” keyword (“for” is a reserved word in MATLAB)
The loop variable, which can be any valid variable name
Traditionally, we use i, j, k, or other single letters
The range or list of values the loopVar will take on
Can be any vector, but typically the colon operator is used
The action(s) that will be performed during each iteration
The “end” keyword. Signifies that the code should go back to
beginning of the loop statement if more iterations remain
for loopVar = range
action(s)
end
• Lets make a simple
for loop to see how
everything works
• During each
iteration
• Loop variable i is
changed
• i is printed using
fprintf
• Note that the
actions must be
indented
• Makes code easier
to read
• MATLAB editor does
this automatically
• The loop variable
can change by any
increment
• Most commonly
the increment is 1
• The loop variable
can have positive or
negative values
• Most commonly
values are positive
• After loop is
complete
• Can still use the
loop variable
• Has the final value
of the loop
• The loop iterations can be
defined by any vector
• This is not typical
• Whenever possible, use the
colon operator
A common use
of a loop:
• perform an
operation on each
and every data
point, one by one.
• Doesn’t matter how
many data points
there are*
*Obviously, there is some limit based on your computer’s RAM, CPU speed, and operating system
• Lets mimic the
behavior of the
MATLAB function
“sum”
• Use a for loop
Because MATLAB code is interpreted on the fly
(i.e. not compiled into binary exe files)
• Each time the loop restarts, the whole loop must be
compiled again
• Chapter 5 will cover ways to avoid using loops (vectorization)
• For most operations, loops are still fast enough
• Each time an
entry is added
to a matrix, the
whole matrix
must be
recreated
• To calculate execution times of scripts, MATLAB provides
a timer function
• “tic” starts the timer
• “toc” stops the timer and prints the total execution time to the
command window
• Makes most sense to use in scripts/functions
• Using tic toc, we can determine if code is efficient
Each time the
loop iterates...
• velKmHr is
completely reallocated and
remade each
iteration
• This is why the
editor gives a
warning
• orange wiggly
line
Each time the
loop iterates...
• One entry in
velKmHr is
overwritten
• The whole
matrix doesn’t
need to be
remade
• Numerical results are
identical
• Second script preallocates the velKmHr
variable
• Runs > 5x faster!!!
The Take-Home Message: While most operations are very fast,
pre-allocating a matrix is easy, so you should always do it (if possible)
• A loop to find the maximum of a vector
• Can also be
accomplished with the
command “max”
• Which do you think is
faster?
• We can combine loops with Boolean logic to test if each
entry meets some criterion
• Make sure that all of
your indenting is
consistent.
• MATLAB’s editor should
do this automatically
• We can combine loops with Boolean logic tests
• Can we pre-allocate
“newData”?
• We can nest “for” loops into inner and outer
loops
• Can also be done with “while” loops
• Often useful for dealing with 2D data
The outer loop. “loopVar1” is iterated over “range1”
The inner loop. “loopVar2” is iterated over “range2”
for loopVar1 = range1
for loopVar2 = range2
action(s)
end
end
• Lets try a simple nested for loop.
• Lets try another simple nested for loop.
• This can be very handy for
making a grid of data points
• A common task in any
quantitative science
• This is NOT the way to do it!
• Lets try a nested for loop
• To make a 2D grid we need a nested for loop
• Outer loop: x-range; Inner loop: y-range
• Could even make
spherical grids
• (r, θ, ϕ)
• The “for” loop is a counted loop
• You must know the number of iterations beforehand
• What if you don’t know how many iterations there will
be?
• Use a conditional loop: the “while” loop
• Loop continues until some condition is no longer met
• Often paired with counter variables (to keep track of iterations)
• Can be used to error check, or only read part of a dataset.
• Most for loops can also be written as while loops
• Do whichever one is easiest to understand
• Typically for loops require less code
• Used with a conditional test of the loop variable
The “while” keyword (“while” is a reserved word in MATLAB)
A conditional statement to be tested at the beginning of each
loop iteration. If true, loop continues, if false, loop ends
The action(s) performed only if the condition(s) is “true”
The “end” keyword. At this point, the computer goes back to
the beginning of the while loop and re-tests the condition(s).
while condition
action(s)
end
Tests if x < 8
• If true:
• Prints out x to command
window
• If false:
• Loop terminates
• Can test more than
one condition in a
while loop
• Tests if x < 8 or y < 33
• Make sure the
condition tested will
become false
eventually
• If condition tested is
never false:
• An infinite loop
• Kill by typing ctrl+c
• May take several
tries
• What should be
added?
• If you use a while
loop to read though
a matrix/vector
• The whole
matrix/vector may
not be read
• Sometimes this is
desired
• To test which data meets some
condition for all data
• Use a for loop + if statement(s)
• Why does a while loop work here?
If we require input
from the user
• The user may input
incorrect/invalid
data
• A while loop can
check this
• Loops allow us to solve a problem once
• Tell the computer to repeat n-times
• While modern computers are VERY fast…
•
•
•
•
MATLAB is not efficient with loops*
*(not true for most other languages)
The whole loop is recompiled with each iteration
Adding entries to end of a matrix is inefficient*
*(overwriting is fast)
You should pre-allocate matrices/vectors whenever possible
• Multiple loops can be nested
• Can nest a for and while loop
• Can nest if-elseif-else statements in a loop(s)
• When nesting anything, always consistently indent
• If loops are not fast in MATLAB, what can I do?
• Vectorize your code!!
Anyone up for a game?
Download