0% found this document useful (0 votes)
39 views64 pages

Lecture Note 4 Fall 22 23

The document discusses different types of user-defined functions in MATLAB including function handles, global variables, and methods for calling functions. It provides examples of defining functions with different numbers of inputs and outputs and using functions with arrays. Local variables and minimizing functions are also covered.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
39 views64 pages

Lecture Note 4 Fall 22 23

The document discusses different types of user-defined functions in MATLAB including function handles, global variables, and methods for calling functions. It provides examples of defining functions with different numbers of inputs and outputs and using functions with arrays. Local variables and minimizing functions are also covered.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 64

PowerPoint to accompany

Introduction to MATLAB
for Engineers, Third Edition
William J. Palm III

Chapter 3
Functions and Files (Cont’d)

Copyright © 2010. The McGraw-Hill Companies, Inc.


This lecture note includes some updates (compared to the original power point of the McGraw-Hill
Companies, Inc.) performed by Asst. Prof. Dr. Neyre Tekbıyık Ersoy for ENGI316 course.
User-Defined Functions

The first line in a function file must begin with a function


definition line that has a list of inputs and outputs. This line
distinguishes a function M-file from a script M-file. Its syntax is
as follows:

function [output variables] = name(input variables)

Note that the output variables are enclosed in square


brackets, while the input variables must be enclosed with
parentheses. The function name (here, name) should be the
same as the file name in which it is saved (with the .m
extension).

More? See pages 119-123.


3-18
User-Defined Functions: Example
function z = fun(x,y)
u = 3*x;
z = u + 6*y.^2;

Note the use of a semicolon at the end of the lines. This


prevents the values of u and z from being displayed.

Note also the use of the array exponentiation operator


(.^). This enables the function to accept y as an array.

3-19 (continued …)
User-Defined Functions: Example (continued)

Call this function with its output argument:

>>z = fun(3,7)
z =
303

The function uses x = 3 and y = 7 to compute z.

(continued …)
3-20
User-Defined Functions: Example (continued)

Call this function without its output argument and try to


access its value. You will see an error message.

>>fun(3,7)
ans =
303
>>z
??? Undefined function or variable ’z’.

(continued …)
3-21
User-Defined Functions: Example (continued)

Assign the output argument to another variable:

>>q = fun(3,7)
q =
303

You can suppress the output by putting a semicolon after


the function call.

For example, if you type q = fun(3,7); the value of q


will be computed but not displayed (because of the
semicolon).

3-22
Local Variables: The variables x and y are local to the
function fun, so unless you pass their values by naming
them x and y, their values will not be available in the
workspace outside the function. The variable u is also
local to the function. For example,
>>x = 3;y = 7;
>>q = fun(x,y);
>>x
x =
3
>>y
y =
7
>>u
??? Undefined function or variable ’u’.

3-23
Only the order of the arguments is important, not the
names of the arguments:

>>x = 7;y = 3;
>>z = fun(y,x)
z =
303

The second line is equivalent to z = fun(3,7).

3-24
You can use arrays as input arguments:

>>r = fun(2:4,7:9)
r =
300 393 498

3-25
A function may have more than one output. These are
enclosed in square brackets.

For example, the function circle computes the area A


and circumference C of a circle, given its radius as an
input argument.

function [A, C] = circle(r)


A = pi*r.^2;
C = 2*pi*r;

3-26
The function is called as follows, if the radius is 4.

>>[A, C] = circle(4)
A =
50.2655
C =
25.1327

3-27
A function may have no input arguments and no output
list.

For example, the function show_date clears all


variables, clears the screen, computes and stores the
date in the variable today, and then displays the value of
today.

function show_date
clear
clc
today = date

3-28
Examples of Function Definition Lines
1. One input, one output:

function [area_square] = square(side)

2. Brackets are optional for one input, one output:

function area_square = square(side)

3. Three inputs, one output:

function [volume_box] = box(height,width,length)

4. One input, two outputs:

function [area_circle,circumf] = circle(radius)

5. No named output: function sqplot(side)

3-29
Function Example

function [dist,vel] = drop(g,vO,t);


