Presentation on theme: "Chapter 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."— Presentation transcript:
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 for loopVar = range action(s) end 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
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 re- allocated 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 pre- allocates 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 for loopVar1 = range1 for loopVar2 = range2 action(s) end The outer loop. “loopVar1” is iterated over “range1” The inner loop. “loopVar2” is iterated over “range2”
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 while condition action(s) end 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).
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?