Department of Mathematics Chinese University of Hong Kong Prepared and revised by Raymond Chan 1 1 • What is MATLAB? • MATLAB Demo 2 2 What is MATLAB? • • • • • • MATrix LABoratory Calculator Interactive Programming language Scientific computation and visualization tool Symbolic computing tool 3 3 Matrix Computations Define a matrix and vector: >> A=[1 2 3; 4 5 6; 7 8 9] >> b=[pi, exp(1), sin(0.1)] Matrix-vector multiplication: >> c=b*A >> d=A*b’ Matrix operations >> determinant=det(A) >> eigenvalue=eig(A) 4 4 2D Graphics Polar plot: t=0:.01:2*pi; polar(t,abs(sin(2*t).*cos(2*t))); Line plot: x=0:0.05:5; y=sin(x.^2); plot(x,y); Stem plot: x = 0:0.1:4; y = sin(x.^2).*exp(-x); stem(x,y) 5 5 3D Graphics Surface plot: z=peaks(25); surf(z); Mesh plot: z=peaks(25); mesh(z); Contour plot: z=peaks(25); contour(z,16); Spherical harmonic: spharm2 6 6 Symbolic Computations Differentiation: >> g=sin(x)*cos(y); >> diff(g) % differentiate w.r.t. x >> diff(g,y,3) % 3rd order partial derivative w.r.t. y Integration: >> g=(y^2-1)/(x^5+1); int(g,y) % integrate w.r.t. y 7 7 MATLAB Desktop To start MATLAB: Programs => MATLAB => MATLAB 7.12 Workspace Window: show what variables in memory Command Window: Directory Window: where you input MATLAB commands show the files in the directory History Window: record what you have done 8 8 • • • • MATLAB as Calculator Scalar Variables Vectors and Matrices Basic Matrix Operations 9 9 MATLAB as Calculator Just enter after the prompt “>>”: 2+2 100-43 3*3 5/2 2^8 log(2)*sin(pi/2) acos(-1)/exp(4) 10 MATLAB References • Upper and lower case characters are not equivalent (MATLAB is case sensitive). • Typing the name of a variable will cause MATLAB to display its current value. • MATLAB uses parenthesis ( ), square bracket [ ], and curly braces { }, and most standard characters, such as a to z, A to Z, %, ^, +, -, *, /. 11 11 MATLAB References • Type help topic to access online help on a command, function or symbol topic (e.g. help cos). Hyperlinks, indicated by underlines, are provided that will take you to related help items and the Help browser. • Use lookfor topic (e.g. lookfor cosine) if you are not certain what the name of the topic is • If you press the tab key after partially typing a function or variable name, MATLAB will attempt to complete it, offering you a selection of choices if there is more than one possible completion. 12 12 Samples of Math Operators and Functions Operators + ^ / Functions Addition sin cos Subtraction sinh cosh Multiplication floor ceil Exponentiation exp log ``Left'' division sqrt abs ``Right'' division real imag You can find that by going to : http://www.mathworks.com/help/matlab/ref/arithmeticoperators.html More general function names can be found at: http://www.mathworks.com/help/matlab/index.html 13 Scalar Variables Variables are locations to store values and results. For example, try this: >> x = 2 This assigns the value 2 to the variable x. To see what’s inside x, type: >> x Now try: >> y=4 >> x+y 14 Scalar Variables This: >> z = 3; assigns the value 3 to the variable z without printing it. You can have variable name like: X, A2, x_y Cases are sensitive: x is not the same as X 15 Built-in Variables Three built-in variables are: pi, i, j, where pi= ,i,j= -1 Not good to re-assign pi as a variable. To reset i: >> clear or >> i = sqrt(-1) 16 Who’s Who in My Memory To know what you have assigned or computed: b=2 c = [2,3,5] d = [4;1;3;-1] e = 'words, words, words' f = [7,9;8,5] who whos 17 Vectors and Matrices How to input: rvec = [1 2 3] cvec = [4 3 4 2] mat = [3 3 4 456 9 9 0] 3 3 4 4 5 6 9 9 0 cvec = [4 3 4 2] mat = [ 3 3 4 456 9 9 0] 18 Or simply: 3 3 4 4 5 6 9 9 0 rvec = [1, 2 3] cvec = [4; 3; 4; 2] mat1 = [3 3, 4; 4 5 6; 9, 9 0] Faster way of generating vectors and matrices: zeros(4,3) = 4-by-3 zero matrix ones(1,4) =[1, 1, 1, 1] eye(4,4) =4-by-4 identity matrix rand(4,1) =4-by-1 random matrix [1:4] =[1, 2, 3, 4] [start:stepsize:end] [1:0.5:3] =[1, 1.5, 2, 2.5, 3] [3:-0.5:1] =[3, 2.5, 2, 1.5, 1] 19 Controlling Output >> x=2.3909302; >> format long; x 2.390930200000000 >> format long e; x 2.390930200000000e+000 >> y=239.09302; >> format short e; y Scientific or 2.3909e+002 Exponential notation >> format short; y 239.0930 20 Controlling Output >> A=[1,2,3,4;5,6,7,8]; >> A(2,3) 7 >>A(2,:) 5 6 7 8 >> A(:,3) 3 7 >>A(2,2:4) 6 7 8 21 1 2 3 4 5 6 7 8 Some Useful Commands quit, exit diary clear help XX who whos lookfor XY clc ; % quit MATLAB log the session clear all variables in the memory help on the command XX what variables in memory size of the variables search command related to XY clear command window suppress printing comments (matlab will not read) 22 Basic Matrix Operations C = [3 1 1; 0 2 4 ; -1 0 1] d = [2 3 4] e = d' size(C) length(d) 3*C C*e C*C C\e d/C C^2 % C is a 3-by-3 matrix % d is a row vector % e is transpose of d % size of C % length of d % scalar multiplication % matrix-vector product % matrix-matrix product % solution to C x = e % solution to d = x C % square of C = C*C 23 Entry-wise Operations 3.*A A+B A–B A.*B A./B A.^2 A+3 = 3*A = A+B = A-B = ai,j * bi,j = ai,j / bi,j = ai,j * ai,j = ai,j + 3 24 MATLAB notation Right division: a/b Left division : a\b Mathematical equivalent a/b b/a Elementary matrix and array operations: Operation Matrix sense Addition + Subtraction Multiplication * Left division \ Right division / Exponentiation ^ 25 Entry-wise sense + .* .\ ./ .^ Scalar Functions for Matrices sin(C) exp(C) real(C) ceil(C) floor(C) sqrt(C) C^(1/2) % sine of each entry of matrix C % exponential of each entry of C % real part of each entry of C % round each C’s entry up % round each C’s entry down % square root of each entry of C % matrix square root of C 26 Scalar Functions as Matrix Functions Polynomial Evaluation: Consider p(x)=2x3+4x-7, to compute p(3), use: p=[2 0 4 -7]; x=3; y=polyval(p,x) To compute p(x) for x in between 0 and 2, use: y=polyval(p,[0:0.01:2]) If A is a matrix, polyval(p,A) gives 2*A.^3+4*A-7 27 • Graphics • 2D Plots Visualization Tools Matlab is a powerful visualization tool. From 2D plots to 3D plots to image processing. contour plot vector field Visualization Tools 3D surface plot view from different angles image processing compression 2D Example: y=sin(x) x = 0:0.01:pi; plot(x, sin(x)) 3D Example: z = x * y [x, y] = meshgrid(-3:0.1:3, -3:0.1:3); z = x .* y; mesh(x,y,z); Graphics To create a graph you run: • Management commands: arranging the figure windows • Graph generation commands: plot, mesh • Annotation commands: formatting the graphs Plotting Commands: 3 categories Management figure subplot zoom hold close view rotate Graphic plot semilogx semilogy loglog polar fill bar Annotation title xlabel, ylabel text grid legend box set Graphic command Description plot(x) Plot elements of x(i) (ordinate) versus their index number i plot(x,y) Plot x(i) (abscissa) versus y(i) (ordinate) loglog(x,y) Plot log x(i) versus log y(i) semilogx(x,y) Plot log x(i) in y(i) polar(t,r) Plot polar plot with angle t and magnitude r Example: >> plot(sqrt([16:64])) 8 7.5 7 6.5 6 5.5 5 4.5 4 0 5 10 15 20 25 30 35 40 45 50 Example: x=[0:0.1:10]; semilogy(x,exp(x)); 105 104 103 102 101 100 0 1 2 3 4 5 6 7 8 9 10 Example: t=[0:0.1:10]; polar(t,t); 90 120 150 10 8 6 4 2 60 30 180 (x,y)=(tcost, tsint) 0 210 330 240 300 270 • The command >> plot([x1 x2] , [y1 y2]) plots a straight line form (x1 , y1) to (x2 , y2) • The command >> plot(x, y) plot a set of straight lines connecting (xj , yj) and (xj+1 , yj+1) Example: >> x = [1.2 2.3 3.7 4.1 5.0 7.3]; >> y = [2.6 2.8 3.7 4.0 4.3 5.6]; >> plot(x,y) More Sophisticated Plot: >> plot(x,y, 'string') • string stands for color, marker and line type • E.g.: 'r*-' means red, asterisk at each data point, and join points by solid line. • Plotting many curves on the same figure: >> plot(x,y, 'r-',a,b, 'g--',….) Example: >> x=0:0.05:pi; >> plot(x,cos(x),'r-',x,sin(x),'mv') Colors, Markers and Line Types Color y m c r g b w k yellow magenta cyan red green blue white black Marker x + * s d v ^ < > p h point circle x-mark plus star square diamond triangle (down) triangle (up) triangle (left) triangle (right) pentagram hexagram Line solid : dotted . dashed Annotation Commands: Labeling function Description gtext('string') Add the string at the mouse location, activated by pressing a mouse button or any key. text(x, y, 'string') Add the string at the location (x,y) relative to axis units. title('string') Add the string as a title to the top of the plot. xlabel('string') ylabel('string') Add the string as an x or y axis label. legend('string') Add the string to describe a curve drawn in the figure Example: clear all x = 0:0.1:pi; plot(x,sin(x),'r:o') xlabel('x in radians') ylabel('sin(x)') title('This is the sine plot.') text(1,0.5,'Text can be placed anywhere') text(1,0.25,... {'Text can span multiple lines', 'like this.'}) Managing the Figure Windows • Each graph is created in a Figure Window • By default, only one Figure Window can be opened • Thus the second graph will replace the first one • To plot two or more graphs in one window, use >> hold • To unhold the windows, use >> hold off Compare: x = 0:0.01:pi; x = 0:0.01:pi; plot(x, sin(x)); plot(x, sin(x)); hold plot(x, cos(x)); plot(x, cos(x)); What if you want separate figures? • • • • figure(n) – opens Figure Window number n and make it the current window subplot(i,j,k) – divides Figure Window into i-by-j smaller windows for plotting; k – the number of the smaller window where you want to put your plot into To close Figure n, use close n To close all figures, use close all Example: x = 0:0.01:pi; plot(x, sin(x)); figure(2); plot(x, cos(x)); Example: x = 0:0.01:pi; subplot(2,1,1); plot(x, sin(x)); subplot(2,1,2); plot(x, cos(x)); • Matrix Functions • Matrix Inverse 1. inv 2. \ 3. rref • Determinant • Norm 52 Matrix Functions inv(C) det(C) eig(C) [V,D]=eig(C) norm(C) diag(C) rank(C) pinv(C) sum(C) cross(d,e) % inverse of matrix C % determinant of C % eigenvalues of C % e-value and e-vector of C % norm of C % diagonal part of C % rank of C % pseudoinverse of C % column sum of C % cross product of d and e 53 Finding Matrix Inverse Simple –– use inv (A) >> A = rand (100, 100); >> inv (A); For solving Ax = b, use either >> inv (A) * b or >> A \ b 54 If A is not invertible, then * * * * * 1 0 0 * * * * * * * 1 0 * * * * * * * Bk · · · B1 * * * * * 1 * * 0 * * * * * * * * * * Reduced Row Echelon Form It can be obtained in MATLAB by >> rref(A) 55 For examples 1 2 3 4 5 6 7 8 10 1 2 3 4 5 6 7 8 9 rref rref 1 0 0 0 1 0 0 0 1 rank = 3 1 0 -1 0 1 2 0 0 0 1 0 -1 -2 -3 0 1 2 3 4 rank = 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 16 17 18 19 20 0 0 0 0 0 rref 56 rank = 2 Determinant Given A = [aij] n det(A) (1)i j aij det(M ij ) j 1 n (1)i j aij det(M ij ) i 1 where Mij is the submatrix obtained by deleting row i and column j. Why compute det(A)? det(A) = 0 A is singular Logical Flow • Relation and logical operators • Controlling statements: for, while and if 58 Relational and Logical Operators Relational operators available: <, <= (less than or equal to), >, >=, == (equal), ~= (not equal) Logical operators to combine relational expressions: & (and), | (or), ~ (not) if ((b>=a) & (b>=c)) disp('b is the maximum') end 59 Control-of-Flow Constructs for, while, if Fixed repetition – the for loop Indefinite repetition – the while loop Single decision – the if/else construct Multiple options – the if/elseif/else contruct 60 Control Statements MATLAB has three control constructs: for, while, if for is an iterated loop statement for i = 1:n … … … end % loop body statements % every statement here is % repeated n times or for i = m:s:n … % from m to n in steps of s end 61 Example: for % to compute the sum from 1 to 10 sum = 0; for i = 1:10 for i-loop sum=sum+i; end % this can also be done by sum(1:10) 62 Example: for % to compute the factorial of 10 fact = 1; for i = 2:10 fact = fact*i; end % this can also be done by factorial(10); 63 Example: for % sum a random vector a = rand(1,100); sum = 0; for i = 1:100 sum = sum+a(i); end disp(sum) % this can also be done by sum(a); 64 Example: for % sum only the odd-index entries a = rand(1,100); sum_odd = 0; for i = 1:2:100 sum_odd = sum_odd+a(i); end disp(sum_odd) 65 Example: Nesting for-loop Nesting refers to the act of putting a for-loop within a for-loop % to generate a k-by-k Hilbert matrix 1 k=5; 1/ 2 A = zeros(k,k); 1/ 3 for m = 1:k for n = 1:k A(m,n) = 1/(m+n -1); end % for n - loop end % for m - loop A 1/ 2 1/ 3 1/ 3 1 /(2n 2) 1 /(2n 2) 1 /(2n 1) 66 Example: Nesting for-loop % Matrix multiplication C = A*B k C (m, n) A(m, j ) B( j, n), 1 m, n k. j 1 C=zeros(k,k); for m = 1:k for n = 1:k for j = 1:k C(m,n) = C(m,n) + A(m,j)*B(j,n); end % for j – loop end % for n - loop end % for m - loop 67 While Control while construct: while <condition> … % every statements here … % will be repeated until … % condition is not satisfied end 68 Example: while % sum a random vector a = rand(1,100); s = 0; j=1; % set the test variable while j < 101 s = s+a(j); j = j+1; % update test variable end % the same program using % for-loop % sum a random vector a = rand(1,100); s = 0; for i = 1:100 s = s+a(i); end 69 Sum 1:n until total > N % sum 1 to n until total sum > N sum=0; i=0; while sum < N % N to be input i=i+1; sum=sum+i; end disp([i,sum]) % # of terms and total 70 Sum rand until rand < 0.9 % an example of indefinite repetition % (i.e. we don’t know when it will stop) % % sum as many random numbers % as possible as long as they are % less than 0.9 % s = 0; while rand<0.9 % while the random number is less than 0.9 s = s+rand % sum the random number end 71 If Control if construct: if <condition> … % do this if condition is true else … % do that otherwise (elseif <condition>) (…) % you can have more conditions end 72 Example: if/elseif/else if A > B if A > B disp('A is larger') else disp('A is not larger') end disp('A is larger') elseif A < B disp('B is larger') elseif A == B disp('A equals B') else disp('Unexpected situation') end 73 Example: if/elseif/else % score(j) is the score of j-th student for j=1:class_size if score(j) >= 90 grade(j)='A'; elseif score(j) >= 80 grade(j)='B'; else grade(j)='F'; end end 74 • Programs • Scripts 75 Why programs When we want to do something repeatedly. Suppose we want to see if the average of 1,000 uniformlydistributed random numbers is close to 0.5. a = rand(1000,1); s = 0; for i = 1:1000 s = s+a(i); end s/1000 What if we want to run this several times? 76 • Copy the commands, and then paste it to MATLAB prompt >> every time you want to repeat the commands • Or, save the commands into a file, and then enter the filename at the MATLAB prompt >>. Then MATLAB will run every command in the file. The file is called a MATLAB program or a script. • MATLAB scripts (or simply M-scripts) must have file extension .m. 77 To create a MATLAB script • In the “Command Window” • Select the “File” menu command • Select “New / script” This should start the m-script Editor Window. Type your program into the window. 78 Command Window Enter your program here Editor Window 79 To save: • Select the menu command File/Save and give the program an appropriate name, e.g. testavg. The ‘.m’ file extension should automatically be added to the program name. • The file will be saved into your work space. (See the Current Folder Window.) • Click back to the Command Window. • You can check if your program is there by the MATLAB command dir *.m. 80 To Run a Script: Type the name of the program without the ‘.m’ and hit “Enter”. E.g. >> testavg ans= 0.4917 The program runs and gives you the result. To run it again, just do the same: >> testavg It will give you another average. 81 Advantage of Writing Programs • Easier to run than copy and paste • Easier to make corrections and changes • Programs reside on disk, can recall in the future • Can share between different computers • Allow different inputs and outputs • Can combine different programs to do complicated tasks. 82 Don’t lose your head: • Give some explanations and details of the programs’ operations • Comment them by using % at the beginning of each comment. Typing ‘help testavg’ will display this header. % testavg compute % the average of % 1000 random % numbers a = rand(100,1); s = 0; for i = 1:100 s = s+a(i); end s/100 83 An Example of MATLAB Program % a program called multiply.m % take two variables and multiply them a=5; b=3; product = a * b Type this into your editor, save it with the name “multiply.m” and ‘run’ it with the command >> multiply 84 Input the Arguments Sometimes we want to change the results of the program by changing some of the input variables. n=input('n= ') For example, we may want to compute the average of n numbers instead of 1,000 numbers where n is given by the user of the program. for i = 1:n a = rand(n,1); s = 0; s = s+a(i); end s/n 85 A Simple Program with 2 Inputs % a program called multiply.m % take two variables and multiply them a=input('a= ') b=input('b= ') product = a * b Type this into your editor, save it with the name “multiply.m” and ‘run’ it with the command >> multiply 86 To sketch a surface : To graphs the function z=xp+yp for different p, enter the followings and save as sketch.m: [x, y] = meshgrid(-3:0.1:3, -3:0.1:3); z = x .^p + y .^p; mesh(x,y,z); Type >> p=2; sketch and >> p=4; sketch What will the shape be for p odd, and for p large? 87 Output the Results First is to print them without the “;” % a simple program a = 7; b = 3; c = a+b; c the result of c is presented. 88 disp is another simple command for displaying numbers or text on the screen. >> c=10; disp(c) % number >> A=[1 2; 3 4]; disp(A) % matrix >> c=10; d=20; disp([c, d]) % vector of numbers >> t='Raymond'; disp(t) % text >> s='Hello'; t='Ray'; disp([s, t]) % vector of texts >> c=10; disp([' c = ', num2str(c)]) % text/number > text For more sophisticated output formats, look up fprintf and sprintf 89 Example of Input and Output % hello.m greets you and asks for your name. % It then tells you the date. disp('Hello! Who are you? ') name= input ('Enter your name inside quotes '); d = date; greeting= ['Hello ', name, '. Today is ', d, '.']; disp(greeting) 90 Another example % simple.m computes product and sum val1 = input('enter first value: '); val2 = input('enter second value: '); prod = val1*val2; sum = val1+val2; disp(['product is ', num2str(prod)]) disp(['sum is ', num2str(sum)]) 91 Checking Correct Password % Open Sesame password=input('password please = '); while password ~= 123456 % 123456=password disp('Incorrect! Try again.') password=input('password please = '); end disp('Correct! Door’s opening.') 92 Debugging • If your program has errors (bugs), MATLAB will tell you the number of the line where the errors are located • Any corrections to errors or spelling mistakes, and changes you want to make to your program can be done by clicking back to the Editor Window • Type corrections over the top of the program and resave/rerun 93 error location cursor position 94 • Functions 95 Average of n Random Numbers Recall that we can use the script testavg.m to compute the average of n random numbers. %program testavg How do we input the number n, and how do we output the average? for i = 1:n a = rand(n,1); s = 0; s = s+a(i); end avg=s/n 96 Input the Arguments For m-files, there are two ways of entering the input arguments. %program testavg Method I: s = 0; the input argument n is enter outside the program. for i = 1:n >> n=1000; a = rand(n,1); s = s+a(i); end avg=s/n >> testavg 97 %program testavg Method II: n=input('n= ') we enter the argument n by the input command. a = rand(n,1); >> testavg for i = 1:n n= s = 0; s = s+a(i); end avg=s/n 98 Output the Results For m-files, there are two ways to output the results. %program testavg Method I: for i = 1:n Result is printed inside the program by omitting “;” or using disp. a = rand(n,1); s = 0; s = s+a(i); end avg=s/n >> n=1000; >> testavg 99 Method II: the output avg is printed outside the program by suppressing output inside the program using “;”. >> n=1000; %program testavg a = rand(n,1); s = 0; for i = 1:n s = s+a(i); >> testavg; end >> avg avg=s/n; 100 Functions Functions simplify the input and output process by doing everything in one line. Save it also as an m file, e.g. testavgf.m. To run, enter >> testavgf(1000) or >> b=testavgf(1000) output function name input function avg=testavgf(n) %testavgf computes the %average of n numbers a = rand(n,1); s = 0; for i = 1:n s = s+a(i); end avg=s/n; 101 A Function with No Input function sesame password=input('password please = '); while password ~= 123456 disp('Incorrect! Try again.') password=input('password please = '); end disp('Correct! Door opening.') 102 Another Simple Example function v= Enorm(x) % Enorm computes the Euclidean norm of x n=length(x); sum=0; for i=1:n sum= sum+x(i)^2; end v=sqrt(sum); To use it, enter, e.g. >> Enorm([1 2 3]) 103 Script Variables are Global It is different from scripts (e.g. testavg) where the variables inside the scripts are the same as any variables inside or outside the scripts with the same name. >> avg=45; >> n=2500; >> testavg; n=1000 >> avg avg= 0.5010 >> n n= 1000 104 Function Variables are Local All variables (e.g. s, n, a, avg) inside a function (testavgf) live only when the function is running, and will be forgotten when the function finishes. It will not affect any variables outside the function. >> avg=45; >> n=2500; >> testavgf(1000); >> avg avg= 45 >> n n= 2500 Function variables are dummy variables 105 Multiple Inputs The function “cylvol.m” r function vol = cylvol(r,h) h basearea = pi*r^2; vol = basearea*h; computes the volume of a cylinder. Try >>cylvol(2,3) 106 Another Example of Multiple Inputs The projection of x onto y: x function u= proj(x,y) % proj computes the % projection of x onto y u y u=((x*y')/norm(y)^2)*y; To use it, enter, e.g. >> proj([1 2 3],[3 4 5]) 107 Multiple Outputs The following program will return 2 outputs: function [prod,sum]=simple(val1,val2) % simple math program prod = val1*val2; sum = val1+val2; To use it, enter, e.g. >> [a,b]=simple(5,6) 108 Another Example of Multiple Outputs function [i,sum]=sum2N(N) % sum 1 to n until total > N sum=0; i=0; while sum < N i=i+1; sum=sum+i; end >> [r,c]=sum2N(100) 109 MIMO The following program computes the two roots of a quadratic equations ax2+bx+c=0 function [r1,r2] = quadroot(a,b,c) r1= (-b-sqrt(b^2-4*a*c))/(2*a); r2= (-b+sqrt(b^2-4*a*c))/(2*a); Call by: >>[xplus,xminus] = quadroot(2,3,4) 110 Comparison between Scripts and Functions Scripts Functions Input n=input(‘n’=) fn_name(n) Output disp(avg) avg=fn_name(n) Multiple inputs Multiple input lines fn_name(n, m, p, q) Multiple outputs disp([a, b, c, … ]) [a, b, c]=fn_name(n) Call >> script_name >> [a,b,..]=fn_name(m,n,…) Variables global local variables remain in memory when program ends Variables in function cease to exist when function ends (dummy variables) different programs use different variable names different functions use same variable names is okay 111