% Computes the distance travelled and the
% velocity of a dropped object,
% as functions of g,
% the initial velocity vO, and
% the time t.
vel = g*t + vO;
dist = 0.5*g*t.^2 + vO*t;

(continued …)
3-30
Function Example (continued)

1. The variable names used in the function definition may,


but need not, be used when the function is called:

>>a = 32.2;
>>initial_speed = 10;
>>time = 5;
>>[feet_dropped,speed] = . . .
drop(a,initial_speed,time)

(continued …)
3-31
Function Example (continued)

2. The input variables need not be assigned values


outside the function prior to the function call:

[feet_dropped,speed] = drop(32.2,10,5)

3. The inputs and outputs may be arrays:

[feet_dropped,speed]=drop(32.2,10,0:1:5)

This function call produces the arrays feet_dropped


and speed, each with six values corresponding to the six
values of time in the array time.

3-32
Local Variables

The names of the input variables given in the function


definition line are local to that function.

This means that other variable names can be used when


you call the function.

All variables inside a function are erased after the function


finishes executing, except when the same variable names
appear in the output variable list used in the function call.

3-33
Global Variables

The global command declares certain variables global,


and therefore their values are available to the basic
workspace and to other functions that declare these
variables global.

The syntax to declare the variables a, x, and q is

global a x q

Any assignment to those variables, in any function or in


the base workspace, is available to all the other functions
declaring them global.

More? See pages 124.


3-34
Function Handles

You can create a function handle to any function by using


the at sign, @, before the function name. You can then use
the handle to reference the function. To create a handle to
the function y = x + 2e-x -3, define the following function
file:

function y = f1(x)
y = x + 2*exp(-x) - 3;

You can pass the function as an argument to another


function.

3-35
To minimize the function f = xe-x2 - y2 , we first define it in
an M-file, using the vector x whose elements are x(1) =
x and x(2) = y.

function f = f4(x)
f = x(1).*exp(-x(1).^2-x(2).^2);

Suppose we guess that the minimum is near x = y = 0.


The session is

>>fminsearch(@f4,[0,0])
ans =
-0.7071 0.000

Thus the minimum occurs at x = -0.7071, y = 0.

3-45
Methods for Calling Functions

There are four ways to invoke, or “call,” a function into


action. These are:

1. As a character string identifying the appropriate


function M-file,
2. As a function handle,
3. As an “inline” function object, or
4. As a string expression.

Examples of these ways follow for the fzero function


used with the user-defined function fun1, which
computes y = x2 - 4.

(continued …)
3-46
Methods for Calling Functions (continued)

1. As a character string identifying the appropriate


function M-file, which is

function y = fun1(x)
y = x.^2-4;

The function may be called as follows, to compute the


zero over the range 0  x  3:

>>[x, value] = fzero(’fun1’,[0, 3])

(continued …)
3-47
Methods for Calling Functions (continued)

2. As a function handle to an existing function M-file:

>>[x, value] = fzero(@fun1,[0, 3])

3. As an “inline” function object:

>>fun1 = ’x.^2-4’;
>>fun_inline = inline(fun1);
>>[x, value] = fzero(fun_inline,[0, 3])

(continued …)
3-48
Methods for Calling Functions (continued)

4. As a string expression:

>>fun1 = ’x.^2-4’;
>>[x, value] = fzero(fun1,[0, 3])

or as

>>[x, value] = fzero(’x.^2-4’,[0, 3])

(continued …)
3-49
Methods for Calling Functions (continued)

The function handle method (method 2) is the fastest


method, followed by method 1.

In addition to speed improvement, another advantage


of using a function handle is that it provides access to
subfunctions, which are normally not visible outside of
their defining M-file.

More? See pages 130-131.

3-50
Types of User-Defined Functions

The following types of user-defined functions can be


created in MATLAB.

Types of User-Defined Functions

Primary Anonymous Nested Overloaded Private


Subfunctions
functions functions functions functions functions

(continued …)
3-51
Types of User-Defined Functions

Primary functions
• This type of function is the first function in an M-file and typically
contains the main program.
• Following the primary function in the same file can be any number of
subfunctions, which can serve as subroutines to the primary function.
• Usually the primary function is the only function in an M-file that you
can call from the MATLAB command line or from another M-file
function.
• You invoke this function using the name of the M-file in which it is
defined.
• We normally use the same name for the function and its file, but if the
function name differs from the file name, you must use the file name to
invoke the function.

