1 / 46

Vectorized Code

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

matty
Télécharger la présentation

Vectorized Code

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Vectorized Code Chapter 5

  2. 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!’

  3. 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?

  4. Race #1: Sum vs. For Loop • Use tic toc to time each method for summing numbers • Both give the same answer

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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!!

  11. 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!!

  12. 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!

  13. 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!

  14. Vectorize This: Grab Column of Matrix • Grab and store a column from a matrix • How could we re-write this without using the loop?

  15. Vectorize This: Function Arguments • What about function arguments? • Functions should be written to handle either scalars or matrices/vectors

  16. 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?

  17. 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…

  18. 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

  19. 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

  20. 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

  21. 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?

  22. Logical Vectors: A Word of Caution Why does C not do what you expect? The variable doing the indexing must of class=logical

  23. Vectorizing Conditional Statements • Using logical vectors, we can vectorize conditional statements that would normally require a loop

  24. Vectorizing Conditional Statements • How can I test only one column?

  25. Vectorize This: Conditional Statement • Loops through “dat” • Stores all values > 3 in “newDat”

  26. Vectorize This: Conditional Statement • Loops through “dat” • Stores all values > 3 in “newDat”

  27. Race #3: Logical Indexing vs. Loop + If Finds: • Vals > 5 in col 1 • Vals < 5 in col 2 Prints times

  28. Race #3: Logical Indexing vs. Loop + If • Vectorized Code wins again

  29. 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

  30. 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

  31. Built-in Function: Diff • Diff can also accept matrices as arguments • Returns the differences of successive rows

  32. 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?

  33. Calculating Approximate Derivatives • What if data spacing ≠ 1? • Must calculate • Where should y’ data be plotted?

  34. Calculating Approximate Derivatives “diff” can also calculate 2nd, 3rd, or nth derivatives • Lose one data point per derivative

  35. 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

  36. 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

  37. 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?

  38. 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)

  39. 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/

  40. Grid of XY Points? • This is NOT the way to do it! • Lets try a nested for loop

  41. 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, θ, ϕ)

  42. 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!

  43. 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

  44. 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

  45. Grid of XY Points: meshgrid • Meshgrid will also accept ranges using the “linspace” function

  46. 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)

More Related