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 RulesMatrix 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 RulesMatrix 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 VariablesCan 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 MatricesWe 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
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
2nd Derivative 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 reefhttp://www.georgedreher.2e.com/3D_Seismic.html
3D image of Yucca Mountain unsaturated zonehttps://meshing.lanl.gov/
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 2DYou 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
Final ThoughtsMATLAB 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)