Introduction to Matlab & Data Analysis Tutorial 7: Functions and Program Design Please change directory to directory E:\Matlab (cd E:\Matlab;) From the course website (http://www.weizmann.ac.il/midrasha/courses/MatlabIntro//course_outline.htm ) Download: playTicTacToe.m , isLegalMove.m , isPlayerWon.m, getNextMove.m, myFactorial.m Weizmann 2010 © 1 Goals Introduction Functions M file structure Functions workspace Functions Input and output Top down design Local functions Debugger Recursion More: Functions and commands Functions and the matlab search path 2 Function Is an Independent Piece of Code Which Performs a Task Function (subroutine, method, procedure, or subprogram) – is a portion of code within a larger program, which performs a specific task and can be relatively independent of the remaining code. One M-file, One Task, One Workspace 3 Variables - The Data Objects, Functions Are The Actions Input (Object / Data): 80 X = 90 95 100 98 88 92 Functions: y = mean(x) y = sum(x) y = max(x) Output: (Data) 91.85 643 100 4 A Function Is a Black Box Output function Input A function is a black box It hides the code and its workspace and communicates with the “world” using the input and output variables 5 5 Functions M file structure The file is a Matlab function The output variables (if there are few use []: [out1 out2] ) Should be same as the name of the file sumTwoNums.m: function my_sum = sumTwoNums(a,b) my_sum = a+b; Assign the output variables The input variables (else - Matlab will give an error) 6 Functions Documentation and Variable Verification help: Usage Input Output Examples Testing for proper variables function my_sum = sumTwoNums(a,b) First line % SUMTWONUMS sum to scalars % this function sums two scalar % and returns the result % INPUT: % a - the first scalar % b - the second scalar % % OUTPUT: % my_sum - the sum of a and b; sum = a+b if (~isscalar(a)) error('First argument is not a scalar'); end if (~isscalar(b)) error('Second argument is not a scalar'); end Calculations and Output assignment my_sum = a+b; 7 Each Instance of A Function Run Has Its Own Workspace Assume we wrote the function: function my_sum = sumTwoNums(a,b) my_sum = a + b; In the workspace we run: a b x y s = = = = = 1; 2; 3; 4; sumTwoNums(x, y) What is the output? s = 7 Matlab Workspace: a=1 b=2 X=3 Function Workspace: a=3 b=4 my_sum = 7 y=4 s=7 8 Matlab Functions Can Be Called With Fewer Input Arguments Than Specified Consider a function that computes ax function y 2 bx c = calSecondOrderPoly(x, a, b, c) switch nargin case 4 % do nothing case 3 Default value c = 0; case 2 c = 0; b = 0; otherwise error('Incorrect input'); end y = a*x.^2 + b*x + c; Switch according to input arguments number 9 Matlab Functions Can Be Called With Fewer Output Arguments Than Specified Recall: [r,c] = find(A) , ind = find(A); sorted_A= sort(A); [sorted_A, sort_ind] = sort(A); Now lets improve our function such that if it called with two output arguments, the second argument is the derivative: [y, y_derivative] = calSecondOrderPoly(x, a, b, c); [ ax bx c , 2 ax b ] 2 10 Matlab Functions Can Be Called With Fewer Output Arguments Than Specified function [y, y_derivative] = calSecondOrderPoly(x, a, b, c) y = a*x.^2 + b*x + c; if nargout == 2 y_derivative = 2*a*x + b; end Checks number of output arguments Can help avoid expensive computations when they are not necessary 11 Example Write a function subtractTwoNums Input: a, b Output: a-b Add Help to the function Try calling the function (Debugger) *Extra: if the function needs to return two output variables: Output: [a-b, b-a] 12 Top Down Design A method to solve complex problems Principles: Start from large problems to small A function does one task Think before you code 13 Top Down Design and Debugging – Tic-Tac-Toe Example Problem specifications: Build a tic-tac-toe game for two players. 14 Lets break the problem top-down Play Tic-Tac-Toe Have some game matrix Initiate the game matrix Update the game matrix Get Next Move Get column Get row Check for a winner Announce the winner Check whether the move is legal Display the game matrix 15 Choosing the Data Structures We will use two game matrices Warning: We use it here for simplicity, usually it is better to avoid data duplication “Num_mat” - 3x3 numeric matrix “display_mat” - 3x9 char matrix 1 NaN NaN ‘X‘ ‘–‘ ‘–‘ NaN NaN NaN ‘–‘ ‘–‘ ‘–‘ NaN 2 NaN ‘–‘ ‘O‘ ‘–‘ 16 Writing the functions – “Go with the (control) flow” Play Tic-Tac-Toe Initiate game matrix Initiate “who won flag” variable to 0 Initiate “current player flag” variable to 1 Loop 9 times (for i=1:9): Get Next Move Update game matrix Display game matrix Check for winner – if found a winner: Update “who won flag” (1 or 2) and Break Switch the “current player flag” 1<->2 Announce winner according to the “who won flag” variable A “Flags” – A variable which holds information about the program status and helps you control the flow Get row Get column Check if it is a legal move 17 Lets look at the code of the main function: edit playTicTacToe.m; Notice the local functions Weizmann 2010 © 18 Debugging Run Time Errors Our weapons: Break points – Red Gray Modifying a file There are two bugs Lets find them . . Debug buttons Debug menu Stop if errors / warn To the code! 19 func1; Error Syntax errors – Lets try to run playTicTacToe function func1() func2() function func2() Try Runtime errors – You can plant in the code disp() massages that will help you debug. You should use errors when the input of the function is not valid Debugger … func3(); Catch disp(‘Caught’); end function func3() func4() function func4 () A = ones(1,1); B = A(1,2); 20 Recursion – factorial example function res = myFactorial(x) % check: x is a non-negative integer if (x == 0 || x == 1) res = 1; else res = x * myFactorial(x-1); end Ah ha! The factorial of 1 is 1! I don’t know what is factorial of 3 But I know it is 3 multiply the factorial of 2 I don’t know what is factorial of 2 But I know it is 2 multiply the factorial of 1 21 Summary Introduction Functions M file structure Functions workspace Functions Input and output Top down design Local functions Debugger Recursion More: Functions and commands Functions and the matlab search path 22