Chapter 5 • Loops are common in most programming languages • Plus side: Are very fast (in other languages) & easy to understand • Negative side: Require a lot of code • Loops in MATLAB are not so fast • MATLAB provides a ton of ways to avoid using loops • For most problems (< 1e6 data, or so), loops are fast enough • Vectorizing: The process of converting what would normally be done in a loop to use array operations, and/or built-in MATLAB functions • The plus side: Code runs faster. Often easier to write • The negative side: All of this ONLY works in MATLAB • Lets mimic the behavior of the MATLAB function “sum” • Use a for loop • Which is faster? • The loop • The built-in sum function • Why is the sum function provided? • Use tic toc to time each method for summing numbers • Both give the same answer • Use tic toc to time each method for summing numbers • Both give the same answer Matrix Addition/Subtraction • Both must have same dimensions • Add each pair of corresponding elements • Result has same dimensions • Can add a scalar to a matrix • Would require a loop in most programming languages • Is automatic in MATLAB • Called a “scalar operation” • Adds scalar to each element Matrix Multiplication/Division • If A is 3x2 and B is 2x3 [3x2]*[2x3] • Red box: must be equal • Blue box: Result is 3x3 • Can multiply a matrix by a scalar • Would require a loop in most programming languages • Is automatic in MATLAB • Called a “scalar operation” • Multiplies each element by the scalar • Say you wanted to multiply each entry in one matrix by a corresponding value in another matrix • In most programming languages, this would require a loop • In MATLAB, you can use an array operation • * = matrix multiplication • .* = array multiplication • 100 million temp measurements in °F • Convert to °F • Plots results to see if results are the same • 100 million temp measurements in °F • Convert to °F • Plots results to see if results are the same • 100 million temp measurements in °F • Convert to °F • Plots results to see if results are the same • Add 4 to all entries in a vector • How could we re-write this without using the loop? • Scalar operation! • Multiply entries of two matrices together • How could we re-write this without using the loop? • Use an array operation! • Grab and store a column from a matrix • How could we re-write this without using the loop? • What about function arguments? • Functions should be written to handle either scalars or matrices/vectors • What about function arguments? • Functions should be written to handle either scalars or matrices/vectors • How can we get rid of the for loop? • What about function arguments? • Functions should be written to handle either scalars or matrices/vectors • Now it is vectorized! • Built-in MATLAB functions work just like this • sin, cos, tan, sum, max, min, etc… Can we vectorize conditional statements? • Yes! • Recall that MATLAB offers a variable type called “logical” • Can only have two values • 0 = False • 1 = True When converted to logical… • Any non-zero number • 1 (true) • Any zero number • 0 (false) • You can perform mathematical operations on logical values, but they are automatically converted to doubles We can convert vectors of any numeric type to logical vectors • Any non-zero entry • 1 (true) • Any zero entry • 0 (false) • You can index a vector by using a logical vector • Only entries with non-zero entries are kept We can convert matrices of any numeric type to logical matrices • Any non-zero entry • 1 (true) • Any zero entry • 0 (false) • You can index a matrix by using a logical vector • Only entries with non-zero entries are kept • Matrix is unwrapped and returned as a vector • Why? Why does C not do what you expect? The variable doing the indexing must of class=logical • Using logical vectors, we can vectorize conditional statements that would normally require a loop • How can I test only one column? • Loops through “dat” • Stores all values > 3 in “newDat” • Loops through “dat” • Stores all values > 3 in “newDat” Finds: • Vals > 5 in col 1 • Vals < 5 in col 2 Prints times • Vectorized Code wins again • MATLAB provides several built-in functions that perform logical tests all, any, find, sign • You can read the documentation for “all”, “any”, and “sign” • Lets look at what find does • Returns the linear index of all values that satisfy some condition • MATLAB provides a clever function that calculates differences in adjacent data entries. • “diff” • Is VERY useful for calculating approximate derivatives • Input matrix length=n • Output matrix length=n-1 • Diff can also accept matrices as arguments • Returns the differences of successive rows • Recall that a derivative is just a slope • Exact analytical derivatives are only possible for algebraic equations • For data, we cannot calculate exact analytical derivatives • We can calculate slopes! • Same is true for integrals. We calculate areas under datasets. • Why do I not need to calculate diff(x) in this case? • What if data spacing ≠ 1? • Must calculate ∆𝑦 ∆𝑥 • Where should y’ data be plotted? “diff” can also calculate 2nd, 3rd, or nth derivatives • Lose one data point per derivative • y’ = dy/dx = Slope = rise/run = ∆𝑦 ∆𝑥 = diff(x) ./ diff(y) • Note that the y’ values should be plotted at the midpoints of x • y’ = dy/dx = Slope = rise/run = ∆𝑦 ∆𝑥 = diff(x) ./ diff(y) • Note that the y’ values should be plotted at the midpoints of x • “diff” can also calculate approximate second or nth derivatives • Note that each time you use diff, you lose one data point • Where (at what x location) should second derivatives be plotted? • y’ = dy/dx = Slope = rise/run = ∆𝑦 ∆𝑥 = diff(x) ./ diff(y) • y’ values should be plotted at the midpoints of x • y’’ plotted at x locations (excluding first and last point) • A common task in quantitative science is to evaluate 2D or 3D spatial equations. • To do this, you need a 2D or 3D grid of (x,y,z) data points • In most programming languages: nested for loops • In MATLAB: nested for loops, or the built-in function “meshgrid” • Lets flashback to the Loops lecture notes… 3D image of a carbonate reef http://www.georgedreher.2e.com/3D_Seismic.html 3D image of Yucca Mountain unsaturated zone https://meshing.lanl.gov/ • 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, θ, ϕ) • To make a 2D grid we can also use the efficient built-in function “meshgrid” meshgrid will return: 3 matrices for 3D 2 matrices for 2D You must specify where to store all matrices, or you only get one! • meshgrid returns rectangular matrices • Often, we want data in columns • Col 1: X-Values; Col 2: Y-Values • Use “reshape” to get in cols • meshgrid can also make 3D grids! • Returns 3D matrices (refer to CH1 in Attaway & lecture notes) • Meshgrid will also accept ranges using the “linspace” function MATLAB is a bit of an unusual programming language • Most languages rely heavily on loops • So, anyone that knows how to code, knows loops well • In MATLAB: • You can use loops (a little on the slow side) • You can avoid loops using vectorized code What is best? • If data set is small (less than millions of points) • Do whichever you prefer, or is easier to write/understand • If data set is large or computation time is an issue • Use vectorized code, and built-in functions (when possible)