(continued …)
3-51
Types of User-Defined Functions (continued)

Anonymous functions
• Enable you to create a simple function without needing to create an
M-file for it.
• You can construct an anonymous function either at the MATLAB
command line or from within another function or script.
• Thus, anonymous functions provide a quick way of making a
function from any MATLAB expression without the need to create,
name, and save a file.

(continued …)
3-53
Anonymous Functions

Anonymous functions enable you to create a simple


function without needing to create an M-file for it. You
can construct an anonymous function either at the
MATLAB command line or from within another function
or script. The syntax for creating an anonymous
function from an expression is

fhandle = @(arglist) expr

where arglist is a comma-separated list of input


arguments to be passed to the function, and expr is
any single, valid MATLAB expression.

(continued …)
3-59
Anonymous Functions (continued)

To create a simple function called sq to calculate the square


of a number, type

>>sq = @(x) x.^2;

To improve readability, you may enclose the expression in


parentheses, as sq = @(x) (x.^2);. To execute the
function, type the name of the function handle, followed by
any input arguments enclosed in parentheses. For example,

>>sq([5,7])
ans =
25 49

3-60 (continued …)
Anonymous Functions (continued)

You might think that this particular anonymous


function will not save you any work because typing
sq([5,7]) requires nine keystrokes, one more than
is required to type [5,7].^2.

Here, however, the anonymous function protects you


from forgetting to type the period (.) required for array
exponentiation.

Anonymous functions are useful, however, for more


complicated functions involving numerous
keystrokes.
(continued …)
3-61
Anonymous Functions (continued)

You can pass the handle of an anonymous function to


other functions. For example, to find the minimum of the
polynomial 4x2 - 50x + 5 over the interval [-10, 10], you
type

>>poly1 = @(x) 4*x.^2 - 50*x + 5;


>>fminbnd(poly1, -10, 10)
ans =
6.2500
If you are not going to use that polynomial again, you can
omit the handle definition line and type instead

>>fminbnd(@(x) 4*x.^2 - 50*x + 5, -10, 10)

3-62
Multiple Input Arguments

You can create anonymous functions having more than


one input. For example, to define the function
x 2 + y 2), type

>>sqrtsum = @(x,y) sqrt(x.^2 + y.^2);

Then type

>>sqrtsum(3, 4)
ans =
5

3-63
As another example, consider the function defining a
plane, z = Ax + By. The scalar variables A and B
must be assigned values before you create the
function handle. For example,

>>A = 6; B = 4:
>>plane = @(x,y) A*x + B*y;
>>z = plane(2,8)
z =
44

3-64
Calling One Function within Another

One anonymous function can call another to implement


function composition. Consider the function 5 sin(x 3). It is
composed of the functions g(y) = 5 sin(y) and f (x) = x 3.
In the following session the function whose handle is h
calls the functions whose handles are f and g.

>>f = @(x) x.^3;


>>g = @(x) 5*sin(x);
>>h = @(x) g(f(x));
>>h(2)
ans =
4.9468

3-65
Variables and Anonymous Functions

Variables can appear in anonymous functions in two ways:


• As variables specified in the argument list, as for
example f = @(x) x.^3;, and

(continued …)
3-66
Variables and Anonymous Functions (continued)

• As variables specified in the body of the expression,


as for example with the variables A and B in plane
= @(x,y) A*x + B*y.

When the function is created MATLAB captures the


values of these variables and retains those values for
the lifetime of the function handle. If the values of A
or B are changed after the handle is created, their
values associated with the handle do not change.

This feature has both advantages and


disadvantages, so you must keep it in mind.

More? See pages 132-134.


3-67
Types of User-Defined Functions (continued)

Subfunctions
• These are placed in the primary function and are called by the
primary function.
• You can use multiple functions within a single primary function M-file.

(continued …)

3-54
Subfunctions

A function M-file may contain more than one user-defined


function. The first defined function in the file is called the
primary function, whose name is the same as the M-file
name. All other functions in the file are called subfunctions.

