Tutorial_7

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