Chapter 5. Loops are common in most programming languages Plus side: Are very fast (in other...

46
Vectoriz ed Code Chapter 5

Transcript of Chapter 5. Loops are common in most programming languages Plus side: Are very fast (in other...

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

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 2Prints 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

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?• 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 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

Grid of XY Points: meshgrid• Meshgrid will also accept 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)