Vectorized Code

advertisement
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)
Download