Lecture 14: M/O/F/ for Engineering Applications Part 2 BJ Furman 28NOV2011 The Plan for Today Matlab/Octave/FreeMat (M/O/F) for engineering applications – part 2 Recap M/O/F key concepts Element-by-element operations (dot operator) Function examples 2D graphs File IO Resources for more information Learning Objectives Distinguish between matrix and array arithmetic, and use them appropriately Explain the differences between script files and functions Explain the basic elements of creating a 2D graph Explain how to read from and write to files Last Lecture Overview of Matlab/Octave Useful commands The array as a fundamental element creating arrays indexing elements vectors extracting sub-arrays using indexing and the colon operator special matrices colon operator linspace logspace ones(), zeros(), diag(), eye() Introduction to plotting in M/O/F via script file comparison to Ch and Excel Arrays, Vectors, and Matrices Array : Vector: A collection of data elements arranged in rows and columns A one-dimensional array (single row or single column of data elements) >> A=[1:9] >> B=[1:9]’ row or column? column vector Matrix : A two-dimensional array (more than one row and/or column of data elements) >> C=[1:3; 4:6; 7:9] C= 1 4 7 2 5 8 3 6 9 Colon Operator vs. linspace() What will the following do? D=0 : 3 : 10 base : increment : limit F=linspace(0, 10, 11) start : end : n Observations about the two methods: both methods produce vectors with equally spaced elements colon operator method allows you to specify the first element and the interval spacing between elements, but not the number of elements If just start : end, then spacing is 1 linspace method allows you to specify the first and last elements of the vector, but not the spacing between elements Review of length() and size() What will the following do? length(ones(1,3)) length returns the number of elements of the vector size(zeros(2,3)) size returns the size of the dimensions of its argument Review of Array Manipulation Given G=[2 4 6; 8 10 12], what is: G(2,3) G(: , 2) G(4) G(1,1)=0 G(1, :)=0 Observations: Array indexing begins with 1 (contrast with C) : means “all of” the elements in that dimension Extract elements by indexing Extract sub-arrays using vectors as the indexing arguments More Array Manipulation Suppose H=1:9 (what will this produce?) How could we form into a 3x3 matrix? Reshape function J=I(3:-1:1,:) Reverse the order of the columns of I (how?) I = I’ Reverse the order of the rows of I I=reshape(H,3,3) How to transpose the rows to be the columns? K=I(:, 3:-1:1) Reverse the order of all the elements of I (how?) Pseudocode: Index I in reverse order L = reshape(I(9:-1:1),3,3) Reshape Matrix and Array Arithmetic Arithmetic operators: + * / \ ^ ’ add. sub. mult. right div. left div. expon. algebr. transpose addition and subtraction are done element-by-element (same for matrix and array arithmetic) Unless one is a scalar, the operands must be of the same size scalar (matrix or array) --> ? (matrix or array) (matrix or array) --> ? (matrix or arrays) must be of the same size For the other operators, need to distinguish between matrix and array operation n columns B Matrix arithmetic operations mn per rules of linear algebra A n rows n p rows and columns must conform For example, A x B: must have column and row agreement Array arithmetic operations element-by-element Denote with dot operator: .* ./ .\ .^ .’ (array transpose) Matrix and Array Arithmetic Examples Scalar and matrix operands If L=ones(1,5) and M=ones(1,4) N = 2*L --> ? N – 1 --> ? Non-scalar operations If O = [ 1:5 ] O + M --> ? ??? Error using ==> + Matrix dimensions must agree. L * O --> ? ??? Error using ==> * (1x5 * 1x5 does not work!) Inner matrix dimensions must agree. L* O’ --> ? 15 Same as sum(L .* O) (1x5 * 5x1 works! Inner matrix dimensions agree. Results in a 1x1) Array Operations Element-by-element array operation Ex: Given a set of distances and times, calculate average speeds and maximum of averages How would you do this in C? Pseudocode: Calculate avg. speeds: speed[i] = distance[i] / time[i], for i=1 to 4 Determine maximum speed M/O/F (vectorize!): distances=[120, 213, 87, 35] (in miles) times=[ 2, 3.8, 0.9, 0.6] (in hours) speeds=distances ./ times %( note: ‘dot /’ divide element-by-element) max_speed=max(speeds) To get the maximum speed and its index: [max_speed, i] = max(speeds) Circuit Analysis Equations i2 i1 R2 +V i3 R3 Matrix operations R1 i1 i2 i3 0 Matrix division 0i1 R2 R3 i2 0i3 V Recall the circuit analysis 0i1 0i2 i3 R1 V R1=10k R2=R3=5k V=10V Matrix solution 1 0 0 1 Ri V R 1Ri R 1V i R V 1 0 R2 R3 R 1 i1 0 R1 i2 V 0 i3 V i V use ' left' division to solve for i i R \ V Think of it like inverting R and multiplying on the left side of V If we had iR = V instead, we’d use ‘right’ division to solve for i: ( i = R / V ) Think of it like inverting R and multiplying on the right side of V: i = VR-1 Circuit Analysis Solution Circuit analysis solution: Build R, build V, solve for i Build R all at once eq1 = [ 1 -1 1] eq2 = [0 0 10e3] eq3 = [0 10e3 0] R = [eq1; eq2; eq3] Build V R=[1 -1 1; 0 0 10e3; 0 10e3 0] or build by rows and combine •R1=10k •R2=R3=5k •V=10V V = [0 10 10]’ Solve I = R \ V I=R\V (note: transposed) 1 0 0 1 0 R2 R3 R 1 i1 0 R1 i2 V 0 i3 V i V Dot Product Example Another example of element-by-element operations v1 dot product of two vectors v1 3iˆ 2 ˆj 5kˆ v1 v2 v1 v2 cos( ) v2 v2 2iˆ 4 ˆj 10kˆ iˆ, ˆj, kˆ are unit vecto rs for a cartesian coordinate system their coefficien ts are called ' measure numbers' what is v1 v2? v1 v2 (3)(2) (2)(4) (5)(10) 6 8 50 52 Dot Product Function Development Define the problem Inputs v1, v2 (three-element row vectors) Outputs Create a function that will take two vectors as arguments and will return their vector dot product z (the dot product) Algorithm Multiply v1 and v2 element-by-element Sum the element-by-element products Return the sum Try it in Matlab/Oct ave : v1 [3 2 5] sum(v1 . * v 2) v 2 [2 4 10] Dot Product Function in M/O/F Write the function function [z] = dot_prod(v1, v2) % dot_prod(v1,v2) computes the vector dot product between vectors v1 and v2 % Function dot_prod(v1,v2) computes and returns the vector dot product between vectors v1 and v2 z = sum(v1.*v2); Test it out A = [ 1 2 3 ]; B = [ 4 5 6 ]; % what should A dot B result in? A_dot_B = dot_prod(A,B) Review of Functions Functions Like script M-files, but several differences: first line (function declaration) must be of the form: function [output args] = function_name(input args) variables generated in the function are local to the function, whereas for script files, variables are global must be named, ‘function_name.m’ (same as file name) Make sure you add comments at the start that describe what the function does (see example code) N Example: root-mean-square function, 2 x rms.m i Given, x [ x1 , x2 ,..., x N ] RMS i 1 N Root Mean-Square Function Development Functions, cont. Example: root-meansquare function, cont. Pseudocode: Square each element xs = x .^2 Sum the squares square each element of x sum the squares divide by N take the square root sums = sum(xs) Divide by N N = length(x) ms = sums/N N Given, x [ x1 , x2 ,..., x N ] RMS Take the square root rms = sqrt(ms) Before you write the function, make sure the name you propose is not already used! Use: which name to check xi2 i 1 N Root Mean-Square Function Implementation Functions, cont. Example: root-mean-square function, cont. H1 comment line (used in lookfor) Comments that will be displayed by help command function [y] = rms(v) % RMS(v) root mean square of the elements of the column vector v % Function rms(v) returns the root mean square of the elements % of the column vector, v vs = v.^2; % what does this line do? Also note semicolon. s = length(v); y = sqrt(sum(vs)/s); Let v=sin([0: 0.01*pi: 2*pi]’), one period of a sine wave. The RMS value of a sine wave is its amplitude*1/sqrt(2) Does rms() work with a row vector? How about a matrix? More Robust Root Mean-Square Function Functions, cont. Make rms function more robust to work with row or column vector or matrix with column vectors of data function [rmsout] = rms2(v) %RMS2(v) Root mean square of v % Function rms2(v) returns a row vector, where % each element is the rms value of values in each % column of v vs = v.^2; s = size(v); rmsout = sqrt(sum(vs,1)/s(1)); File I/O with M/O/F Data Input - simplest method load command Ex: load(‘data_file.txt’) reads on a row-by-row basis data values separated by spaces or commas and rows terminated by new line columns must have the same number of elements data is stored in workspace in an array with same name as the argument used in the load function Ex. Portland International Airport monthly rainfall load (‘PDXprecip.dat’) % must be in search path! File I/O with M/O/F, cont. Data Output - simplest method Save command Ex: save(‘data_file_name’) Saves all the variables into a .mat file named ‘data_file_name’ Many other commands are available for special purpose file I/O File I/O and Plotting Example % read data into PDXprecip matrix load('PDXprecip.dat'); % copy first column of PDXprecip into month month = PDXprecip(:,1); % and second column into precip precip = PDXprecip(:,2); % plot precip vs. month with circles plot(month,precip,'o'); % add axis labels and plot title xlabel('month of the year'); ylabel('mean precipitation (inches)'); title('Mean monthly precipitation at Portland International Airport'); file_io_example.m Adapted from: http://web.cecs.pdx.edu/~gerry/MATLAB/plotting/loadingPlotData.html visited 15NOV2009 More on Plotting Add a red line through the data Plot multiple sets of data on a single graph and add a legend grid on Sub-plots Format: subplot (m,n,p) Figure window divided into m x n matrix of plotting areas Procedure: Pick the sub-plot window Execute plot commands for that sub-plot General Format: plot (x, y, fmt, ...) % plot precip vs. month with circles plot(month,precip,'o',month,precip,'-r'); % copy first column of PDXtemperature into month month = PDXtemperature(:,1); % and second column into high_temp high_temp = PDXtemperature(:,2); % and third column into low temp low_temp = PDXtemperature(:,3); % and fourth column into avg temp avg = PDXtemperature(:,4); % generate the plot plot(month,high_temp,'ko',month,low_temp,'k+',month,avg,‘r-'); % add axis labels and plot title xlabel('Month'); ylabel('temperature (degrees F)'); title('Monthly average temperature for PDX'); % add a plot legend using labels read from the file legend('High','Low','Avg'); multi_plot.m Vector Dot Product Example Find the X and Y components of the vector, V that is, find v x and v y , so that v x v y v v v Y ĵ iˆ vy vx X ˆ v iˆ cos( ) v (1) cos( ) v cos( ) vx v i x x x v y v ˆj v y ˆj cos(90 ) v y (1) cos(90 ) v y sin( ) Back Review References Matlab. (2009, November 6). In Wikipedia, the free encyclopedia. Retrieved November 6, 2009, from http://en.wikipedia.org/wiki/Matlab Matlab tutorials: http://www.mathworks.com/academia/student_center/tutorials/launchpad.html GNU Octave. (2009, October 31). In Wikipedia, the free encyclopedia. Retrieved November 6, 2009, from http://en.wikipedia.org/wiki/GNU_Octave Octave main page: http://www.gnu.org/software/octave/ (http://octave.sourceforge.net/ access to pre-built installers) Octave tutorials: http://homepages.nyu.edu/~kpl2/dsts6/octaveTutorial.html, http://smilodon.berkeley.edu/octavetut.pdf FreeMat. http://freemat.sourceforge.net/index.html ftp://www.chabotcollege.edu/faculty/bmayer/ChabotEngineeringCour ses/ENGR-25.htm