Subfunctions are normally “visible” only to the primary


function and other subfunctions in the same file; that is, they
normally cannot be called by programs or functions outside
the file. However, this limitation can be removed with the
use of function handles.

(continued …)
3-68
Subfunctions (continued)

Create the primary function first with a function


definition line and its defining code, and name the
file with this function name as usual.

Then create each subfunction with its own function


definition line and defining code.

The order of the subfunctions does not matter, but


function names must be unique within the M-file.

3-69 More? See pages 168-170.


Precedence When Calling Functions

The order in which MATLAB checks for functions is


very important.
• When a function is called from within an M-file,
MATLAB first checks to see if the function is a built-
in function such as sin.
• If not, it checks to see if it is a subfunction in the file
• Then checks to see if it is a private function (which
is a function M-file residing in the private
subdirectory of the calling function)
• Then MATLAB checks for a standard M-file on your
search path.

(continued …)
3-70
Precedence When Calling Functions (continued)

Thus, because MATLAB checks for a subfunction before


checking for private and standard M-file functions, you
may use subfunctions with the same name as another
existing M-file.

This feature allows you to name subfunctions without


being concerned about whether another function exists
with the same name, so you need not choose long
function names to avoid conflict.

This feature also protects you from using another


function unintentionally.

3-71
The following example shows how the MATLAB M-
function mean can be superceded by our own
definition of the mean, one which gives the root-mean
square value.

The function mean is a subfunction.

The function subfun_demo is the primary function.

function y = subfun_demo(a)
y = a - mean(a);
%
function w = mean(x)
w = sqrt(sum(x.^2))/length(x);

(continued …)
3-72
Example (continued)

A sample session follows.

>>y = subfun_demo([4, -4])


y =
1.1716 -6.8284

If we had used the MATLAB M-function mean, we


would have obtained a different answer; that is,

>>a=[4,-4];
>>b = a - mean(a)
b =
4 -4

3-73
Thus the use of subfunctions enables you to reduce
the number of files that define your functions.

For example, if it were not for the subfunction mean in


the previous example, we would have had to define a
separate M-file for our mean function and give it a
different name so as not to confuse it with the MATLAB
function of the same name.

Subfunctions are normally visible only to the primary


function and other subfunctions in the same file.

However, we can use a function handle to allow


access to the subfunction from outside the M-file.

3-74 More? See pages 169-170.


Types of User-Defined Functions (continued)

Nested functions
• These are functions defined within another function. They can help to
improve the readability of your program and also give you more
flexible access to variables in the M-file.
• The difference between nested functions and subfunctions is that
subfunctions normally cannot be accessed outside of their primary
function file.

(continued …)

3-54
Nested Functions

With MATLAB 7 you can now place the definitions of


one or more functions within another function.
Functions so defined are said to be nested within the
main function. You can also nest functions within
other nested functions.

(continued …)

3-75
Nested Functions (continued)

Like any M-file function, a nested function contains


the usual components of an M-file function.

You must, however, always terminate a nested


function with an end statement.

In fact, if an M-file contains at least one nested


function, you must terminate all functions, including
subfunctions, in the file with an end statement,
whether or not they contain nested functions.

(continued …)
3-76
Example

The following example constructs a function handle for a


nested function and then passes the handle to the
MATLAB function fminbnd to find the minimum point on
a parabola. The parabola function constructs and
returns a function handle f for the nested function p.
This handle gets passed to fminbnd.

function f = parabola(a, b, c)
f = @p;
function y = p(x)
y = a*x^2 + b*x + c;
end
end
(continued …)
3-77
Example (continued)

In the Command window type

>>f = parabola(4, -50, 5);


>>fminbnd(f, -10, 10)
ans =
6.2500

Note than the function p(x) can see the variables a,


b, and c in the calling function’s workspace.

3-78
Nested functions might seem to be the same as
subfunctions, but they are not. Nested functions
have two unique properties:

1. A nested function can access the workspaces of all


functions inside of which it is nested. So for
example, a variable that has a value assigned to it
by the primary function can be read or overwritten
by a function nested at any level within the main
function.

A variable assigned in a nested function can be read


