460 likes | 592 Views
Vectorized Code. Chapter 5. Vectorized Code: Speeding Up MATLAB. 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
E N D
Vectorized Code Chapter 5
Vectorized Code: Speeding Up MATLAB • 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 ‘Snip!’
Remember This One? Calculate a Sum • 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?
Race #1: Sum vs. For Loop • Use tic toc to time each method for summing numbers • Both give the same answer
Race #1: Sum vs. For Loop • Use tic toc to time each method for summing numbers • Both give the same answer I pity the fool that doesn’t vectorize MATLAB code
Refresher: Matrix Math Rules 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
Refresher: Matrix Math Rules Matrix Multiplication/Division • If A is 3x2 and B is 2x3 [ 3 x 2 ] * [ 2 x 3 ] • 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
Array Operations • 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
Race #2: Array Operation vs. For Loop • 100 million temp measurements in °F • Convert to °F • Plots results to see if results are the same
Race #2: Array Operation vs. For Loop • 100 million temp measurements in °F • Convert to °F • Plots results to see if results are the same I pity the fool that doesn’t pre-allocate matrices!!
Race #2: Array Operation vs. For Loop • 100 million temp measurements in °F • Convert to °F • Plots results to see if results are the same I pity the fool that doesn’t vectorize MATLAB code!!
Vectorize This: Add Entries in a Matrix • Add 4 to all entries in a vector • How could we re-write this without using the loop? • Scalar operation!
Vectorize This: Multiply Matrix Entries • Multiply entries of two matrices together • How could we re-write this without using the loop? • Use an array operation!
Vectorize This: Grab Column of Matrix • Grab and store a column from a matrix • How could we re-write this without using the loop?
Vectorize This: Function Arguments • What about function arguments? • Functions should be written to handle either scalars or matrices/vectors
Vectorize This: Function Arguments • What about function arguments? • Functions should be written to handle either scalars or matrices/vectors • How can we get rid of the for loop?
Vectorize This: Function Arguments • 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…
Logical Variables Can we vectorize conditional statements? • Yes! • Recall that MATLAB offers a variable type called “logical” • Can only have two values • 0 = False • 1 = True
Logical Variables: A Quick Review 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
Logical Vectors: A Quick Overview 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
Logical Matrices 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?
Logical Vectors: A Word of Caution Why does C not do what you expect? The variable doing the indexing must of class=logical
Vectorizing Conditional Statements • Using logical vectors, we can vectorize conditional statements that would normally require a loop
Vectorizing Conditional Statements • How can I test only one column?
Vectorize This: Conditional Statement • Loops through “dat” • Stores all values > 3 in “newDat”
Vectorize This: Conditional Statement • Loops through “dat” • Stores all values > 3 in “newDat”
Race #3: Logical Indexing vs. Loop + If Finds: • Vals > 5 in col 1 • Vals < 5 in col 2 Prints times
Race #3: Logical Indexing vs. Loop + If • Vectorized Code wins again
Built-in Logical Functions • 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
Built-in Function: Diff • 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
Built-in Function: Diff • Diff can also accept matrices as arguments • Returns the differences of successive rows
Calculating Approximate Derivatives • 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?
Calculating Approximate Derivatives • What if data spacing ≠ 1? • Must calculate • Where should y’ data be plotted?
Calculating Approximate Derivatives “diff” can also calculate 2nd, 3rd, or nth derivatives • Lose one data point per derivative
1st Derivative Example • y’ = dy/dx = Slope = rise/run = diff(x) ./ diff(y) • Note that the y’ values should be plotted at the midpoints of x
1st Derivative Example • y’ = dy/dx = Slope = rise/run = diff(x) ./ diff(y) • Note that the y’ values should be plotted at the midpoints of x
2ndDerivative Example • “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?
2nd Derivative Example • 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)
Built-in Function: meshgrid • 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/
Grid of XY Points? • This is NOT the way to do it! • Lets try a nested for loop
Grid of XY Points: Nested For Loops • 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, θ, ϕ)
Grid of XY Points: meshgrid • 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!
Grid of XY Points: meshgrid • meshgrid returns rectangular matrices • Often, we want data in columns • Col 1: X-Values; Col 2: Y-Values • Use “reshape” to get in cols
Grid of XYZ Points: meshgrid • meshgrid can also make 3D grids! • Returns 3D matrices (refer to CH1 in Attaway & lecture notes) meshgrid will also accept x,y,z ranges using the “linspace” function
Grid of XY Points: meshgrid • Meshgrid will also accept ranges using the “linspace” function
Final Thoughts MATLAB is a bit of an unusual programming language • Most languages rely heavilyon 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)