or overwritten by any of the functions containing that
function.

(continued …)
3-79
2. If you construct a function handle for a nested
function, the handle not only stores the information
needed to access the nested function; it also stores the
values of all variables shared between the nested
function and those functions that contain it.

This means that these variables persist in memory


between calls made by means of the function handle.

More? See pages 135-137 .


3-80
Types of User-Defined Functions (continued)

Overloaded functions
• These are functions that respond differently to different types of input
arguments.
• They are similar to overloaded functions in any object-oriented
language.
• For example, an overloaded function can be created to treat integer
inputs differently than inputs of class double.

Private functions
• These functions enable you to restrict access to a function.
• They can be called only from an M-file function in the parent
directory.

(continued …)
3-56
Private Functions

Private functions reside in subdirectories with the


special name private, and they are visible only to
functions in the parent directory.

Assume the directory rsmith is on the MATLAB


search path. A subdirectory of rsmith called
private may contain functions that only the
functions in rsmith can call. Because private
functions are invisible outside the parent directory
rsmith, they can use the same names as functions
in other directories.

(continued …)
3-81
Private Functions (continued)

Primary functions and subfunctions can be


implemented as private functions.

Create a private directory by creating a subdirectory


called private using the standard procedure for
creating a directory or a folder on your computer, but
do not place the private directory on your path.

3-82
The term function function
• This not a separate function type but refers to
any function that accepts another function as an
input argument, such as the function fzero.

• You can pass a function to another function


using a function handle.

3-58
Importing Spreadsheet Files

Some spreadsheet programs store data in the


.wk1 format. You can use the command
M = wk1read(’filename’) to import this data
into MATLAB and store it in the matrix M.

The command A = xlsread(’filename’)


imports the Microsoft Excel workbook file
filename.xls into the array A. The command
[A, B] = xlsread(’filename’) imports all
numeric data into the array A and all text data into
the cell array B.

More? See page 138.


3-83
Importing Spreadsheet Files: XLSREAD

num = xlsread(filename)
num = xlsread(filename,sheet)
num = xlsread(filename,xlRange)
num = xlsread(filename,sheet,xlRange)
• Reads from the specified worksheet and range.
[num,txt,raw] = xlsread(___)
• Additionally returns the
• text fields in cell array txt
• both numeric and text data in cell array raw,
using any of the input arguments in the
previous syntaxes

More? See page 138.


3-83
Importing Spreadsheet Files: XLSREAD Example 1

filename = 'myExample.xlsx';
sheet = 1;
xlRange = 'B2:C3';

subsetA = xlsread(filename,sheet,xlRange)

More? See page 138.


3-83
Importing Spreadsheet Files: XLSREAD Example 2

[num,txt,raw] = xlsread('myExample.xlsx')
num =
1 2 3
4 5 NaN
7 8 9

txt =
'First' 'Second' 'Third'
'' '' ''
'' '' 'x'

raw =
'First' 'Second' 'Third'
[ 1] [ 2] [ 3]
[ 4] [ 5] 'x'
[ 7] [ 8] [ 9]

More? See page 138.


3-83
The Import Wizard

To import ASCII data, you must know how the data in


the file is formatted.

For example, many ASCII data files use a fixed (or


uniform) format of rows and columns.

(continued …)
3-84
The Import Wizard (continued)

For these files, you should know the following.

• How many data items are in each row?

• Are the data items numeric, text strings, or a mixture


of both types?

• Does each row or column have a descriptive text


header?

• What character is used as the delimiter, that is, the


character used to separate the data items in each
row? The delimiter is also called the column
separator.
3-85 (continued …)
The Import Wizard (continued)

You can use the Import Wizard to import many types of


ASCII data formats, including data on the clipboard.
When you use the Import Wizard to create a variable in
the MATLAB workspace, it overwrites any existing
variable in the workspace with the same name without
issuing a warning.

The Import Wizard presents a series of dialog boxes in


which you:

1. Specify the name of the file you want to import,


2. Specify the delimiter used in the file, and
3. Select the variables that you want to import.

3-86
The first screen in the Import Wizard. Figure 3.4–1, page 139

More? See pages 173-177.

3-87

You might also like