A MATLAB Tutorial: Ed Overman Department of Mathematics The Ohio State University
A MATLAB Tutorial: Ed Overman Department of Mathematics The Ohio State University
3:39 p.m.)
A MATLAB Tutorial
Ed Overman
Department of Mathematics
The Ohio State University
Introduction
. . . . . . . . . . . . . . .
1 Scalar Calculations . . . . . . . . . . . .
. . . . . . .
1.1 Simple Arithmetical Operations
1.2 Variables . . . . . . . . . . . . . .
1.3 Round-o Errors . . . . . . . . . . . .
1.4 Formatting Printing . . . . . . . . . . .
1.5 Common Mathematical Functions
. . . . . .
1.6 Complex Numbers
. . . . . . . . . . .
1.7 Script M-les . . . . . . . . . . . . .
1.8 Help!
. . . . . . . . . . . . . . .
. . . . . . . . . . . .
1.9 Be Able To Do
2 Arrays: Vector and Matrix Calculations . . . . .
2.1 Generating Matrices . . . . . . . . . . .
2.2 The Colon Operator . . . . . . . . . . .
2.3 Manipulating Matrices . . . . . . . . . .
2.4 Simple Arithmetical Operations
. . . . . . .
2.5 Operator Precedence
. . . . . . . . . .
2.6 Be Careful!
. . . . . . . . . . . . .
2.7 Common Mathematical Functions
. . . . . .
2.8 Data Manipulation Commands
. . . . . . .
2.9 Advanced Topic: Multidimensional Arrays . . . .
. . . . . . . . . . . .
2.10 Be Able To Do
3 Anonymous Functions, Strings, and Other Data Types
3.1 Anonymous Functions . . . . . . . . . .
3.2 Passing Functions as Arguments to Commands
. .
3.3 Strings . . . . . . . . . . . . . . .
3.4 Cell Arrays and Structures . . . . . . . . .
3.5 Advanced Topic: Data Types and Classes
. . . .
. . . . . . . . . . . .
3.6 Be Able To Do
4 Graphics
. . . . . . . . . . . . . . .
4.1 Two-Dimensional Graphics . . . . . . . . .
4.2 Three-Dimensional Graphics
. . . . . . . .
4.3 Advanced Topic: Commands . . . . . . . .
4.4 Advanced Topic: Handles and Properties
. . . .
4.5 Advanced Topic: GUIs (Graphical User Interfaces)
.
4.6 Advanced Topic: Making Movies . . . . . . .
4.7 Be Able To Do
. . . . . . . . . . . .
5 Solving Linear Systems of Equations . . . . . .
5.1 Square Linear Systems . . . . . . . . . .
5.2 Catastrophic Round-O Errors
. . . . . . .
5.3 Overdetermined and Underdetermined Linear Systems
6 File Input-Output
. . . . . . . . . . . .
7 Some Useful Linear Algebra Commands . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
6
6
7
9
11
11
13
14
15
16
17
18
21
22
26
29
30
32
32
35
36
38
38
39
40
41
44
46
47
47
56
58
62
64
70
74
74
75
78
79
80
82
Programming in MATLAB . . . . . . . .
8.1 Flow Control and Logical Variables . . . . .
8.2 Matrix Relational Operators and Logical Operators
8.3 Function M-les . . . . . . . . . . .
8.4 Odds and Ends
. . . . . . . . . . .
8.5 Advanced Topic: Vectorizing Code
. . . . .
9 Sparse Matrices . . . . . . . . . . . .
10 Initial-Value Ordinary Dierential Equations . .
10.1 Basic Commands . . . . . . . . . . .
10.2 Advanced Commands
. . . . . . . . .
11 Boundary-Value Ordinary Dierential Equations
12 Polynomials and Polynomial Functions . . . .
. . . . .
13 Numerical Operations on Functions
14 Discrete Fourier Transform . . . . . . . .
15 Mathematical Functions Applied to Matrices . .
Appendix: Reference Tables . . . . . . . . .
Arithmetical Operators
. . . . . . . . . .
Special Characters . . . . . . . . . . . .
Getting Help
. . . . . . . . . . . . .
Predened Variables
. . . . . . . . . . .
Format Options . . . . . . . . . . . . .
Some Common Mathematical Functions
. . . . .
Input-Output Functions
. . . . . . . . . .
Arithmetical Matrix Operations . . . . . . . .
Elementary Matrices
. . . . . . . . . . .
Specialized Matrices
. . . . . . . . . . .
Elementary Matrix Operations
. . . . . . . .
Manipulating Matrices . . . . . . . . . . .
Odds and Ends . . . . . . . . . . . . .
Two-Dimensional Graphics
. . . . . . . . .
Three-Dimensional Graphics . . . . . . . . .
Advanced Graphics Features . . . . . . . . .
String Functions, Cell Arrays, Structures, and Classes .
Data Manipulation Commands . . . . . . . .
Some Useful Functions in Linear Algebra . . . . .
Logical and Relational Operators
. . . . . . .
Flow Control
. . . . . . . . . . . . .
Logical Functions
. . . . . . . . . . . .
Programming Language Functions . . . . . . .
Debugging Commands . . . . . . . . . . .
Discrete Fourier Transform
. . . . . . . . .
Sparse Matrix Functions . . . . . . . . . .
Time Evolution ODE Solvers . . . . . . . . .
Boundary-Value Solver
. . . . . . . . . .
Numerical Operations on Functions . . . . . . .
Numerical Operations on Polynomials . . . . . .
Matrix Functions
. . . . . . . . . . . .
Solutions To Exercises . . . . . . . . . . .
ASCII Table
. . . . . . . . . . . . . .
Index . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
88
88
93
96
108
109
111
114
114
119
125
129
132
135
141
145
145
145
146
146
146
147
148
148
149
149
149
150
150
151
151
152
152
153
153
154
154
154
155
155
155
156
156
156
156
157
157
159
163
165
Introduction
MATLAB is an interactive software package which was developed to perform numerical calculations
on vectors and matrices. Initially, it was simply a MATrix LABoratory. However, today it is much more
powerful:
It can do quite sophisticated graphics in two and three dimensions.
It contains a high-level programming language (a baby C) which makes it quite easy to code complicated algorithms involving vectors and matrices.
It can numerically solve nonlinear initial-value ordinary dierential equations.
It can numerically solve nonlinear boundary-value ordinary dierential equations.
It contains a wide variety of toolboxes which allow it to perform a wide range of applications from science and engineering. Since users can write their own toolboxes, the breadth of applications is quite
amazing.
Mathematics is the basic building block of science and engineering, and MATLAB makes it easy to handle
many of the computations involved. You should not think of MATLAB as another complication programming language, but as a powerful calculator that gives you ngertip access to exploring interesting problems in science, engineering, and mathematics. And this access is available by using only a small number
of commands and function because MATLABs basic data element is a matrix (or an array).
This is a crucial feature of MATLAB it was designed to group large amounts of data in arrays and
to perform mathematical operations on this data as individual arrays rather than as groups of data. This
makes it very easy to apply complicated operations to the data, and it make it very dicult to do it
wrong. In high-level computer languages you would usually have to work on each piece of data separately
and use loops to cycle over all the pieces. In MATLAB this can frequently do complicated things in
one, or a few, statements (and no loops). In addition, in a high-level language many mathematical operations require the use of sophisticated software packages, which you have to nd and, much worse, to
understand since the interfaces to these packages are frequently quite complicated and the documentation
must be read and mastered. In MATLAB, on the other hand, these operations have simple and consistent
interfaces which are quite easy to master. For an overview of the capabilities of MATLAB, type
>> demo
in the Help Navigator and click on MATLAB.
This tutorial is designed to be a concise introduction to many of the capabilities of MATLAB. It makes
no attempt to cover either the range of topics or the depth of detail that you can nd in a reference manual, such as Mastering MATLAB 7 by Duane Hanselman and Bruce Littleeld (which is over 850 pages
long) or MATLAB Guide, 2nd edition by Desmond and Nicholas Higham (which is almost 400 pages long).
This tutorial was initially written to provide students with a free basic overview of commands which
are useful in an undergraduate course on linear algebra. Over the years it has grown to include courses in
ordinary dierential equations, mathematical modelling, and numerical analysis. It also includes an introduction to two- and three-dimensional graphics because graphics is often the preferred way to present the
results of calculations.
In this tutorial MATLAB is rst introduced as a calculator and then as a plotting package. Only afterwards are more technical topics discussed. We take this approach because most people are quite familiar
with calculators, and it is only a small step to understand how to apply these same techniques to matrices
rather than individual numbers or varibles. In addition, by viewing MATLAB as a simple but powerful
calculater, rather than as a complicated software package or computer language, you will be in the correct
frame of mind to use MATLAB.
You should view MATLAB as a tool that you are playing with trying ideas out and seeing how
There is a technical distinction between a command and a function in MATLAB: input arguments to commands are not enclosed in parentheses (they are separated by spaces) and there are no output arguments (i.e., a
command cannot be on the right-hand side of an equal sign). In reality, this is a very ne distinction since many
commands can be written as functions by putting the arguments between parentheses and separating them with
commas. We will generally use the terms interchangably.
they work. If an idea works, ne; if it doesnt, investigate further and gure out why. Maybe you misunderstood some MATLAB command, or maybe your idea needs some renement. Play around interactively and gure it out. There are no hard and fast rules for guring it out try things and see
what happens. Dont be afraid to make mistakes; MATLAB wont call you an idiot for making a mistake.
When you rst learned to ride a bicycle, you fell down a lot and you looked pretty silly. But you kept
at it until you didnt fall down. You didnt study Newtons laws of motion and try to analyze the motion
of a bicycle; you didnt take classes in how to ride a bicycle; you didnt get videos from the library on how
to ride a bicycle. You just kept at it, possibly with the assistance of someone who steadied the bicycle and
gave you a little push to get you started. This is how you should learn MATLAB.
However, this tutorial is not designed for playing around. It is very ordered, because it has been designed as a brief introduction to all the basic topics that I consider important and then as a reference
manual. It would be very useful for students to have a document which uses this play around approach
so you would learn topics by using them in exploring some exercise. This is how workbooks should be
written: present some exercise for students to investigate, and let them investigate it themselves. And
these exercises should be interesting, having some connection to physical or mathematical models that
the students or at least a reasonable fraction thereof have some knowledge of and some interest in.
This tutorial is designed to be a reference manual that could be used alongside such a workbook if only
someone would write it.
Summary of Contents
We have tried to make this tutorial as linear as possible so that the building blocks necessary for a section are contained in preceding sections. This is not the best way to learn MATLAB, but it is a good way
to document it. In addition, we try to separate these building blocks and put them in short subsections so
that they are are easy to nd and to understand. Next, we collect all the commands discussed in a subsection and put them in a box at the end along with a very brief discussion to make it easy to remember
these commands. Finally, we collect all these commands and put them in the appendix again boxed up by
topic. MATLAB has a
number of commands and functions and this is one way to collect them
for easy reference.
Warning: Usually we do not discuss the complete behavior of these commands, but only their most \useful" behavior. Typing
>
> help <command>
or
>
> doc <command>
gives you complete information about the command.
Notation: help <command> means to enter whatever command you desire (without the braces).
help command means to type these two words as written.
Section 1 of this tutorial discusses how to use MATLAB as a scalar calculator, and Section 2 how to
use it as a matrix calculator. Following this, you will be able to set up and solve the matrix equation
Ax = b where A is a square nonsingular matrix.
Section 4 discusses how to plot curves in two and three dimensions and how to plot surfaces in three dimensions. These three sections provide a basic introduction to MATLAB. At the end of each of these
three sections there is a subsection entitled Be Able To Do which contains sample exercises to make sure
you understand the basic commands discussed. (Solutions are included.)
You have hopefully noticed that we skipped section 3. It discusses a number of minor topics. Since they
are useful in generating two- and three-dimensional plots, we have included it here.
The following sections delve more deeply into particular topics. Section 5 discusses how to nd any and
all solutions of Ax = b where A Cmn need not be a square matrix; there might be no solutions, one
solution, or an innite number to this linear system. When no solution exists, it discusses how to calculate a least-squares solution (i.e., the best approximation to a solution). In addition, it discusses how
round-o errors can corrupt the solution, and how to determine if this is likely to occur.
HUGE
Section 6 is quite brief and discusses advanced commands to input data into MATLAB and output it
to a le. (The basic commands are discussed in Section 4.1.) This is useful if the data is being shared
between various computer programs and/or software packages.
Section 7 discusses a number of commands which are useful in linear algebra and numerical linear algebra. Probably the most useful of these is calculating some or all of the eigenvalues of a square matrix.
Section 8 discusses MATLAB as a programming language a very baby C. Since the basic data element of MATLAB is a matrix, this programming language is very simple to learn and to use. Most of this
discussion focuses on writing your own MATLAB commands, called function m-les (which are similar to
functions in C and to functions, more generally subprograms, in Fortran). Using these functions, you can
code a complicated sequence of statements such that all these statements as well as all the the variables
used by these commands are hidden and will not aect the remainder of your MATLAB session. The only
way to pass data into and out of these functions is through the argument list.
Section 9 discusses how to generate sparse matrices (i.e., matrices where most of the elements are zero).
These matrices could have been discussed in Section 2, but we felt that it added too much complexity at
too early a point in this tutorial. Unless the matrix is very large it is usually not worthwhile to generate sparse matrices however, when it is worthwhile the time and storage saved can be boundless.
Section 10 discusses how to use MATLAB to numerically solve initial-value ordinary dierential equations. This section is divided up into a basic part and an advanced part. It often requires very little
eort to solve even complicated odes; when it does we discuss in detail what to do and provide a number of examples. Section 11 discusses how to use MATLAB to numerically solve boundary-value ordinary
dierential equations.
Section 12 discusses how to numerically handle standard polynomial calculations such as evaluating
polynomials, dierentiating polynomials, and nding their zeroes. Polynomials and piecewise polynomials
can also be used to interpolate data.
Section 13 discusses how to numerically calculate zeroes, extrema, and integrals of functions.
Section 14 discusses the discrete Fourier transform and shows how it arises from the continuous Fourier
transform. We also provide an example which shows how to recover a simple signal which has been
severely corrupted by noise.
Finally, Section 15 discusses how to apply mathematical functions to matrices.
There is one appendix which collects all the commands discussed in this tutorial and boxes them up by
topic. If a command has more than one use, it might occur in two or more boxes.
This tutorial closes with an index. It is designed to help in nding things that are just on the tip of
your tongue. All the MATLAB commands discussed here are listed at the beginning of the index, followed by all the symbols, then followed by a list of all the script and function m-les which are in the
companion zip le. Only then does the alphabetical index begin (which also contains all the MATLAB
commands which are also contained at the beginning).
Notation: A variable, such as x, can represent any number of types of data, but usually it represents a
scalar, a vector, or a matrix. We distinguish them by using the lowercase x when it is a scalar
or a vector, and the uppercase X when it is a matrix. Also, in MATLAB vectors can be either
row vectors, e.g., (1, 2, 3) or column vectors (1, 2, 3)T (where T is the transpose of a vector or matrix). In a linear algebra setting we always dene x to be a column vector. Thus,
for example, matrix-vector multiplication is always written as A x and the inner product of
the two vectors x and y is x *y, i.e., x1 y1 + x2 y2 + + xn yn (where is the MATLAB
command to take the transpose of a real vector or matrix).
1. Scalar Calculations
1.1.
MATLAB can be used as a scientic calculator. To begin a MATLAB session, type matlab or click
on a MATLAB icon and wait for the prompt, i.e., > , to appear. (To exit MATLAB, type exit or
>
quit.) You are now in the MATLAB workspace.
You can calculate 3.17 5.7 + 17/3 by entering
>> 3.17*5.7 + 17/3
and 220 by entering
>> 2 20
12
And
j=1 1/j can be entered as
>> 1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + 1/7 + 1/8 + 1/9 + 1/10 + 1/11 + 1/12
You can enter a number in scientic notation using the operator. For example, you can enter
21020 by
>> 2*10 -20
MATLAB, however, uses e to represent 10 so that MATLAB displays
2.0000e-20
The standard way to input 21020 is as 2e-20 or 2E-20 or 2.e-20 or 2.E-20 (even
2.0000000e-00020 is acceptable).
Warning: 1020 cannot be input as e-20, but must be input as 1e-20 or 1E-20 or 1.e-20 or 1.E-20
or . . . .
MATLAB can also handle complex numbers, where i or j represents 1 . For example, 5i can be
input as 5i or as 5*i, while 51030 i can be input as 5e30i or as 5e30*i or as 5*10 30*i, but not
as 5*10 30i (which MATLAB considers to be 51030i ). To calculate (2 + 2i)4 , enter
>> (2 + 2i) 4
and MATLAB returns 64.
You can also save all of your input to MATLAB and most of the output (plots are not saved) by using
the diary command. This archive of your work can be invaluable when you are solving homework problems. You can later use an editor to extract the part you want to turn in, while burying all the false
starts and typing mistakes that occur. Conversely, if you are involved in a continuing project, this archive
can be invaluable in keeping a record of your progress.
If you do not specify a le, this archive is saved to the le diary (no extension) in the present directory. If the le already exists, this is appended to the end of the le (i.e., the le is not overwritten).
Because of this feature you can use the diary command without fear that crucial work will be overwritten.
If you are entering a line and make a mistake, there are a number of ways you can correct your error:
you can use the backspace or delete key to erase all the text back to your mistake,
you can use the left-arrow key, i.e., , and the right-arrow key, i.e., , to move back and forth
in the line, or
you can use the mouse to move back and forth in the line.
Frequently, you will want to reexecute the previous line, or another previous line. For example, you
might have made a mistake in the previous line and so it did not execute, or did not execute correctly.
Of course, you can just retype the line but, if it is very long, this can get very time-consuming. Instead,
you can use the up-arrow key, i.e., , to move backward, one statement at a time (or the down-arrow
key, i.e., to move forward). Then hit the enter (or the return) key to execute the line.
1.2. Variables
Arithmetical Operations
a+b
a-b
a*b
Addition.
Subtraction.
Multiplication.
a/b
a\b
a b
diary
1.2.
Division.
Left division, (this is exactly the same as
b/a ).
Exponentiation (i.e., ab ).
Saves your input to MATLAB and most of the output to disk. This command toggles
diary on and o. (If no le is given, it is saved to the le diary in the current directory.)
diary on turns the diary on.
diary off turns the diary o.
diary <file name> saves to the named le.
The up-arrow key moves backward in the MATLAB workspace, one line at a time.
Variables
1.2. Variables
declared (or typed). A variable springs into existence the rst time it is assigned a value, and its type
depends on its context.
At start-up time, MATLAB also contains some predened variables. Many of these are contained in the
table below. Probably the most useful of these is pi.
Warning: Be careful since you can redene these predened variables. For example, if you type
>
> pi = 2
then you have redened and no error messages will be printed out!
Another very useful predened variable is ans, which contains the last calculated value which was not
stored in a variable. For example, it sometimes happens that you forget to put a value into a variable.
Then MATLAB sets the expression equal to the variable ans. For example, if you type
>> (3.2*17.5 - 5/3.1) 2
but then realize that you wanted to save this value, simply enter
>> x = ans
and x now contains (3.2 17.5 5/3.1)2 .
We will discuss character strings in detail in Section 3.3. For now,
>> x = Silly Walks
puts the text Silly walks into the variable x.
In MATLAB it is trivial to display a variable: simply type it. For example, if x has the value 23.6
then
>> x
returns
x =
-23.6000
It is sometimes useful to display the value of a variable or an expression or a character string without
displaying the name of the variable or ans. This is done by using disp. For example,
>> disp(x)
>> disp(pi 3)
>> disp( And now for something completely different )
>> disp( ------------------------------------------ )
displays
-23.6000
31.0063
And now for something completely different
-----------------------------------------(The command fprintf, which will be discussed in Section 6, allows much ner formatting of variables.)
Note: When disp displays a variable or an array or an expression, it follows with a blank line. However,
when it displays a string or a string variable, it does not.
Incidentally, a valid name for a MATLAB variable is a character string containing letters (upper or
lower case), digits, and underscores where the rst character must be a letter. The maximum length of a
name is too long to worry about. However, there are a few names which are reserved because they have
special meanings. The reserved words, called keywords, are
break
case
catch
classdef
continue
else
elseif
end
for
function
global
if
otherwise
parfor
persistent
return
(Of course, you can still use End or END but you probably shouldnt.)
Variables can also be deleted by using clear. For example, to delete x type
spmd
switch
try
while
>> clear x
Warning: This is
clear x
>
>
clear
realmax
The default variable name when one has not been specied.
.
Approximately the smallest positive real number on the computer such that
1 + eps = 1 .
(as in 1/0 ). You can also type inf.
Not-a-Number (as in 0/0 ). You can also type nan.
1 .
1 (the same as i because engineers often use these interchangeably).
The smallest usable positive real number on the computer. This is approximately
the smallest positive real number that can be represented on the computer (on some
computer realmin/2 returns 0 ).
The largest usable positive real number on the computer. This is approximately the
largest positive real number that can be represented on the computer (on most computer
2*realmax returns Inf ).
About Variables
are case sensitive (so xa is not the same as Xa ).
can contain up to 31 characters (but this is certainly overkill).
must start with a letter, and can then be followed by any number of letters, numbers,
and/or underscores (so z 0
is allowed).
do not need to be declared or typed.
To display a variable, type it alone on a line.
To delete a variable, type clear <variable>.
Variables:
disp(X)
,
;
1.3.
Displays a variable (including an array) or a string without printing the variable name or
ans.
Separates multiple statements on the same line. The results appear on the screen.
When this ends a MATLAB command, the result is not printed on the screen. This can
also separate multiple statements on the same line.
Round-o Errors
The most important principle for you to understand about computers is the following.
Principle 1.1.
Computers do integer arithmetic correctly (as long as the numbers are not too large to be stored in the
computer). However, computers cannot store most oating-point numbers (i.e., real numbers) correctly.
For example, the fraction 1/3 is equal to the real number 0.3333 . . . Since a computer cannot store this
innite sequence of threes, the number has to be truncated.
eps is close to the dierence between the exact number 1/3 and the approximation to 1/3 used in
MATLAB. It is dened to be the smallest positive real number such that 1 + eps > 1 (although it is
not actually calculated quite this accurately). For example, in MATLAB 1 + 0.1 is clearly greater than
1; however, on our computer 1 + 1e-40 is not. To see this, when we enter
>> (1 + .1) - 1
we obtain 0.1000 as expected.
Note: MATLAB guarantees that the expression in parentheses is evaluated rst, and then 1 is subtracted
from the result.
However, when we enter
>> (1 + 1.e-40) - 1
MATLAB returns 0 rather than 1.e-40. The smallest positive integer n for which
>> (1 + 10 (-n)) - 1
returns 0 is computer dependent. (On our computer it is 16.) What is not computer dependent is that
this leads to errors in numerical calculations. For example, when we enter
>> n = 5; ( n (1/3) ) 3 - n
MATLAB returns -1.7764e-15 rather than the correct result of 0. If you obtain 0, try some dierent
values of n. You should be able to rerun the last statement executed without having to retype it by using the up-arrow key. Alternatively, on a Mac or a PC use the copy command in the menu; in Unix enter
p.
Note: It might not seem important that MATLAB does not do arithmetical operations precisely. However,
you will see in Section 5.2 that there are simple examples where this can lead to very incorrect
results.
One command which is occasionally useful when you are just playing around is the input command,
which displays a prompt on the screen and waits for you to enter some input from the keyboard. For ex3
ample, if you want to try some dierent values of n in experimenting with the expression (n1/3 ) n,
enter
>> n = input( n = ); ( n (1/3) ) 3 - n
The argument to the command input is the string which prompts you for input, and the input is stored
in the variable n; the semicolon keeps the result of this command from being printed out. You can easily
rerun this line for dierent values of n (as we described above) and explore how round-o errors can aect
simple expressions.
Note: You can input a character string in two ways:
>> str = input( input string: );
and then enter, for example, Upper class twit of the year or
>> str = input( input string: , s );
and then enter Upper class twit of the year. The rst must enter a string while the second simply enters text until the line ends.
Warning: eps and realmin are very dierent numbers. realmin is approximately the smallest positive
number that can be represented on the computer, whereas eps is approximately the smallest positive number on the computer such that 1 + eps = 1. ( eps/realmin is larger than the
total number of atoms in the known universe.)
Request Input
input( <prompt> )
Displays the prompt on the screen and waits for you to input whatever is desired. The optional second argument of s allows you to enter a string
(including spaces) without using quote marks.
10
1.4.
Formatting Printing
3
The reason that (n1/3 ) n can be nonzero numerically is that MATLAB only stores real numbers to a
certain number of digits of accuracy. Type
>> log10(1/eps)
and remember the integer part of this number. This is approximately the maximum number of digits of accuracy of any calculation performed in MATLAB. For example, if you type 1/3 in MATLAB the
result is only accurate to approximately this number of digits. You do not see the decimal representation
of 1/3 to this number of digits because on start-up MATLAB only prints the result to four decimal digits
or ve signicant digits if scientic notation is used (e.g., the calculation 1/30000 is displayed in scientic notation). To change how the results are printed out, use the format command in MATLAB. Use
each of these four format functions and then type in 1/3 to see how the result is printed out.
Format Options
format short
format long
format short e
format long e
format short g
format long g
1.5.
MATLAB contains a large number of mathematical functions. Most are entered exactly as you would
write them mathematically. For example,
>> sin(3)
>> exp(2)
>> log(10)
return exactly what you would expect. As is common in programming languages, the trig functions are
evaluated in radians. However, there are corresponding functions which are evaluated in degrees.
Almost all the functions shown here are built-in functions. That is, they are coded in C so they execute
very quickly. The one exception is the factorial function, i.e., n! = 1 2 3 n, which is calculated by
>> factorial(n)
Note: This function is actually calculated by generating the vector (1, 2, . . . , n) and them multiplying all
its elements together by prod([1:n]). (We discuss the colon operator in Section 2.2.)
There is an important principle to remember about computer arithmetic in MATLAB.
If all the numbers you enter into MATLAB to do some calculation are \reasonably large" and the result of this calculation is one or more numbers which are \close to"
eps , it is very likely that the number or numbers should be zero.
Principle 1.2.
As an example, enter
>> deg = pi/180; th = 40; 1 - ( cos(th*deg) 2 + sin(th*deg) 2 )
The result is 1.1102e-16. Clearly, all the numbers entered into this calculation are reasonable and the
result is approximately eps. Obviously, the result is supposed to be zero since, from the Pythagorean
theorem
cos2 + sin2 = 1
for all angles . MATLAB tries to calculate the correct result, but it cannot quite. It is up to you to
interpret what MATLAB is trying to tell you.
Note: If you obtained zero for the above calculation, try
>> th = input( angle = ); 1 - ( cos(th*deg) 2 + sin(th*deg) 2 )
11
1+
x
x2
x3
x
x2
x3
+
+
+ 1 =
+
+
+ ;
1!
2!
3!
1!
2!
3!
the term within parentheses is very close to 1 and so subtracting by 1 causes a loss of many digits in the
result. For example,
>> exp(1.e-8) - 1 = 9.999999939225290e-09
>> expm1(1.e-8) = 1.000000005000000e-08
>> exp(1.e-20) - 1 = 0
>> expm1(1.e-20) = 9.999999999999999e-21
Similarly,
(y 1)3
(y 1)4
y 1 (y 1)2
+
log y =
1
2
3
4
so if y 1 then accuracy is lost in the calculation of y 1. This can be avoided by entering x directly
in
x x2
x3
x4
log(1 + x) =
+
+ ,
1
2
3
4
which is evaluated by log1p(x).
Warning: There is one technical detail about functions that will trip you up occasionally: how does MATLAB determine whether a word you enter is a variable or a function? The answer is that MATLAB rst checks if the word is a variable and only if it fails does it check if the word is a function. For example, suppose you enter
>
> sin = 20
by mistake (possibly you meant bin = 20 but were thinking about something else). If you now
type
>
> sin(3)
MATLAB will reply
??? Index exceeds matrix dimensions.
because it recognizes that sin is a variable. Since MATLAB considers a variable to be a vector
of length one, its complaint is that you are asking for the value of the third element of the vector sin (which only has one element). Similarly, if you enter
>
> sin(.25*pi)
MATLAB will reply
Warning: Subscript indices must be integer values.
because it thinks you are asking for the .25-th element of the vector sin. The way to undo
your mistake is by typing
>
> clear sin
12
1.6.
ex .
ex 1.
n! for n a non-negative integer.
If x 0 this is the largest integer which is x.
If x < 0 this is the smallest
integer which is x.
floor(x)
This is the largest integer which
is x.
heaviside(x) If x > 0 this returns 1,
if x < 0 this returns 0, and
if x = 0 this returns 1/2 .
log(x)
The natural log of x, i.e., loge x.
log10(x)
The common log of x, i.e.,
log10 x.
log1p(x)
log(x + 1).
mod(x, y)
The modulus after division.
That is, x n y where
n = floor(x/y).
rem(x, y)
The remainder of x/y. This is
almost the same as mod(x, y).
Warning: be careful if x < 0.
round(x)
The integer which is closest to
x.
sec(x)
sec x.
secd(x)
sec x where x is in degrees.
sech(x)
sech x.
sign(x)
If x > 0 this returns +1,
if x < 0 this returns 1, and
if x = 0 this returns 0.
sin(x)
sin x.
sind(x)
sin x where x is in degrees.
sinh(x)
sinh x.
x.
sqrt(x)
tan(x)
tan x.
tand(x)
tan x where x is in degrees.
tanh(x)
tanh x.
exp(x)
expm1(x)
factorial(n)
fix(x)
Complex Numbers
MATLAB can work with complex numbers as easily as with real numbers. For example, to nd the
roots of the quadratic polynomial x2 + 2x + 5 enter
>> a = 1; b = 2; c = 5;
>> x1 = ( -b + sqrt( b 2 - 4*a*c ) ) / (2*a)
>> x2 = ( -b - sqrt( b 2 - 4*a*c ) ) / (2*a)
The output is
-1.0000 + 2.0000i
and
-1.0000 - 2.0000i
13
eiz + eiz
2
and
sin z =
eiz eiz
.
2i
1.7.
conj(z)
imag(z)
real(z)
z = x iy.
The imaginary part of z, i.e., y.
The real part of z, i.e., x.
Script M-les
So far we have always entered MATLAB statements directly into the text window so that they are executed immediately. However, if we want to repeatedly execute a number of statements we have to put
them all on one line and reexecute the whole line. This line can get very l o o o n n n g! The solution is to
type the sequence of statements in a separate le named <file name>.m. It is easy to edit this le to
remove any errors, and the sequence can be executed whenever desired by typing
>> <file name>
The MATLAB statements themselves are not printed out, but the result of each statement is, unless
a semicolon ends it. This type of le is called a script m-le: when MATLAB executes the command
<file name> the contents of the le <file name>.m are executed just as if you had typed them into
into the text window. We will not emphasize script m-les further, but you will nd many occasions where
they are very helpful.
However, there is one point we need to emphasize. Make sure your le name is not the same as
one of MATLAB's commands or functions. If it is, your le will not execute MATLABs will! To
check this, you can enter
>> type <file name>
which types out the entire le file name.m if it is written in MATLAB and types out
<file name> is a built-in function.
(A built-in function is written in C or Fortran and so cannot be viewed directly.) It your le is typed out,
ne; if not, change the name of your le.
A long expression can be continued to a new line by typing three periods followed by the enter (or
20
return) key. For example,
j=1 1/j can be entered as
If a is a complex number, then its complex conjugate, denoted by a is obtained by changing the sign of i
whenever it appears in the expression for a. For example, if a = 3 + 17i, then a = 3 17i; if a = ei/4 , then
a = ei/4 ; if a = (2 + 3i) sin(1 + 3i)/(3 5 i), then a = (2 3i) sin(1 3i)/(3 + 5 i).
14
1.8. Help!
>> 1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + 1/7 + 1/8 + 1/9 + 1/10 + 1/11 + 1/12 + ...
1/13 + 1/14 + 1/15 + 1/16 + 1/17 + 1/18 + 1/19 + 1/20
although there are much better ways to obtain this same expression with many fewer keystrokes (as you
will see in Section 2.8). Lines can also be continued in the MATLAB workspace by using three periods,
but it is much more common to use continuation in an m-le.
If your m-le is very long, it is often valuable to include comments to explain what you are doing. Each
line of comments must begin with the percent character, i.e., %. Comments can appear alone on a line
or they can follow a statement that you have entered.
Odds and Ends
type
...
%
1.8.
Help!
Before discussing how to obtain help in MATLAB, here is a good place to discuss a very frustrating
situation where you desperately need help: how do you abort a MATLAB statement which is presently
executing. The answer is simply to type C (that is, hold down the control key and type c).
The on-line help facility in MATLAB is quite extensive. If you type
>> help
you will get a list of all the topics that you can peruse further by typing help followed by the name of
the topic. If you want help on a specic command, simply type help followed by the name of the command, i.e.,
help <command>
For example, if you forget the exact form of the format command, just type
>> help format
and you will see all the various ways that the output can be formatted.
Note: Typing
>> help ?
gives you lots of information about arithmetical and relational and logical operators and special
characters.
There is a more general command that can help you determine which commands might be of use. The
command lookfor searches through the rst line of all MATLAB help entries for a particular string. It is
case insensitive so capital letters need not be used. For example,
>> lookfor plot
returns all the MATLAB commands that have something to do with plots. (There are over one hundred.)
This command may be useful or it may not be. However, it is worth a try if you cannot remember the
name of the command you want to use.
Warning: All of the thousands of MATLAB commands have to be checked, so this command might run
slowly.
Note: The string need not be a complete word. For example, the string compl is contained in the words
complement, complex, complete, completion, and incomplete and in the capitals of all
these words.
If you want to nd out more about a specic command, enter
>> type <command>
or
>> edit <command>
If the command is written in MATLABs programming language (as discussed in Section 8), the entire
function will be typed out for the former and appear in a new window in the latter. These commands cannot return anything useful on internal MATLAB commands, called built-in function, which are coded in
C.)
MATLAB also has an entire reference manual on-line which can be accessed by entering
15
1.9. Be Able To Do
>>
doc
or
>> helpdesk
This hypertext documentation is displayed using your Web browser. It generally gives much more information than the help command, and in a more easily understood format.
After working for a while, you may well forget what variables you have dened in the workspace. Simply type who or whos to get a list of all your variables (but not their values). who simply returns the
names of the variables you have dened, while whos also returns the size and type of each variable. To
see what a variable contains, simply type the name of the variable on a line.
By the way, the demonstrations available by running demo show many of the capabilities of MATLAB
and include the actual code used. This is always a good place to look if you are not sure how do do something.
Two commands that dont quite t in any category are save and load. However, since these commands are occasionally very helpful, this is a good place to discuss them. Occasionally, you might need to
save one or more MATLAB variables: it might have taken you some time to generate these variables and
you might have to quit your MATLAB session without nishing your work or you just might be afraid
that you will overwrite some of them by mistake. The save command saves the contents of all your variables to the le matlab.mat. Use doc to learn how to save all the variables to a le of your own choice
and how to save just some of the variables. The load command loads all the saved variables back into
your MATLAB session. (As we discuss in Section 4.1, the load command can also be used to input our
own data into MATLAB.)
Getting Help
help
doc
helpdesk
type <command>
lookfor <keyword>
who
whos
demo
save
load
C
1.9.
On-line help.
help lists all the primary help topics.
help <command> displays information about the command.
On-line help hypertext reference manual.
doc accesses the manual.
doc <command> displays information about the command.
Accesses the main page of the on-line reference manual.
Displays the actual MATLAB code for this command.
Searches all MATLAB commands for this keyword.
Lists all the current variables.
Lists all the current variables in more detail than who.
Runs demonstrations of many of the capabilities of MATLAB.
Saves all of your variables.
Loads back all of the variables which have been saved previously.
Abort the command which is currently executing (i.e., hold down the control
key and type c).
Be Able To Do
After reading this section you should be able to do the following exercises. The MATLAB statements
are given on page 159.
1. Consider a triangle with sides a, b, and c and corresponding angles ab, ac, and bc.
(a) Use the law of cosines, i.e.,
c2 = a2 + b2 2ab cos ab ,
These variables are saved in binary format; when loaded back in using load the variables will be exactly the
same as before. The contents of this le can be viewed by the user with an editor but the contents will appear
to be gibberish. The contents can only be interpreted by the load command.
16
ters.
This makes it much easier to understand MATLAB operations. This is also a good practice
for you to use.
In addition, when we write vector we mean a column vector and so it is immediately obvious
that A*x is a legitimate operation of a matrix times a vector as long as the number of columns
of the matrix A equals the number of rows of the column vector x. Also, x*A is illegitimate
because the column vector x has only one column while the matrix A is expected to have more
than one row. On the other hand, x A is legitimate ( x denotes the conjugate transpose of the
vector x ) as long as the row vector x has the same number of columns as the number of rows
of the matrix A.
In addition, we have very specic notation for denoting vectors and matrices and the elements of each.
We collect all this notation here.
Notation: Rm denotes all real column vectors with m elements and Cm denotes all complex column vectors with m elements.
Rmn denotes all real mn matrices (i.e., having m rows and n columns) and Cmn denotes all complex mn matrices.
Notation: In this overview the word vector means a column vector so that Cm = Cm1 . Vectors are denoted by boldface letters, such as x; we will write a row vector as, for example, xT , where T
denotes the transpose of a matrix or vector (that is, the rows and columns are reversed.)
Notation: A = (aij ) means that the (i, j)-th element of A (i.e., the element in the i-th row and the j-th
column) is aij .
x = (xi ) means that the i-th element of x is xi .
By the way MATLAB works with complex matrices as well as it does real matrices. To remind you of
this fact, we will use C rather than R unless there is a specic reason not to. If there is a distinction between the real and complex case, we will rst describe the real case and then follow with the complex case
in parentheses.
17
2.1.
Generating Matrices
1
A = 4
7
2
5
8
3
6
9
in MATLAB type
>> A = [1 2 3; 4 5 6; 7 8 9]
(where denotes one or more spaces) or
>> A = [ 1 2 3 ; 4 5 6 ; 7 8 9]
or
>> A = [1,2,3; 4,5,6; 7,8,9]
or
>> A = [ 1 , 2 , 3 ; 4 , 5 , 6 ; 7 , 8 , 9 ]
In other words, either spaces or commas can be used to delineate the elements of each row of a matrix;
semicolons are required to separate rows. (Any number of spaces can be put around commas or semicolons
to improve the readability of the expression.)
Notation: Since we prefer spaces, we will generally use them rather than commas to separate elements in a
row.
Rows can also be separated by beginning each on a separate line. For example, the matrix A can also
be entered by
>> A = [1,2,3
4,5,6
7,8,9]
However, we consider this to be more work than simply using semicolons and will not use it again. The
more complicated matrix
3 sin 1
1 2+ 3
17/3
+3
C = e2
1/3 2 3 7 cos /7
can be entered by typing
>> C = [ 1 2+sqrt(3) 3*sin(1); exp(2) 17/3 pi+3; 1/3 2-sqrt(3) -7*cos(pi/7) ]
or
>> C = [ 1, 2+sqrt(3), 3*sin(1); exp(2), 17/3, pi+3; 1/3, 2-sqrt(3), -7*cos(pi/7) ]
Warning: When an element of a matrix consists of more than one term, it is important to enter all the
terms without spaces unless everything is enclosed in parentheses. For example,
>
> x1 = [1 pi+3]
is the same as
>
> x2 = [1 pi+ 3]
and is the same as
>
> x3 = [1 (pi +3)]
but is not the same as
>
> x4 = [1 pi +3]
% not the same as the previous three statements
(Try it!) In other words, MATLAB tries to understand what you mean, but it does not always
succeed.
Denition
The transpose of a matrix A Cmn , denoted by AT , is obtained by reversing the rows and columns
of A. That is, if A = (aij ) then AT = (aji ). (For example, the (2, 4) element of AT , i.e., i = 2 and
j = 4, is a42 .)
A square matrix A is symmetric if AT = A.
The conjugate transpose of a matrix A Cmn , denoted by AH , is obtained by reversing the rows
and columns of A and then taking the complex conjugates of all the elements. That is, if A = (aij )
18
1
B = 4
7
2
5
8
3
6
10
without having to enter all nine elements. If A (see the beginning of this section) has already been generated, the simplest way is to type
>> B = A; B(3,3) = 10
Also, the element xi of the vector x is x(i) in MATLAB. For example, to create the column vector
x = (1, 2, 3, . . . , 47, 48, 49, 51)T R50
enter
>> x = [1:50] ; x(50) = 51
or
>> x = [1:50] ; x(50) = x(50) + 1
or
>> x = [1:50] ; x(length(x)) = x(length(x)) + 1
where length returns the number of elements in a vector.
MATLAB also has a number of commands that can generate matrices. For example,
19
>>
C = zeros(5)
or
>> C = zeros(5, 5)
generates a 55 zero matrix. Also,
>> C = zeros(5, 8)
generates a 58 zero matrix. Finally, you can generate a zero matrix C with the same size as an already
existing matrix, such as A, by
>> C = zeros(size(A))
where size(A) is a row vector consisting of the number of rows and columns of A. This command is frequently used to preallocate a matrix of a given size so that MATLAB does not need to guess how large
to make it.
Similarly, you can generate a matrix with all ones by ones(n) or ones(m, n) or ones(size(D)).
You can also generate the identity matrix, i.e., the matrix with ones on the main diagonal and zeroes o of
it, by using the command eye with the same arguments as above.
Another useful matrix is a random matrix, that is, a matrix whose elements are all random numbers. This is generated by the rand command, which takes the same arguments as above. Specically,
the elements are uniformly distributed random numbers in the interval (0, 1). To be precise, these are
pseudorandom numbers because they are calculated by a deterministic formula which begins with an initial seed which is called the state , not the seed. Every time that a new MATLAB session is started,
the default seed is set, and so the same sequence of random numbers will be generated. However, every
time that this command is executed during a session, a dierent sequence of random numbers is generated.
If desired, a dierent seed can be set at any time by entering
>> rand( state , <non-negative integer state number>)
Note: You can use the word seed, rather than state, as the rst argument to rand but this causes
MATLAB to use an older random number generator which has a period of 231 2. The period of
the current default random number generator is 21492 .
Random matrices are often useful in just playing around or trying out some idea or checking out
some algorithm. The command randn generates a random matrix where the elements are normally distributed (i.e., Gaussian distributed) random numbers with mean 0 and standard deviation 1.
There is another random function which is useful if you want to reorder a sequence. The command
randperm(n) generates a random permutation of the integers 1, 2, . . . , n.
Note: randperm changes the state of rand.
MATLAB also makes it convenient to assemble matrices in pieces, that is, to put matrices together to
make a larger matrix. That is, the original matrices are submatrices of the nal matrix. For specicity, let
us continue with A (see the beginning of this section). Suppose you want a 53 matrix whose rst three
rows are the rows of A and whose last two rows are all ones. This is easily generated by
>> [ A ; ones(2, 3) ]
(The semicolon indicates that a row has been completed and so the next rows consist of all ones. The fact
that A is a matrix in its own right is immaterial. All that is necessary is that the number of columns of A
be the same as the number of columns of ones(2, 3).) This matrix could also be generated by
>> [ A ; ones(1, 3) ; ones(1, 3) ]
or by
>> [ A ; [1 1 1] ; [1 1 1] ]
or even by
>> [ A ; [1 1 1 ; 1 1 1] ]
Similarly, to generate a 34 matrix whose rst three columns are the columns of A and whose last
column is (1, 5, 9)T type
>> [A [1 5 9] ]
(The space following the A indicates that the next column is to follow. The fact that the next entry is
a column vector is immaterial. All that is necessary is that the number of rows of A be the same as the
number of rows in the new last column.)
20
Elementary Matrices
zeros(n)
zeros(m, n)
zeros(size(A))
ones
eye
rand
randn
randperm(n)
size(A)
length(x)
A.
2.2.
Transpose, i.e., AT .
21
should generate the column vector (0.02, 0.021, 0.022, . . . , 0.979, 0.98)T . However, because of
round-o errors in storing oating-point numbers, there is a possibility that the last element in
x will be 0.979. The MATLAB package was written specically to minimize such a possibility,
but it still remains. We will discuss the command linspace which avoids this diculty in Section 4.1. An easy x to avoid this possibility is to calculate x by
>
> x = [20:980] /1000
2.3.
Manipulating Matrices
For specicity in this subsection we will mainly work with the 56 matrix
1
7
E = 13
19
25
2
8
14
20
26
3
9
15
21
27
4 5 6
10 11 12
16 17 18 ,
22 23 24
28 29 30
2 3 4 5
F = 14 15 16 17 .
26 27 28 29
You can generate this submatrix more easily by typing
>> F = E( 1:2:5 , 2:5 )
There is an additional shortcut you can use: in a matrix a colon by itself represents an entire row or
column. For example, the second column of F is F(:,2) and the second row is F(2,:). To replace the
second column of F by two times the present second column minus four times the fourth column enter
>> F(:,2) = 2*F(:,2) - 4*F(:,4)
And suppose you now want to double all the elements in the last two columns of F. Simply type
>> F(:,3:4) = 2*F(:,3:4)
There is a last-additional shortcut you can use. Suppose you want the matrix F to consist of the odd
rows of E and the second to the last column, as we did above. You might be changing the size of E and
not want to have to remember how large it is. This can be easily done by
>> F = E( [1:2:end] , [2:end] )
The keyword end designates the last element of the dimension: 5 for the rows of E and 6 for the
columns.
Note: The keyword end has a number of meanings. It also ends a block of code begun with a if, for,
while, or switch (as we will see later). Finally, it can also terminate a primary or subfunction,
and it must terminate a nested function (as we will also see later).
Returning to :, entering E(:,:) prints out exactly the same matrix as entering E (as does
E(1:end,1:end) ). This is not a very useful way of entering E, but it shows how the colon operator
can work. On the other hand, entering
This possiblity is much more real in the programming language C. For example, the statement
for ( i = 0.02; i <= 0.98; i = i + .001 )
generates successive values of i by adding 0.001 to the preceding value. It is possible that when i should have
the value 0.98, due to round-o errors the value will be slightly larger; the condition i <= 0.98 will be false
and the loop will not be evaluated when i should be 0.98.
22
>> G = E( : , 6:-1:1 )
generates a matrix with the same size as E but with the columns reversed, i.e.,
6
12
G = 18
24
30
5
11
17
23
29
4
10
16
22
28
3
9
15
21
27
2
8
14
20
26
1
7
13 .
19
25
It is also very easy to switch rows in a matrix. For example, to switch the third and fth rows of G, enter
the single line
>> G([5 3],:) = G([3 5],:)
which is much simpler, and more transparent, than the three lines
>> temp = G(3,:)
>> G(3,:) = G(5,:)
>> G(5,:) = temp
Finally, there is one more use of a colon. Entering
>> f = E(:)
generates a column vector consisting of the columns of E (i.e., the rst ve elements of f are the rst
column of E, the next ve elements of f are the second column of E, etc.).
Note: On the right side of an equation, E(:) is a column vector with the elements being the columns of
E in order. On the left side of an equation, E(:) reshapes a matrix. However, we will not discuss
this reshaping further because the reshape command described below is easier to understand.
The colon operator works on rows and/or columns of a matrix. A dierent command is needed to work
on the diagonals of a matrix. For example, you extract the main diagonal of E by typing
>> d = diag(E)
(so d is the column vector (1, 8, 15, 22, 29)T ), one above the main diagonal by typing
>> d1 = diag(E, 1)
(so d1 is the column vector (2, 9, 16, 23, 30)T ), and two below the main diagonal by typing
>> d2 = diag(E, -2)
(so d2 is the column vector (13, 20, 27)T ).
The MATLAB command diag transforms a matrix (i.e., a non-vector) into a column vector. The converse also holds: when diag is applied to a vector, it generates a symmetric matrix. The command
>> F = diag(d)
generates a 55 matrix whose main diagonal elements are the elements of d, i.e., 1, 8, 15, 22, 29, and
whose o-diagonal elements are zero. Similarly, entering
>> F1 = diag(d1, 1)
generates a 66 matrix whose rst diagonal elements (i.e., one above the main diagonal) are the elements
of d1, i.e., 2, 9, 16, 23, 30, and whose other elements are zero, that is,
0
0
0
F1 =
0
0
0
2
0
0
0
0
0
0
9
0
0
0
0
0
0
16
0
0
0
0
0
0
23
0
0
0
0
0
.
0
30
0
Finally, typing
>> F2 = diag(d2, -2)
generates a 55 matrix whose 2-nd diagonal elements (i.e., two below the main diagonal) are the elements of d2, i.e., 13, 20, 27, and whose other elements are zero, i.e.,
0
0
F2 = 13
0
0
0
0
0
20
0
23
0 0
0 0
0 0
0 0
27 0
0
0
0 .
0
0
The Toeplitz matrix is a very special matrix whose values are constant along each diagonal. For example,
7
4
3 1
4 3
2 7
5 2 7 4
1 5 2 7
is generated by
toeplitz([7 -2 -5 1], [7 4 3 1])
If the Topelitz matrix is symmetric, only the row or the column elements need be entered (i.e., only one
argument is required).
You can also extract the upper triangular or the lower triangular part of a matrix. For example,
>> G1 = triu(E)
constructs a matrix which is the same size as E and which contains the same elements as E on and above
the main diagonal; the other elements of G1 are zero. This command can also be applied to any of the
diagonals of a matrix. For example,
>> G2 = triu(E, 1)
constructs a matrix which is the same size as E and which contains the same elements as E on and above
the rst diagonal, i.e.,
0 2 3 4 5 6
0 0 9 10 11 12
G2 = 0 0 0 16 17 18 .
0 0 0 0 23 24
0 0 0 0 0 30
The similar command tril extracts the lower triangular part of a matrix.
As an example of the relationship between these three commands, consider the square random matrix F
generated by
>> F = rand(6)
All the following MATLAB commands calculate F anew:
>> triu(F) + tril(F) - diag(diag(F))
>> triu(F, 1) + diag(diag(F)) + tril(F, -1)
>> triu(F) + tril(F, -1)
>> triu(F, 2) + diag(diag(F, 1), 1) + tril(F)
Note: Numerically the rst command might not generate exactly the same matrix as the following three
because of round-o errors.
By the way, diag, triu and tril cannot appear on the left-hand side of an equation. Instead, to
zero out all the diagonals above the main diagonal of F enter
>> F = F - triu(F, 1)
and to zero out just the rst diagonal above the main diagonal enter
>> F = F - tril(triu(F, 1), 1)
What if you want to insert numbers from the upper right-hand corner of a matrix to the lower left-hand
corner? There is no explicit function which does this but there are a number of indirect functions:
fliplr(A) ips the matrix from left to right, i.e., reverses the columns of the matrix;
flipud(A) ips the matrix up and down, i.e., reverses the rows of the matrix;
rot90(A) rot90 rotates the matrix 90 ; and
rot90(A,k) rotates the matrix k90 .
MATLAB has a command which is useful in changing the shape of a matrix while keeping the same
numerical values. The statement
>> K = reshape(H, m, n)
reshapes the matrix H Cpq into K Cmn where m and n must satisfy mn = pq (or an error message will be generated). A column vector is generated from H, as in H(:), and the elements of K are
24
taken columnwise from this vector. That is, the rst m elements of this column vector go in the rst column of K, the second m elements go in the second column, etc. For example, the matrix E which has
been used throughout this subsection can be easily (and quickly) generated by
>> E = reshape([1:30], 6, 5)
Occasionally, there is a need to delete elements of a vector or rows or columns of a matrix. This is easily
done by using the null matrix []. For example, entering
>> x = [1 2 3 4]
>> x(2) = []
results in x = (1, 3, 4)T . As another example, you can delete the even columns of G by
>> G( : , 2:2:6 ) = []
The result is
6 4 2
12 10 8
G = 18 16 14 .
24 22 20
30 28 26
Also, occasionally, there is a need to replicate or tile a matrix. That is, the command
>> B = repmat(A, m, n)
generates a matrix B which contains m rows and n columns of copies of A. (If n = m then repmat(A,
m) is sucient.) If A is a p by q matrix, then B Rmpnq . This even works if A is a scalar, in which
case this is the same as
>> B = A*ones(m, n)
(but it is much faster if m and n are large since no multiplication is involved).
One frequent use of repmat is when a specic operation is to be applied to each row or to each column of a matrix. For example, suppose that the column vectors { x1 , x2 , . . . , xn } have been combined
into the matrix X and we want to calculate the corresponding matrix for the vectors yj = xj + a for all
j N[1, n]. This can be easily done by
>> Y = X + repmat(a, 1, n);
which, unfortunately, requires that the new matrix A = repmat be created. We would prefer to simply
enter
>> Y = X + a
(WRONG);
However, we can enter
>> Y = bsxfun(@plus, X, a);
which, incidentally, is much faster than using repmat. This command can actually be applied to multidimensional matrixes, but we will only describe it for bsxfun(<function handle>, A, b). <fun> is a
function handle which operates on the matrix A Rmn and the column vector b Rm or the row vector b R1n . The simplest operation is to let the function handle be one of the following:
Built-in Functions for bsxfun
@plus
@minus
@times
@rdivide
@ldivide
@power
@max
@min
@rem
@mod
@atan2
Plus
Minus
Array multiply
Array right division
Array left division
Array power
Binary maximum
Binary minimum
Remainder
Modulus
Arctangent
@hypot
@eq
@ne
@lt
@le
@gt
@ge
@and
@or
@xor
Hypotenuse
Equal
Not equal
Less than
Less than or equal to
Greater than
Greater than or equal to
Logical AND
Logical OR
Logical exclusive OR
Of course, it is possible to write your own function which inputs either two column vectors of the same
size or one column vector and one scalar; it then outputs a column vector of the same size as the input.
25
Manipulating Matrices
A(i,j)
A(:,j)
A(i,:)
A(:,:)
A(?1,?2)
A(:)
diag(A)
diag(A, k)
diag(d)
diag(d, k)
triu(A)
triu(A, k)
tril(A)
tril(A, k)
fliplr(A)
flipud(A)
rot90(A)
rot90(A, k)
repmat(A, m, n)
bsxfun(<fnc>, A, b)
reshape(A, m, n)
[]
toeplitz(c,r)
2.4.
ai,j .
the j-th column of A.
the i-th row of A.
A itself.
There are many more choices than we care to describe:
?1 can be i or i1:i2 or i1:i3:i2 or : or [i1 i2 ... ir] and
?2 can be j or j1:j2 or j1:j3:j2 or : or [j1 j2 ... jr].
On the right-hand side of an equation, this is a column vector containing
the columns of A one after the other.
A column vector of the k-th diagonal of the matrix (i.e., non-vector) A. If
k is not given, then k = 0.
A square matrix with the k-th diagonal being the vector d. If k is not
given, then k = 0.
A matrix which is the same size as A and consists of the elements on and
above the k-th diagonal of A. If k is not given, then k = 0.
The same as the command triu except it uses the elements on and below
the k-th diagonalof A. If k is not given, then k = 0.
Flips a matrix left to right.
Flips a matrix up and down.
Rotates a matrix k90 . If k is not given, then k = 1.
Generates a matrix with m rows and n columns of copies of A. (If n = m
the third argument is not needed.)
Perform the operation given by the function handle on all the columns of
the matrix A using the column vector b or on all the rows using the row
vector b
Generates an mn matrix whose elements are taken columnwise from A.
Note: The number of elements in A must be mn.
The null matrix. This is also useful for deleting elements of a vector and
rows or columns of a matrix.
Generates a Toeplitz matrix where the elements along each diagonal are
constant. c and r are the values on the rst diagonal and the rst row
respectively.
Matrix Addition:
If A, B Cmn then the MATLAB operation
>> A + B
means A + B = (aij ) + (bij ) = (aij + bij ). That is, the (i, j)-th element of A + B is aij + bij .
Matrix Subtraction:
If A, B Cmn then the MATLAB operation
>> A - B
means A B = (aij ) (bij ) = (aij bij ).
Matrix Multiplication by a scalar:
If A Cmn then for any scalar c the MATLAB operation
>> c*A
means cA = c(aij ) = (caij ). For example, the matrix q = (0, .1, .2, .3, .4, .5)T can be generated by
26
p times
27
>> z = y. .* [1:n]
because you do not want to take the complex conjugate of the complex elements of y.
Elementwise Division:
If A, B Cmn , then the MATLAB operation
>> A./B
means (aij /bij ).
Elementwise Left Division:
If A, B Cmn , then the MATLAB operation
>> B.\A
means the same as A./B
Elementwise Exponentiation:
If A Cmn , then
>> A. p
means (ap ) and
ij
>> p. A
means (paij ). Also, if A, B Cmn , then
A. B
bij
means aij .
Where needed in these arithmetic operations, MATLAB checks that the matrices have the correct size.
For example,
>> A + B
will return an error message if A and B have dierent sizes, and
>> A*B
will return an error message if the number of columns of A is not the same as the number of rows of B.
Note: There is one exception to this rule. When a scalar is added to a matrix, as in A + c, the scalar is
promoted to the matrix cJ where J has the same size as A and all its elements are 1. That is,
>> A + c
is evaluated as
>> A + c*ones(size(A))
This is not a legitimate expression in linear algebra, but it is a very useful expression in MATLAB.
For example, you can represent the function
y = 2 sin(3x + 4) 5
for x [2, 3]
ai bi .
i=1
In linear algebra this is called the inner product and is dened for vectors a, b Rn by aT b. It is calculated by
>> a *b
(If a, b Cn the inner product is aH b and is calculated by a *b.) The outer product of these two vectors is dened to be abT and is calculated by
>> a*b
(If a, b are complex the outer product is abH and is calculated by a*b .) It is important to keep these
two products separate: the inner product is a scalar, i.e., aT b R (if complex, aH b C ), while the outer
28
A\B
b/A
B/A
Matrix addition.
Matrix subtraction.
Matrix multiplication.
Matrix exponentiation.
The solution to Ax = b by Gaussian
elimination when A is a square nonsingular matrix.
The solution to AX = B by Gaussian
elimination.
The solution to xA = b where x and
b are row vectors.
The solution to XA = B.
cputime
tic, toc
2.5.
A.*B
A. p
p. A
A. B
A./B
B.\A
Elementwise multiplication.
Elementwise exponentiation.
Elementwise division.
Elementwise left division, i.e., B.\A is
exactly the same as A./B.
Approximately the amount of CPU time (in seconds) used during this session.
Returns the elapsed time between these two commands.
Operator Precedence
It is important to list the precedence for MATLAB operators. That is, if an expression uses two or more
MATLAB operators, in which order does MATLAB do the calculations? For example, what is 1:n+1? Is
it (1:n)+1 or is it 1:(n+1)? And if we solve ACx = b by A*C\b, does MATLAB do (A*C)\b or A*(C\b)?
The former is C1 A1 b while the latter is AC1 b and these are completely dierent. The following table shows the precedence of all MATLAB operators, that is, the order in which it evaluates an expression.
The precedence is from highest to lowest. Within each precedence level, operators are evaluated from left
The CPU, Central Processing Unit, is the guts of the computer, that is, the hardware that executes the
instructions and operates on the data.
29
2.6. Be Careful!
(
.
+ [unary plus]
.
+ [addition]
:
<
&
|
&&
||
)
.
- [unary minus]
./
[subtraction]
.\
<=
>=
>
==
The unary plus and minus are the plus and minus signs in x = +1 and x = 1. The plus and minus signs for addition and subtraction are, for example, x = 5 + 1 and x = 10 13. Thus, 1:n+1 is
1:(n+1) because + has higher precedence than :. Also, A*C\b = (A*C)\b because * and \
have the same precedence and so the operations are evaluated from left to right.
2.6.
Be Careful!
Be very careful: occasionally you might misinterpret how MATLAB displays the elements
of a vector or matrix. For example, the MATLAB command eig calculates the eigenvalues of a square
matrix. (We discuss eigenvalues in Section 7.)
der 5, i.e.,
1
1/2
1/3
1/
4
1
/5
1
/3
1
/4
1
/5
1
/6
1
/7
1
/4
1
/5
1
/6
1
/7
1
/8
1
/5
1
/6
1
/7
1
/8
1
/9
On the other hand, in the statistical computer languages R and S (which are somewhat similar to MATLAB),
: has higher precedence than + and so 1:n+1 is (1:n)+1 2:(n+1).
30
2.6. Be Careful!
displays
ans =
3.2879e-06
3.0590e-04
1.1407e-02
2.0853e-01
1.5671e+00
which makes it clear that the smallest eigenvalue is far from zero.
On the other hand, if you enter
>> format short
>> A = [1 2 3; 4 5 6; 7 8 9]
>> eig(A)
MATLAB displays
ans =
16.1168
-1.1168
-0.0000
It might appear from our previous discussion that the last eigenvalue is not zero, but is simply too small
to appear in this format. However, entering
>> format short e
>> ans
displays
ans =
1.6117e+01
-1.1168e+00
-8.0463e-16
Since the last eigenvalue is close to eps, but all the numbers in the matrix A are of reasonable size,
you can safely assume that this eigenvalue is zero analytically. It only appears to be nonzero when calculated by MATLAB because computers cannot add, subtract, multiply, or divide correctly!
As another example of how you might misinterpret the display of a matrix, consider the Hilbert matrix
of order two
1 1/2
.
H= 1
/2 1/3
We write H100 as
H100 1010
1.5437
0.8262
0.8262
0.4421
1.0e+10 *
1.5437
0.8262
0.8262
0.4421
It is very easy to miss the term 1.0e+10 * because it stands apart from the elements of the matrix.
31
Similarly, entering
>> format short
>> H = hilb(2)
>> ( H (1/2) ) 2 - H
should result in the zero matrix, since (H1/2 ) = H. However, MATLAB displays
ans =
1.0e-15 *
0.2220
0
0
0
where, again, it is easy to miss the term 1.e-15 * and not realize that this matrix is very small in
fact, it should be zero.
Be careful: MATLAB has nite memory. You should have no problem creating a matrix by
>> A = zeros(1000)
but you might well have a problem if you enter
>> A = zeros(10000)
The amount of memory available is dependent on the computer and the operating system and is very hard
to determine. Frequently it is much larger than the amount of physical memory on your computer. But,
even if you have sucient memory, MATLAB may slow to a crawl and become unusable. The whos command will tell you how much memory you are using and show you the size of all your variables. If you
have large matrices which are no longer needed, you can reduce their sizes by equating them to the null
matrix, i.e., [], or remove them entirely by using clear.
Warning: Recall that the clear command is very dangerous because clear A deletes the variable A
but clear (without anything following) deletes all variables!
2.7.
In linear algebra mathematical functions cannot usually be applied to matrices. For example, eA and
sin A have no meaning unless A is a square matrix. (We will discuss their mathematical denitions in
Section 15.)
Here we are interested in how MATLAB applies common mathematical functions to matrices and vectors. For example, you might want to take the sine of every element of the matrix A = (aij ) Cmn , i.e.,
B = (sin aij ). This is easily done in MATLAB by
>> B = sin(A)
Similarly, if you want C = (eaij ), enter
>> C = exp(A)
Also, if you want D =
aij type
>> C = sqrt(A)
or
>> C = A. (1/2)
All the common mathematical functions in the table entitled Some Common Real Mathematical Functions in Section 1.5 can be used in this way.
As we will see in the section on graphics, this new interpretation of mathematical functions makes it
easy in MATLAB to graph functions without having to use the MATLAB programming language.
2.8.
MATLAB has a number of simple commands which are used quite frequently. Since many of them
are quite useful in analyzing data, we have grouped them around this common theme.
To calculate the maximum value of the vector x, type
>> m = max(x)
If you also want to know the element of the vector which contains this maximum value, type
32
1
n
xi x
i=1
33
1/2
34
max(A)
max(A,B)
min(x)
min(A)
mean(x)
mean(A)
norm(x)
norm(A)
prod(x)
prod(A)
sort(x)
sort(A)
std(x)
std(A)
sum(x)
sum(A)
diff(x)
diff(A)
cumsum(x)
cumsum(A)
cumprod(x)
cumprod(A)
2.9.
We have already discussed 1-D arrays (i.e., vectors) and 2-D arrays (i.e., matrices). Since these are two
of the most fundamental objects in linear algebra, there are many operations and functions which can be
applied to them. In MATLAB you can also use multidimensional arrays (i.e., n-D arrays).
A common use for multidimensional arrays is simply to hold data. For example, suppose a company
produces three products and we know the amount of each product produced each quarter; the data naturally ts in a 2-D array, i.e., (product, amount). Now suppose the company has ve sales regions so we
split the amount of each product into these regions; the data naturally ts in a 3-D array, i.e., (product,
region, amount). Finally, suppose that each product comes in four colors; the data naturally ts in a 4-D
array, i.e., (product, color, region, amount).
For another example, a 3-D array might be the time evolution of 2-D data. Suppose we record a grey
scale digital image of an experiment every minute for an hour. Each image is stored as a matrix M with
mi,j denoting the value of the pixel positioned at (xi , yj ). The 3-D array Mall can contain all these images: Mall(i,j,k) denotes the value of the pixel positioned at (xi , yj ) in the k-th image. The entire
k-th image is Mall(:,:,k) and it is lled with the k-th image M by
>> Mall(:,:,k) = M
35
2.10. Be Able To Do
If you want to multiply M by another matrix A, you can use M*A or Mall(:,:,k)*A; if you want to
average the rst two images you can use .5*(Mall(:,:,1)+Mall(:,:,2)).
Many MATLAB functions can be used in n-D, such as ones, rand, sum, and size. The cat function is particularly useful in generating higher-dimensional arrays. For example, suppose we have four
matrices A, B, C, and D R27 which we want to put into a three-dimensional array. This is easily done
by
>> ABCD = cat(3, A, B, C, D)
which concatenates the four matrices using the third dimension of ABCD. (The 3 denotes the third dimension of ABCD.) And it is much easier than entering
>> ABCD(:,:,1) = A;
>> ABCD(:,:,2) = B;
>> ABCD(:,:,3) = C;
>> ABCD(:,:,4) = D;
If instead, we enter
>> ABCD = cat(j, A, B, C, D)
then the four matrices are concatenated along the j-th dimension of ABCD. That is,
cat(1, A, B, C, D) is the same as [A, B, C, D] and cat(2, A, B, C, D) is the same as
[A; B; C; D].
Another useful command is squeeze which squeezes out dimensions which only have one element. For
example, if we enter
>> E = ABCD(:,2,:)
(where the array ABCD was created above), then we might think that E is a matrix whose columns consist
of the second columns of A, B, C, and D. However, size(E) = 2 1 4 so that E is a three-dimensional
array, not a two-dimensional array. We obtain a two-dimensional array by squeeze(E).
The command permute reorders the dimensions of a matrix. For example,
>> ABCD = cat(3, A, B, C, D)
>> BCDA = permute( ABCD, [2 3 4 1] )
is the same as
>> BCDA = cat(3, B, C, D, A)
That is, the second argument of permute shows where the original ordering of the dimensions, i.e., 1, 2,
. . . , n, are to be placed in the new ordering. ipermute is the inverse of permute so, for example,
>> BCDA = cat(3, B, C, D, A)
>> ABCD = ipermute( BCDA, [2 3 4 1] )
Multidimensional Array Functions
cat
ipermute
permute
squeeze
2.10.
Concatenates arrays; this is useful for putting arrays into a higher-dimensional array.
The inverse of permute.
Reorders the dimensions of a multidimensional array.
Removes (i.e., squeezes out) dimensions which only have one element.
Be Able To Do
After reading this section you should be able to do the following exercises. The answers are given on
page 159.
1. Consider the matrix
1 2 3 4
5 6 7 8
A=
.
9 10 11 12
13 14 15 16
36
2.10. Be Able To Do
A=
1
4
1
1
4
. .
.
1
. .
.
1
0
. .
.
4
1
1
4
Rnn
A=
1
4
e2
1
9
..
.
1 1 1
1 1 1
1 1 1
A=
1 1 1
1 1 1
5 1 1
1
..
.
en1
0
..
.
(n 1)2
en
1
n2
Rnn
into MATLAB.
1 0 0 0 0 0
1 0 0 0 0 0
1 0 0 0 0 0
1 0 0 0 0 0
1 0 0 0 0 0
1 0 0 0 0 0
5
0
0
.
0
0
0
(a) Enter it using as few keystrokes as possible. (In other words, dont enter the elements individually.)
(b) Zero out all the elements of A below the diagonal.
5. Enter the column vector
x = (0, 1, 4, 9, 16, 25, . . . , 841, 900)T
using as few keystrokes as possible. (In other words, dont enter the elements individually.)
6. (a) Generate a random 55 matrix R.
(b) Determine the largest value in each row of R and the element in which this value occurs.
(c) Determine the average value of all the elements of R.
(d) Generate the matrix S where every element of S is the sine of the corresponding element of R.
(e) Put the diagonal elements of R into the vector r.
7. Generate the matrix
1 2 3
A = 4 5 6 .
7 8 10
(a) Calculate a matrix B which is the square root of A. That is, B2 = A. Also, calculate a matrix C each
of whose elements is the square root of the corresponding element of A.
(b) Show that the matrices you have obtained in (a) are correct by substituting the results back into the
original formulas.
37
3.1.
Anonymous Functions
In MATLAB it is common to dene a mathematical function in a separate le as we discuss in Section 8.3. (This is similar to writing a function or subroutine or subprogram in a high-level computer
language.) However, if the mathematical function is particularly simple, that is, it can be written as one
simple expression, we can dene it in MATLAB using an anonymous function. If our function is
f (< arg1 >, < arg2 >, . . .) = < expression >
the MATLAB statement is
>> f = @(<arg1>, <arg2>, ...) <expression>
For example, we can dene the function
f (t) = t5 e2t cos(3t)
by
>> f = @(t) t. 5 .* exp(-2*t) .* cos(3*t)
and then evaluate it by
>> x = [0:.01:1]
>> fx = f(x)
>> A = rand(5)
>> fA = f(A)
More generally, we can dene
g(x, y, a, b, c) = xa ebx cos(cy)
by
>> g = @(x, y, a, b, c) x. a .* exp(-b.*x) .* cos(c.*y)
in which case any of the input arguments can be in R or in Rn . It is also possible although probably
not very useful to let g have one vector argument, say x = (x, y, a, b, c)T by
>> g = @(x) x(1) x(3) * exp(-x(4)*x(1)) * cos(x(5)*x(2))
(In this example there is no advantage to using .* or . .)
Warning: It is quite easy to forget to put dots (i.e., .) before the mathematical operations of multiplication (i.e., * ), division (i.e., / ), and exponentiation (i.e., ). For example, if f is dened by
>
> f = @(t) t 5 * exp(-2*t) * cos(3*t)
then
>
> f(3)
is allowed, but not
>
> f([1:10])
Be careful!
The syntax for dening an anonymous function is
>> @(<argument list>) <expression>
38
(Since there is no left-hand side to this expression, the name of this function is ans.) The symbol @ is the
MATLAB operator that constructs a function handle. This is similar to a pointer in C which gives the address of a variable or of a function. The name handle is used in MATLAB to denote a variable which
refers to some object which has been created. Thus, we can think of an anonymous function as being
created by
(<argument list>) <expression>
and the handle to the function (in C, the address of the function) being returned by using @. By the way,
we can create a function handle to a MATLAB function by, for example,
>> f = @cos
so that f(3) is the same as cos(3). We give an example where this is very useful in Section 3.4
It is important to understand that all user-dened variables which appear in <expression> must either appear in the argument list or be dened before the function is dened. If the variable does not
appear in the argument list, then its value is xed when the function is dened. For example, if a very simple function is dened by
>> r = 10
>> h = @(x) r*x
then the function is h(x) = 10x even if r is modied later. Thus,
>> h(5)
returns 50 and so does
>> r = 0
>> h(5)
Warning: Dont forget that if a variable does not appear in the argument list, then its value is xed when
the function is dened.
A function can also be dened but don't do it by the inline command. For example, the function f dened above can also be dened by
>> f = inline( t. 5 .* exp(-2*t) .* cos(3*t) , t )
In general, if our function is
3.2.
It is sometimes necessary to pass the name of a function into a MATLAB function or a function m-le
created by the user. For example, as we discuss in Section 4.1, we can plot the function y = f (x) in the
interval [5, +5] by
fplot(<function "name">, [-5 +5])
But how do we pass this name?
We put the name in quotes because we do not pass the name of the function, but its handle. If f has
been dened by an anonymous function, then we enter
fplot(f, [-5 +5])
39
3.3. Strings
because f is a variable which we have already dened. If fnc is a MATLAB function or a user-dened
function m-le, then it is not known in the MATLAB workspace so
fplot(fnc, [-5 +5])
% WRONG
will not work. Instead, we use
fplot(@fnc, [-5 +5])
% CORRECT
Note: There are a number of older ways to pass function names. For example,
>> fplot( fnc , [-5 +5])
will also work. We can even pass a simple function by, for example,
>> fplot( (x*sin(x) + sqrt(1 + cos(x)))/(x 2 + 1) , [-5 +5])
but don't do it! Instead, use anonymous functions.
3.3.
Strings
Character strings are a very minor part of MATLAB, which is mainly designed to perform numerical
calculations. However, they perform some very useful tasks which are worth discussing now.
It is often important to combine text and numbers on a plot. Since we discuss graphics in the next section, now is a good time to discuss how characters are stored in MATLAB variables. A string variable,
such as
>> str = And now for something completely different
is simply a row vector with each character (actually its ASCII representation as shown on page 163) being
a single element. MATLAB knows that this is a text variable, not a regular row vector, and so converts
the numerical value in each element into the corresponding character when it is printed out. For example,
to see what is actually contained in the vector str enter
>> str + 0
or
>> 1*str
Since str is a row vector, a substring can be easily extracted. For example,
>> str(1:7)
returns And now and
>> str([9:11, 34])
returns ford.
Character variables are handled the same as vectors or matrices. For example, to generate a new text
variable which adds by Monty Python to str, i.e., to concatenate the two strings, enter
>> str2 = [str
- by Monty Python ]
or
>> str2 = [str,
- by Monty Python ]
(which might be easier to read). To convert a scalar variable, or even a vector or a matrix, to a character
variable use the function num2str. For example, suppose you enter
>> x = linspace(0, 2*pi, 100)
>> c1 = 2
>> c2 = -3
>> y = c1*sin(x) + c2*cos(x)
and want to put a description of the function into a variable. This can be done by
>> s = [ num2str(c1), *sin(x) + , num2str(c2), *cos(x) ]
without explicitly having to enter the values of c1 and c2. (An optional second argument to
num2str determines exactly how the number or numbers are to be printed, but this is usually not needed.)
A text variable can also contain more than one line if it is created as a matrix. For example,
>> Str = [ And
now
for
something
completely
different ]
is four lines long. Since str is a matrix, each row must have the same number of elements and so we have
to pad all but the longest row. (Using cell arrays, we will shortly show how to avoid this requirement that
40
3.4.
It is occasionally useful in MATLAB to have a single variable contain all the data which is related to
a specic task and this data might well consist of scalars, vectors and/or matrices, and text variables.
One simple reason for this is that it is easier to pass all the data into and out of functions. A cell array
generalizes the standard arrays which were discussed in the previous section. The elements of a standard array are numbers, either real or complex, whereas the elements of a cell array can be any data
type. The primary dierence between a cell array and a structure is that in a structure the elements are
named rather than numbered. We consider this an advanced topic not because it is complicated, but because it is so seldom necessary.
A simple example of a cell array is
>> C = {2+3i, go cells ; [1 2 3] , hilb(5) }
and the output is
C =
[2.0000 + 3.0000i]
go cells
[3x1 double]
[5x5 double]
The only dierence between this and a standard array is that here curly braces, i.e., {. . . }, enclose the
elements of the array rather than brackets, i.e., [ . . . ]. Note that only the scalar and the text variable
are shown explicitly. The other elements are only described. A second way to generate the same cell array
is by
>> C(1,1) = {2+3i }
>> C(1,2) = { go cells }
>> C(2,1) = {[1 2 3] }
>> C(2,2) = {hilb(5) }
and a third way is by
41
42
43
3.5.
A MATLAB variable can have a large number of dierent types of values. These values used to be
called data types, but they are now commonly called classes which is a central concept in objectoriented programming (OOP). The OOP capabilities of MATLAB are similar to those in C++ and Java.
We will discuss some of these capabilities at the end of this subsection. However, rst we discuss the
fundamental classes in MATLAB. An important point to remember is that a variable in most programming languages is a single quantity, whereas in MATLAB it is a matrix or array of quantities.
We have already described a number of fundamental classes, and we rst discuss those which occur
frequently in this tutorial.
double: By default any variable that is given a numerical value is a double precision oating-point
number. For example, the variable x which is dened by x = 1 is an instance of the
double class, not an integer class.
char: All strings are instances of the char class. Each character in a string is represented by 2
bytes because it can represent any Unicode UTF-16 character (although we are only interested in ASCII characters).
cell: A cell variable itself is an instance of the cell class, but it can contain any number of elements, which can all be instances of dierent classes.
struct: Similarly, a structure variable is an instance of the struct class, but it can contain any
number of elds, which can all be instances of dierent classes.
function handle: This provides a means to call a function indirectly.
logical: We will discuss logical variables in Section 8.1, but a simple example is
>
> A = rand(2)
>
> C = (A > .5)
Each element of C R22 has the logical value 1 if the corresponding element of A is > .5
and value 0 otherwise. These logical values are each 1 byte.
MATLAB has 15 fundamental classes, each in the form of a matrix (from a 00 matrix up to an n
44
dimensional matrix for any n ). For completeness, we now list them all.
Fundamental Classes
double
single
int8
uint8
int16
uint16
int32
uint32
int64
uint64
char
logical
cell
struct
function handle
For example, to obtain an instance of the single class you can enter
A = single(rand(5))
The same technique holds for all the numerical classes.
Warning: Caveat Emptor! The procedures for combining dierent numerical classes is very dierent from
other programming languages. For example, the results of
>
> a = 5.5
>
> i = int32(3)
>
> j = int8(127)
>
> ai = a + i
>
> aj = a + j
are ai = 9 is an instance of the int32 class and aj = 127 is an instance of the int8 class.
To determine the class of a variable, use the function class. You can also determine if a variable has a
particular class by using isa. Continuing the previous example,
>> class(i)
returns int32 and
>> isa(i, int8 )
returns 0.
In addition, MATLAB has user-dened classes, similar to classes in object-oriented programming languages. A simple template for generating a new class is
45
3.6. Be Able To Do
3.6.
Be Able To Do
After reading this section you should be able to do the following exercises. The answers are given on
page 159.
1. Generate a structure with the elds name, rank, and serial number. Put something appropriate in
each in two ways:
(1) directly, i.e., s.name = ???, and
(2) using the struct command.
Then add one to the serial number.
2. (a) Generate a 23 cell array with the following elements:
(1,1): a uniform random matrix of size 5.
(2,1): the string Hilbert.
(1,2): 10.
(2,2): the function handle for the function sin e x.
(1,3): this is the square the matrix in (1, 1) .
46
4. Graphics
A very useful feature of MATLAB is its ability to generate high quality two- and three-dimensional
plots using simple and exible commands. All graphical images are generated in a graphics window,
which is completely separate from the text window in which MATLAB commands are typed. Thus,
non-graphical and graphical commands can be completely intermixed.
Graphical images can be generated both from data calculated in MATLAB and from data which has
been generated outside of MATLAB. In addition, these images can be output from MATLAB and printed
on a wide variety of output devices, including color ink-jet printers and black-and-white and color laser
printers.
There are a number of demonstrations of the graphical capabilities in MATLAB which are invoked by
>> demo
Since the MATLAB commands which generate the plots are also shown, this demo makes it quite easy to
generate your own graphics. You also can have very ne control over the appearance of the plots. We begin by considering only the basic commands; more advanced graphics commands are discussed in the next
section.
Note: Most MATLAB commands which take vectors as arguments will accept either row or column vectors.
4.1.
Two-Dimensional Graphics
The MATLAB command plot is used to constructing basic two-dimensional plots. For example, suppose you want to plot the functions y1 = sin x and y2 = ecos x for x [0, 2]; also, you want to plot
y3 = sin cos(x2 x) for x [0, 8]. First, generate n data points on the curve by
>> n = 100;
>> x = 2*pi*[0:n-1] /(n-1);
>> y1 = sin(x);
>> y2 = exp(cos(x));
>> xx = 8*[0:n-1]/(n-1);
>> y3 = sin( cos( xx. 2 - xx ) );
We plot these data points by
>> plot(x, y1)
>> plot(x, y2)
>> plot(xx, y3)
Note that the axes are changed for every plot so that the curve just ts inside the axes. We can generate
the x coordinates of the data points more easily by
>> x = linspace(0, 2*pi, n);
>> xx = linspace(0, 8, n);
The linspace command has two advantages over the colon operator:
47
(1) the endpoints of the axis and the number of points are entered directly as
>> x = linspace(<first point>, <last point>, <number of points>)
so it is much harder to make a mistake; and
(2) round-o errors are minimalized so you are guaranteed that x has exactly n elements, and its rst
and last elements are exactly the values entered into the command.
To put all the curves on one plot, type
>> plot(x, y1, x, y2, xx, y3)
Each curve will be a dierent color but this will not be visible on a black-and-white output device.
Instead, you can change the type of lines by
>> plot(x, y1, x, y2, -- , xx, y3, : )
where -- means a dashed line and : means a dotted line. (We discuss these symbols in detail in
Section 4.3.) In addition, you can use small asterisks to show the locations of the data points for the y3
curve by
>> plot(x, y1, x, y2, -- , xx, y3, :* )
These strings are used to modify the color of the line, to put markers at the nodes, and to modify the type
of line as shown in the table below. (As we discuss later in this section, the colors are dened by giving
the intensities of the red, green, and blue components.)
Customizing Lines and Markers
Symbol Color (R G B)
r
g
b
y
m
c
w
k
red (1 0 0)
green (0 1 0)
blue (0 0 1)
yellow (1 1 0)
magenta (1 0 1)
(a deep purplish red)
cyan (0 1 1)
(greenish blue)
white (1 1 1)
black (0 0 0)
Marker Description
plus sign
circle
asterisk
point
cross
square
diamond
upward pointing
triangle
v
downward pointing
triangle
>
right pointing triangle
<
left pointing triangle
p
pentagram
h
hexagram
(none) no marker
+
o
*
.
x
s
d
For example,
>> plot(x, y1, r , x, y2, g--o , x, y3, mp )
plots three curves: the rst is a red, solid line; the second is a a green, dashed line with circles at the data
points; the third has magenta pentagrams at the data points but no line connecting the points.
As we discussed previously, it is very unlikely (but it is possible) that round-o errors might cause the
statement
>
> x = [0: 2*pi/(n-1): 2*pi] ;
to return n 1 elements rather than n. (For example, the output of [0 : 0.01 : 0.02-eps] is 0 0.0100.)
This is why we used the statement
>
> x = 2*pi*[0:n-1] /(n-1);
above, which does not suer from round-o errors because the colon operator is only applied to integers.
48
We can also plot the rst curve, and then add the second, and then the third by
>> plot(x, y1)
>> hold on
>> plot(x, y2)
>> plot(xx, y3)
>> hold off
Note that the axes can change for every new curve. However, all the curves appear on the same plot.
We briey digress to present a technical but very important detail. If a plot is hidden (possibly
because you have been typing in the workspace and have raised the MATLAB window above the graphics
window, or because there are some other windows visible on your monitor), you may not be able to see it.
The command
>> shg
raises the current graphics window above all other windows. This is a very useful command because plots
are frequently hidden. It is particularly benecial to put this before the rst plot command in a script
M-le: it cannot do any harm, and it will make the plot visible if it is already hidden.
We also briey digress to suggest another possible use for the plot command: make a movie. In Section 4.6 we will discuss how to make a real movie. However, it is easy in MATLAB to simulate the time
evolution of some function by by repeatedly using plot. We have just discussed how to put multiple
curves on a plot, but this rapidly becomes unwieldly. Instead, just replace one plot by another. For example, suppose that (for some strange reason) you want to plot the periodic function
10
ak e
g(x, t) =
k=1
for x [0, L]. This is a sum of k modes, each of which has a Gaussian shape with half-width w, where
the k th mode has amplitude ak and speed ck . The code entitled running guassians (which is contained in the accompanying zip le) is
%%%%% script m-file: running gaussians
a = .5;
L = 10;
max time = 100;
del time = .01;
max vert axis = 3;
f = @(x) exp(-(mod(x, L) - L/2). 2 / a 2);
nr modes = 20;
c = [1:nr modes] ;
nr points = 1001;
x = linspace(0, 10, nr points);
[X, C] = meshgrid(x, c);
R = repmat(1./(2*c-1), 1, nr points);
g = @(t) sum(R.*f(X - C*t));
ast y = linspace(.7*max vert axis, .95*max vert axis, nr modes);
for t = 0:del time:max time
ast x = mod(c*t + L/2, L);
plot(x, g(t), ast x, ast y, r* )
axis([0 L 0 max vert axis])
title(t)
drawnow
end
where ak = 1/k and ck = 1/(2k 1). In addition, the maximum value of each mode is shown by the red
asterisks which y across the plot. The for loop, which will be discussed in Section 8.1, causes the plot
If there is no graphics window then this command is equivalent to figure, while if there is a graphics window,
then this command is equivalent to figure(gcf). We discuss figure and gcf in advanced subsections.
49
to be repeated for the times [0:del time:max time]. The commands axis and title will be discussed
shortly, and meshgrid will be discussed in the next subsection. The command drawnow is very important
because otherwise the graphics window will be blank until the nal plot.
Instead of putting a number of curves on one plot, you might want to put a number of curves individually in the graphics window. You can display m plots vertically and n plots horizontally in one graphics
window by
>> subplot(m, n, p)
This divides the graphics window into mn rectangles and selects the p-th rectangle for the current plot.
All the graphics commands work as before, but now apply only to this particular rectangle in the graphics
window. You can bounce between these dierent rectangles by calling subplot repeatedly for dierent values of p. You can also position the plots anywhere in the gure by subplot( Position , [left
bottom width height]). For example,
>> subplot(Position, [0 0 .5 .5])
is the same as subplot(2, 2, 3).
Warning: If you are comparing a number of plots, it is important to have the endpoints of the axes be the
same in all the plots. Otherwise your brain has to try to do the rescaling on the y which
is very dicult. Of course, you frequently do not know how large the axes need to be until you
have lled up the entire graphics window. The axis command (discussed below) can then be
used to rescale all the plots.
In addition, you can determine the endpoints of the current plot by
>> v = axis
v(1) and v(2) are the minimum and maximum values on the x axis, and v(3) and v(4) are the corresponding values on the y axis. You can change the endpoints of the axes by
>> axis([-1 10 -4 4])
The general form of this command is axis([xmin xmax ymin ymax]). If you only want to set some of
the axes, set the other or others to Inf ( Inf if it is the minimum value and +Inf if it is the maximum). Also, you can force the two axes to have the same scale by
>> axis equal
or
>> axis image
and to have the same length by
>> axis square
To learn about all the options for these commands, use the doc command.
Note: The command axis is generally only in eect for one plot. Every new plot turns it o, so it must
be called for every plot (unless hold is on ).
The plot command generates linear axes. To generate logarithmic axes use semilogx for a logarithmic axis in x and a linear axis in y, semilogy for a linear axis in x and a logarithmic axis in y, and
loglog for logarithmic axes in both x and y.
MATLAB has two dierent commands to plot a function directly rather than plotting a set of points.
Warning: These commands do not always generate the correct curve (or curves) because they know nothing
of the actual behavior of the function. They can have problems with sharp peaks and asymptotes and other strange behavior. We will show some examples shortly.
The rst command we discuss is fplot, which can be executing by simply entering
>> fplot(<function handle>, <limits>)
where the function is usually generated as an anonymous function or a MATLAB function or a user generated function m-le (as described in Section 8.3). The limits are either
[xmin xmax]
in which case the y-axis just encloses the curve or
[xmin xmax ymin ymax]
in which case you are also specifying the endpoints on the y-axis.
Alternatively, you can use the pause command (discussed in Section 8.3) to make all the plots visible.
drawnow draws each new plot as fast as possible, whereas pause(time) pauses execution of the code for the given
time.
50
51
52
The load command is a little tricky because it can read in les generated both by MATLAB (using the save
command) and by the user. For example,
>
> save allvariables;
>
> clear
or
>
> save allvariables.mat;
>
> clear
saves all the variables to the le allvariables.mat in binary format and then deletes all the variables. Entering
>
> load allvariables
or
>
> load allvariables.mat
loads all these variables back into MATLAB using the binary format. On the other hand, if you create a le, say
mymatrix.dat, containing the elements of a matrix and enter it into MATLAB using
>
> load mymatrix.dat
you obtain a new matrix, called mymatrix, which contains these elements. Thus, the load command determines
how to read a le depending on the extension.
53
plots are to be printed then the print device can be changed once rather than in every print
command. Also, if you are printing many plots then you can easily modify the le names as in
>> i = 1
>> file = [ fiddlededum , num2str(i), .eps ]
>> print(device, file)
>> . . .
>> i = i + 1
>> file = [ fiddlededum , num2str(i), .eps ]
>> print(device, file)
>> . . .
Input-Output
csvread( <file name> )
load( <file name> )
Reads data into MATLAB from the named le, one row per line of
input; the numbers in each line must be separated by commas.
Reads data into MATLAB from the named le, one row per line
of input; the numbers in each line can be separated by spaces or
commas. The name of the resulting matrix is <file name>.
Writes out the elements of a matrix to the named le using the
same format as csvread.
Prints a plot or saves it in a le using various printer specic formats.
For example, print -deps <file name> saves the plot in the le
using encapsulated PostScript (so it can be plotted on a PostScript
laser printer).
54
Two-Dimensional Graphics
plot(x, y)
semilogx
semilogy
loglog
fplot(<function handle>,
<limits>)
ezplot(<function handle>
ezplot(<fnc 1>, <fnc 2>)
ezplot(<2D fnc>)
polar(r, theta)
ezpolar(<function handle>)
xlabel(<string>)
ylabel(<string>)
title(<string>)
axis
hold
linspace(a, b, n)
hist(x)
stairs(x,y)
errorbar(x, y, e)
errorbar(x, y, l, u)
subplot(m, n, p)
shg
drawnow
55
4.2.
Three-Dimensional Graphics
The MATLAB command plot3 plots curves in three-dimensions. For example, to generate a helix
enter
>> t = linspace(0, 20*pi, 1001);
>> c = cos(t);
>> s = sin(t);
>> plot3(c, s, t)
and to generate a conical helix enter
>> t = linspace(0, 20*pi, 2001);
>> c = cos(t);
>> s = sin(t);
>> plot3(t.*c, t.*s, t)
Also, you can put a label on the z-axis by
>> zlabel(<string>)
There is also an easy plot3 command. It generates the curve x(t), y(t), z(t) for t (0, 2) by
>> ezplot3(x, y, z)
if x, y, and z have been dened using anonymous functions. Again, you change the domain of t by
specifying the additional argument [tmin, tmax].
MATLAB also plots surfaces z = f(x, y) in three-dimensions with the hidden surfaces removed. First,
the underlying mesh must be created. The easiest way is to use the command meshgrid. This combines
a discretization of the x axis, i.e., { x1 , x2 , . . . , xm }, and the y axis, i.e., { y1 , y2 , . . . , yn }, into the rectangular mesh (xi , yj ) i = 1, 2, . . . , m , j = 1, 2, . . . , n in the xy plane. The function f can then be
evaluated at these mesh nodes. For example,
>> x = linspace(-3, 3, 61) ;
>> y = linspace(-2, 2, 41) ;
>> [X, Y] = meshgrid(x, y);
>> F = (X + Y).*exp( -X.*X - 2*Y.*Y );
>> mesh(X, Y, F)
generates a colored, wire-frame surface whereas
>> surf(X, Y, F)
generates a colored, lled-in surface. We discuss how to change the colors, and even how to use the colors
as another variable, in the next section.
You can change the view of a three-dimensional plot by using the view command. This command is
called in either of two ways:
First, you can give the angles from the origin of the plot to your eye by
view(<azimuth>, <elevation>)
where the azimuth is the angle in degrees in the xy plane measured from the y axis (so 0 is the
y axis, 90 is the x axis, 180 is the y axis, etc.) and the elevation is the angle in degrees up
from the xy plane toward the +z axis (so 0 is in the xy plane, 90 is on the +z axis, etc.).
Second, you can give the coordinates of a vector pointing from the origin of the plot to your eye by
view([x y z]), where you enter the coordinates of the vector.
If you type
>> contour(X, Y, F)
you will see contour plots of the surface. That is, you will be looking down the z axis at curves which
represent lines of constant elevation (i.e., constant z values). If we type
>> contour3(X, Y, F)
you will see contour plots of the surface in three dimensions. You can again change your view of these
curves by using the view command. These contour lines are labelled by
>> [C, h] = contour(X, Y, F)
>> clabel(C, h)
Also, contour lines are plotted at specic values by
>> contour(X, Y, F, v)
where v is a vector of the values. To obtain a lled contour plot enter
56
>> contourf(X, Y, F)
If you do not want to bother with generating the mesh explicitly, you can generate easy plots by
ezcontour, ezcontour3, ezmesh, and ezsurf.
A surface can also be plotted in polar coordinates. For example, the code which plots
f (r, ) =
r + e2r sin 2
1.2 r cos 3
for r 1
is
>> f = @(r, th) ( r + exp(2*r.*sin(2*th)) ) ./ ( 1.2 - r.*cos(3*th) );
>> r = linspace(0, 1, 51);
>> th = linspace(0, 2*pi, 61);
>> [R, Th] = meshgrid(r, th);
>> [X, Y] = pol2cart(Th, R);
>> surf(X, Y, f(R, Th))
The function pol2cart transforms the polar coordinates into cartesian coordinates which can be understood by surf, mesh, or contour.
We close with an additional detail about meshgrid. It can also generate a grid in three dimensions by,
for example,
>> x = linspace(-3, 3, 61) ;
>> y = linspace(-2, 2, 41) ;
>> z = linspace(0, 1, 11) ;
>> [X, Y, Z] = meshgrid(x, y, z);
Three dimensions is the hightest we can go with meshgrid. However, a multidimensional grid can also be
generated by
>> [X, Y, Z] = ndgrid(x, y, z);
and ndgrid can be used in any number of dimensions. The dierence between the two functions is that
the order of the rst two arguments is reversed. For example,
>> [X, Y] = meshgrid(1:3, 4:7)
returns
4 4 4
1 2 3
5 5 5
1 2 3
X=
, Y=
6 6 6
1 2 3
7 7 7
1 2 3
while
>> [X, Y] = ndgrid(1:3, 4:7)
returns
1
X = 2
3
1
2
3
1
2
3
1
4
2 , Y = 4
3
4
57
5
5
5
6
6
6
7
7
7
Three-Dimensional Graphics
plot3(x, y, z)
ezplot3(<fnc 1>,
<fnc 2>, <fnc 3>)
mesh(X, Y, Z)
ezmesh(<2D fnc>)
surf(X, Y, Z)
ezsurf(<2D fnc>)
view
meshgrid(x, y)
ndgrid(x, y)
pol2cart(Th, R)
zlabel(<string>)
axis
contour(X, Y, Z)
contourf(X, Y, Z)
ezcontour(<2D fnc>)
contour3(X, Y, Z)
ezcontour3(<2D fnc>)
clabel
subplot(m, n, p)
4.3.
Plots the data points in Cartesian coordinates. The general form of this
command is plot(x1, y1, z1, s1, x2, y2, z2, s2, ...) where s1,
s2, . . . are optional character strings containing information about the
type of line, mark, and color to be used.
Generates an easy plot in 3-D.
Plots a 3-D surface using a wire mesh.
Generates an easy 3-D surface using a wire mesh.
Plots a 3-D lled-in surface.
Generates an easy 3-D lled-in surface.
Changes the viewpoint of a 3-D surface plot by
view(<azimuth>, <elevation>) or view([x y z]).
Generates a 2-D grid given the x-coordinates and the y-coordinates of the
mesh lines.
Same as meshgrid except that the two arguments are reversed.
convert polar to cartesian coordinates.
Puts a label on the z-axis.
Controls the scaling and the appearance of the axes.
axis([xmin xmax ymin ymax zmin zmax]) changes the endpoints of the
axes.
Plots a contour looking down the z axis.
Plots a lled contour.
Generates an easy contour looking down the z axis.
Plots a contour in 3-D.
Generates an easy contour in 3-D.
Label contour lines generated by contour or contour3.
Remember than subplot can also be called in 3-D to put a number of
plots in one graphics window.
In the previous subsections we have discussed how to use simple graphics commands to generate basic plots. MATLAB can also do much more interesting graphics, and even publication quality graphics.
Here we discuss some of the more useful advanced features. We divide the topic into two subsections: the
rst discusses the commands themselves and the second discusses how to change some of the properties of
these commands.
Note: The demonstration program shows many more of the graphics capabilities of MATLAB. Enter
demo
and then in Help Navigator click on Graphics.
It is possible to obtain the current position of the cursor within a plot by using the ginput command.
For example, to collect any number of points enter
>> [x, y] = ginput
Each position is entered by pressing any mouse button or any key on the keyboard except for the carriage
return (or enter) key. To terminate this command press the return key. To enter exactly n positions, use
>> [x, y] = ginput(n)
You can terminate the positions at any time by using the return key. Finally, to determine which mouse
button or key was entered, use
>> [x, y, button] = ginput(n)
The vector button contains integers specifying which mouse button (1 = left, 2 = center, and 3 = right)
or key (its ASCII representation) was pressed.
58
Labels can also be added to a plot. Text can be placed anywhere inside the plot using
>> text(xpt, ypt, <string>)
The text is placed at the point (xpt,ypt) in units of the current plot. The default is to put the center of
the left-hand edge of the text at this point. You can also use the mouse to place text inside the plot using
>> gtext(<string>)
The text is xed by depressing a mouse button or any key.
If more than one curve appears on a plot, you might want to label each curve. This can be done directly
using the text or gtext command. Alternatively, a legend can be put on the plot by
>> legend(<string1>, <string2>, . . . )
Each string appears on a dierent line preceded by the type of line (so you should use as many strings as
there are curves). The entire legend is put into a box and it can be moved within the plot by using the
left mouse button.
TEX commands can be used in these strings to modify the appearance of the text. The results are
similar, but not quite identical, to the appearance of the text from the TEX program (so do some experimenting). Most of the common TEX commands can be used, including Greek letters; also, and
are used for superscripts and subscripts. For example, the x-axis can be labelled 2 and the y-axis
f (x) dx by
0
>> xlabel( \alpha 2 )
>> ylabel( \int 0 \pi\betaf(x) dx )
To see the complete list of TEX commands, enter
>> doc text
and then click on the highlighted word String.
Note: For you TeXers note the funny control sequence \betaf(x) which generates f (x). If you would
have typed \beta f(x) you would have obtained f (x) because MATLAB preserves spaces. If
typing \betaf(x) sets your teeth on edge, try \beta{}f(x) instead.
It is often essential for the title to include important information about the plot (which would, otherwise, have to be written down somewhere and connected to this specic plot). For example, suppose
you enter
>> x = linspace(0, 2*pi, 100)
>> c1 = 2
>> c2 = -3
>> p1 = 1
>> p2 = 3
>> y = c1*sin(x). p1 + c2*cos(x). p2
>> plot(x, y)
and you want to play around with the two coecients to obtain the most pleasing plot. Then you
probably should have the title include a denition of the function and you should not have to modify
the title by hand every time you change the coecients. This can be done by
>> t = [num2str(c1), *sin , num2str(p1), (x) + , num2str(c2), ...
*cos , num2str(p2), (x) ]
>> title(t)
where we use the text variable t, rather than putting the string directly into title, simply to make
the example easier to read. There is now a permanent record of the function which generated the curve.
(Alright, this isnt a great example, but its better than nothing.)
You can also put plots in a new graphics window by entering
>> figure
where the gures are numbered consecutively starting with one (and appear at the top of the window). Or
enter
>> figure(n)
and the gure will have the specic number n. This creates a new window, makes it visible, and makes it
the current target for graphics commands. You can bounce between graphics windows by entering
>> figure(n)
59
where n is the number of the graphics window you want to make current. New plots will now appear in
this gure. In this way much more information can be generated and viewed on the computer terminal.
Occasionally, it is useful to clear a gure. For example, suppose you divide a window into a 22 array of plotting regions and use subplot to put a plot into each region; you then save the gure into a
le. Next, you only want to put plots into two of these four regions. The diculty is that the other two
regions will still contain the previous plots. You can avoid this diculty by clearing the gure using
>> clf
which clears the current gure. You can clear a particular gure by clf(n) or clf(<handle>). In addition, you can clear the current gure by
>> close
or a particular gure by close(<handle>). You can clear a number of gures by
>> close all
All the above MATLAB commands can be used for 3-D graphics except for gtext. The text
command is the same as described above except that the position of the text requires three coordinates,
i.e.,
>> text(x, y, z, <string>)
As we discussed in the previous subsection, the mesh and surf commands allow us to plot a surface
in three dimensions where the colors on the surface represent its height. We can add a rectangle which
contains the correspondence between the color and the height of the surface by adding
>> colorbar
We can also let the colors represent a separate quantity C, which is also dened at each mesh point, by
changing the command to
>> mesh(X, Y, F, C)
or
>> surf(X, Y, F, C)
Each graphics window has a separate color map associated with it. This color map is simply an n3
matrix, where each element is a real number between 0 and 1 inclusive. In each row the rst column
gives the intensity of the color red, the second column green, and the third column blue; these are called
the RGB components of a color. For example, we show the RGB components of cyan, magenta, yellow,
red, blue, green, white, and black in the table Customizing Lines and Markers at the beginning of this
section; for further information, enter doc colorspec. The value input to this color map is the row representing the desired color.
For mesh or surf the value of F (or of C if there is a fourth argument) is linearly rescaled so its minimum value is 1 and its maximum value is n. To see the current color map, enter
>> colormap
To change the color map, enter
>> colormap(<color map>)
where <color map> can be an explicit n3 matrix of the desired RGB components or it can be a string
containing the name of an existing color map. The existing color maps can be found by typing
>> doc graph3d
A useful color map for outputting to laser printers is gray . In this colormap all three components of
each row have the same value so that the colors change gradually from black (RGB components [0 0 0])
through gray [.5 .5 .5]) to white [1 1 1]).
MATLAB can also ll-in two-dimensional polygons using fill or three-dimensional polygons using
fill3. For example, to draw a red circle surrounding a yellow square, enter
>> t = linspace(0, 2*pi, 100);
>> s = 0.5;
>> xsquare = [-s s s -s] ;
>> ysquare = [-s -s s s] ;
>> fill(cos(t), sin(t), r , xsquare, ysquare, y )
>> axis equal;
To obtain a more interesting pattern replace the above ll command by
>> colormap( hsv );
>> fill(cos(t), sin(t), [1:100], xsquare, ysquare, [100:10:130])
60
Rather than entering polygons sequentially in the argument list, you can enter
>> fill(X, Y, <color>)
where each column of X and Y contain the endpoints of a dierent polygon. Of course, in this case the
number of endpoints of each polygon must be the same, by padding if necessary. For example, to draw a
cube with all the faces having a dierent solid color, input the matrices
0 0 1 1 0 0
0 1 1 0 0 0
0 0 1 0 0 1
0 0 1 0 0 1
0 1 1 0 0 0
1 1 0 0 1 1
X=
, Z=
.
, Y=
0 1 1 0 1 1
1 1 1 1 0 1
1 1 0 0 1 1
0 0 1 1 1 1
1 1 1 1 0 1
0 1 1 0 0 0
Then enter
>> fill3(X, Y, Z, [1:6])
>> axis equal
Change your orientation using view to see all six faces. Read the documentation on fill and fill3 for
more details.
We include an example which shows in detail how to modify the colormap directly when using
contourf to generate a lled contour plot. Suppose you have an interesting function which takes on
both positive and negative values. You want the more positive values to be redder and the more negative
values to be greener and a zero value to be white. This is easily done by
%%%%% script m-file: colormap example
n = 101;
% 1
f = @(x,y) .5*(sin(2*pi*(x - y. 2)). 2 + 1.5*sin(2*pi*(x. 2 + y))) ./ ...
(1 + abs(x) + abs(y));
% 2
x = linspace(-1, 1, n);
% 3
y = x;
% 4
[X, Y] = meshgrid(x, y);
% 5
F = f(X, Y);
% 6
color scale = [0:.05:1] ;
% 7
C green = [color scale, ones(size(color scale)), color scale];
% 8
% 9
color scale = flipud(color scale(2:end));
C red = [ones(size(color scale)), color scale, color scale];
% 10
C = [C green; C red];
% 11
colormap(C)
% 12
contourf(X, Y, F, 20)
% 13
caxis([-1 1])
% 14
colorbar
% 15
The amusing function is dened in line 2. The array C green goes from green, i.e., (0 1 0), to white,
i.e., (1 1 1), in steps of 0.05. The array C red then goes from almost white, i.e., (1 0.95 0.95), to
red, i.e., (1 0 0), also in steps of 0.05. The complete array C is calculated in line 11 and the colormap
changed in line 12. The lled contour is calculated in line 13. However, the zero value of F does not correspond to white because the colors in the colormap change linearly from the minimum value of F, i.e.,
min(F(:)) = 0.58, to the maximum value of F, i.e., max(F(:)) = 0.89. Thus, the zero value of F has a
value of (1, 0.15, 0.15). This is corrected in line 14 where caxis changes the endpoints used in the colormap to a minimum of -1 and a maximum of +1; thus a value of 0 corresponds to the middle row of
C which is, in fact, white. Finally, in line 15 we attach the color map to the plot so that we can determine
the values in the contour plot.
Note: There is a linear scaling between the value of F and the corresponding color in the color map C
Rn,3 . For caxis([f min, f max]) the value f is rst modied to lie in the interval [f min, f max]
by f mod = max([min([f, f max]), f min]). Then the row ic of C is calculated by
ic = x
(f mod f min)(n 1)
f max f min
+1.
MATLAB can also plot a two-dimensional image (i.e., a picture) which is represented by a matrix
X Rmn . The (i, j)-th element of X species the color to use in the current color map. This color
61
appear in the (i, j)-th rectilinear patch in the plot. For example, to display the color image of a clown
enter
>> load clown
>> image(X);
>> colormap(map)
The image command inputs the matrix X and the colormap map from clown.mat. Then the image is
displayed using the new color map. Similarly,
>> load earth
>> image(X);
>> colormap(map);
>> axis image
displays an image of the earth. (The axis command forces the earth to be round, rather than elliptical.)
(In the demonstration program, after clicking on Visualization double-click on Image colormaps to see
the images which you can access in MATLAB and the existing color maps.)
Advanced Topic: Plots
caxis([v min, v max])
clf
colorbar
colormap
demo
figure
fill(x, y, <color>)
fill3(x, y, z, <color>)
image
Change the scaling used in the color map so that the value of
v min corresponds to the rst row of the colormap and v max to the
last row. Values outside this interval map to the closest endpoint.
Clear a gure (i.e., delete everything in the gure)
Adds a color bar showing the correspondence between the value and
the color.
Determines the current color map or choose a new one.
Runs demonstrations of many of the capabilities of MATLAB.
Creates a new graphics window and makes it the current target.
figure(n) makes the n-th graphics window the current target.
Fills one or more polygons with the color or colors specied by the
vector or string <color>.
Fills one or more 3D polygons with the color or colors specied by the
vector or string <color>.
Plots a two-dimensional image.
4.4.
In this subsection we briey discuss handle graphics. This is a collection of low-level graphics commands
which do the actual work of generating graphics. In the previous parts of this section we have mainly
discussed high-level graphics commands which allow us to create useful and high quality graphical images very easily. The low-level commands allow us to customize these graphical images, but at the cost of
having to get much more involved in how graphical images are actually created. This subsection will be
62
quite short because we do not want to get bogged down in this complicated subject. Instead, we will only
discuss a few of what we consider to be the more useful customizations.
In handle graphics we consider every component of a graphical image to be an object, such as a subplot,
an axis, a piece of text, a line, a surface, etc. Each object has properties and we customize an object by
changing its properties. Of course, we have to be able to refer to a particular object to change its properties, and a handle is the unique identier which refers to a particular object. (Each handle is a unique
oating-point number.)
We will use a small number of examples to explain handle graphics. There are many properties of the
text that can be changed in the text command by
>> text(xpt, ypt, <string>, <Prop 1> , <Value 1>, <Prop 2> , <Value 2>, . . . )
or
>> h = text(xpt, ypt, <string>);
>> set(h, <Prop 1> , <Value 1>, <Prop 2> , <Value 2>, . . . )
where <Prop ?> is the name of one of the properties for the text object and <Value ?> is one of the
allowed values. (We show some names and values in the following table.) We have shown two ways to customize the properties. In the former all the properties are set in the text command. In the latter the
text command creates an object, using its default properties, with handle h. The set command then
changes some of the properties of the object whose handle is h. For example, entering
>> set(h, Color , r , FontSize , 16, Rotation , 90)
results in a large, red text which is rotated 90 . You can also change the default properties for gtext,
xlabel, ylabel, zlabel, and title.
Text Properties
Clipping
Color
FontName
FontSize
HorizontalAlignment
Rotation
VerticalAlignment
on (default) Any portion of the text that extends outside the axes rectangle is clipped
off No clipping is done.
A three-element vector specifying a color in terms of its red, blue, and
green components, or a string of the predened colors.
The name of the font to use. (The default is Helvetica.)
The font point size. (The default is 10 point.)
left (default) Text is left-justied
center Text is centered.
right Text is right justied.
The text orientation. The property value is the angle in degrees.
top The top of the text rectangle is at the point.
cap The top of a capital letter is at the point.
center (default) The text is centered vertically at the point.
baseline The baseline of the text is placed at the point.
bottom The bottom of the text rectangle is placed at the point.
The more common way of customizing parameters is by using the set command. The two functions
get and set are used to obtain the value of one parameter and to set one or more parameters. For example, to get the font which is presenting being used enter
>> s = get(h, FontName )
and the string s contains the name of the font. The two arguments to get are the handle of the object
desired and the name of the property.
There are two other commands which can obtain a handle:
>> hf = gcf
returns the handle of the current gure and
>> ha = gca
63
returns the handle of the current axes in the current gure. For a simple example which uses handle
graphics, suppose we want to plot the function y = esin x for x [0, 2] and we want the horizontal axis
to have major tick marks at every /2 and we want these tick marks labelled. We do this by
>> x = linspace(0,2*pi,101);
>> plot(x,exp(sin(x)))
>> set(gca, XTick , [0:pi/2:2*pi])
>> set(gca, XTickLabel , { 0 , .5*pi , pi , 1.5*pi , 2*pi })
>> set(gca, XMinorTick , on )
>> set(gca, TickDir , out )
where the third line puts major tick marks at multiples of /2, the fourth line puts the labels shown
at each tick mark, the fth line adds small tick marks between the labelled ticks, and the last line puts
the tick marks outside the plot boxed area. (At present, we cannot use TEXcommands in XTickLabel to
generate a Greek .)
There is one case where we frequently use handle graphics. When a gure is printed, the graphical images do not ll the entire page. The default size is approximately 6.5 inches wide and 5.5 inches high.
When we want to use the full size of a sheet of paper we use
>> figure( PositionPaper , [0 0 8.5 11])
or
>> figure(n)
>> set(gcf, PositionPaper , [0 0 8.5 11])
since the default units for this property are inches. This sets the graphical images to use the full paper
size (the position is given as [left bottom width height] ) with a one inch border. This is frequently
useful if subplot is being used to put a number of plots on a page.
Finally, if subplot is being used it is sometimes useful to put a title on the entire page, not just in
each subplot. This can be done by
>> axes handle = axes( Position , [0 0 1 0.95], Visible , off );
>> title handle = get(axes handle, Title );
>> set(title handle, String , <title>, Visible , on );
The rst line species a rectangle for the axes in normalized units (so that
[left bottom width height] = [0 0 1 1] is the full size of the gure). The axes are invisible because
they are only being created so that a title can go on top. The second line gets the handle for the title
object of the new axes. The third line puts <title> into the title object and makes it visible.
Advanced Topic: Properties
get(<handle>, <Prop> )
set(<handle>, <Prop 1> ,
<Value 1>, ...)
gca
gcf
4.5.
Return the current value of the property of the object with this
handle. Note: Case is unimportant for property names.
Set the property, or properties, of the object with this handle. Note:
Case is unimportant for property names.
The current axes handle.
The current gure handle.
Warning: The codes in this subsection use for loops and if tests which are discussed in Section 8.1.
They also contain primary, secondary, and nested functions which are discussed in Section 8.3.
MATLAB makes it very easy to create a graphical user interface for a program. Of course, it is usually
even easier for the programmer to have the users interact with a program by entering data (i.e., typing) in
the workspace. However, this is often not easier for the users. Thus, the programmer must make the decision whether or not to spend the time required to write a good GUI. Note that this not only includes the
64
time required to code the GUI but also the possibly much longer time required to design the GUI.
In this subsection we are only concerned with how to write a GUI not how to write a good GUI.
A GUI is a graphical display which allows a user to interact pictorally with a program. It usually
consists of three elements:
(1) Components: These are the tools which enable the user to interact with a program, and include push
bottoms, sliders, radio buttons, check boxes, editable text, pop-up menus, listboxes, and toggle buttons. Such an interaction is called an event, and a program which responds to events is event driven.
Components can also include plots and/or tables which allow the program to interact with the user,
i.e., show results of the program.
(2) Figures: All of these components must be arranged within a gure, which is a graphical window
which is separate from the MATLAB window which arises when MATLAB is rst executed.
(3) Callbacks: These are pieces of code which enable the user to interact with the program. For example,
when a user uses a mouse to click a button this triggers an event, but it is not directly connected with
the program. It is the responsibility of the programmer to write the code which species how how
each event aects the program.
The simple way to write a GUI is to type
>> guide
This launches a GUI which you can use to write your own GUI. The largest part of this window is a rectangular and gridded canvas into which the various components are placed. To the left of this canvas is a
list of all the possible components, either using icons or their actual names. You build your own GUI by
positioning any or all of these components in the canvas. When done, you save your GUI under its own
name. You have created two les, the fig le (i.e., the extension is fig) and the function le (i.e., the
extension is m). So far you have only created the rst two elements of a GUI: the components and the gure. The third part, i.e., the callbacks, are your responsibility. Your program must be integrated into this
function le and you must also write the code to connect an event with its eect on your now integrated
program.
We will not discuss guide any further, and we will not discuss how to integrate your program and
code the callbacks. This is well-documented in MATLAB, including an explicit example which is called
simple gui. Read this documentation carefully and work through this explicit example yourself.
What we will discuss is how to use the non-simple way to write a GUI, namely by writing all the actual
commands which setup the gure, the components, and the callbacks. Since this can get quite complicated, we only show two very simple examples. We will not write any GUIs from scratch. Instead, we will
show how to take a simple gure which is created by the plot command and add something to it. Thus,
we will not attempt to describe all the commands which are involved in generating a GUI, but only a very
small subset.
For the rst example consider the function
65
function rippling(a, b)
n = 101;
x = linspace(-2, 2, n);
y = x;
[X, Y] = meshgrid(x, y);
for t = 0:.01:10
at = a + .8*t;
bt = b + .4*t;
Yxy = Y + .25*sin(2*(exp(X/2)-1));
Z = sin((at + .1*X + .2*Yxy).*X. 2 + ...
bt*(sin(2*Yxy) + .2*Yxy).* Yxy. 2);
surf(X, Y, Z);
view([-45, 60])
xlabel( x )
ylabel( y )
zlabel( z )
title(t)
drawnow
end
66
The discussion of this code follows. shg either raises the current already-existing gure, or creates a
new gure. The uicontrol command (user interface control) positions a component (check box, editable
text eld, list box, pop-up menu, push button, radio button, slider, toggle buttons, or static text eld) in
the gure. This component must be attached to something, which is called its parent. (uipanel can be
used to split the GUI into dierent regions; a uicontrol can then be attached to any of these panels or
the original gure.) The rst argument to the uicontrol command in the code determines its parent. (It
is not actually needed because the default parent is the current gure, but it never hurts.) The remaining arguments occur in pairs with the rst being the property name and the second its value (which might
be a string or a scalar or a matrix or a structure or a gure handle or a . . . ). The rst pair of arguments
makes this control a push button, the second that the word Pause should appear on the button, the third
that the units are pixels, and the fourth the position of the button in the gure (using these units). The
button is to be positioned beginning at the lower left hand corner of the gure and extend 80 pixels to the
right and 20 pixels upward. However, the push button still does not do anything. The last pair of arguments makes the event of pushing a button execute the function button. The next line in the code runs
The button could have been positioned in a more pleasing location in the GUI because there is lots of avail
space in a three-dimensional plot. However, in a two-dimensional plot this is a safe location.
67
the function rippling (which has been discussed previously) using the parameters a = b = 0.
As long as the user does not click the push button, everything is as if rippling was run directly from
the workspace. Clicking the push button (i.e., triggering an event) causes the function button to be executed where the rst argument hObject is a handle to the particular event. (The second argument is
unused.) get returns the value of the property name String which is attached to the handle hObject.
This value is the string Pause and so the if statement is true. The command set is executed and it replaces the push button label by Continue. uiwait then blocks execution of the program (i.e., plotting
the surface). The program is now in a wait state and will remain there until the user clicks the push button (whose label is now Continue). button is again executed and now the if statement is false because
str contains Continue. uiresume is executed so the program resumes execution. The following set command changes the label on the push button back to Pause.
The above GUI does not allow us to modify a or b. The following one does.
function pause rippling2
shg
h pause = uicontrol(gcf, Style , PushButton , String , Start , ...
Units , Pixels , Position , [0 0 80 20], ...
Callback , @button);
a = 0;
b = 0;
uicontrol(gcf, Style , Text , String , a = , Position , [90 0 30 20]);
uicontrol(gcf, Style , Edit , String , num2str(a, %4.2f ), ...
Position , [120 0 60 20], Callback , @edit a);
uicontrol(gcf, Style , Text , String , b = , Position , [190 0 30 20]);
uicontrol(gcf, Style , Edit , String , num2str(a, %4.2f ), ...
Position , [220 0 60 20], Callback , @edit b);
drawnow
uiwait
rippling(a, b)
%%%%% nested functions follow
function button(hObject, event)
str = get(hObject, String );
if strcmp(str, Start )
uiresume
set(hObject, String , Pause )
elseif strcmp(str, Pause )
set(hObject, String , Continue )
uiwait
else
uiresume
set(hObject, String , Pause )
end
end
function edit a(hObject, event)
a = str2num(get(hObject, String ));
end
function edit b(hObject, event)
b = str2num(get(hObject, String ));
end
end
This is shown below where both a and b have been modied and the push button has been clicked.
68
Initially the label on the push button is Start and the function rippling does not begin running until it is pushed. Afterwards, the label alternates between Pause and Continue. Next, comes the static
text eld a =, followed by the editable text eld which contains the default value of a. Note that the
value of a is contained in the String property name and its string value is num2str(a, %4.2f ). If
the number (actually the string) is modied, the function edit a is executed; in this function the value
of a is changed by getting the character variable and changing it to a number. Note that this is a nested
function (to be discussed in Section 8.3) so that the value of a which is modied in this function is also
modied in the primary function pause rippling2. The same happens to b. The drawnow command,
which immediately follows the creation of all the components, is necessary so that the components actually
appear in the gure. The following command, i.e., uiwait, puts the GUI into a wait state. This state continues until the user clicks the push button, which causes the function button to be executed. The string
contains Start so the if statement is true so the GUI resumes execution, i.e., the function rippling is
The function button is also a nested function, whereas it was a secondary function in pause rippling.
Since it does not modify a variable which is needed by the primary function, it can be either. Since edit a and
edit b need to be nested function, we also made button one.
69
uiwait
uiresume
4.6.
There are a number of dierent ways to make movies in MATLAB. We show some of them in the following code which is a modication of the MATLAB function life (which is copyrighted by The MathWorks, Inc). The documentation inside life follows.
LIFE MATLABs version of Conways Game of Life.
Life is a cellular automaton invented by John Conway that involves live and dead cells in a
rectangular, two-dimensional universe. In MATLAB, the universe is a sparse matrix that is
initially all zero.
Whether cells stay alive, die, or generate new cells depends upon how many of
their eight possible neighbors are alive. By using sparse matrices, the calculations required
become astonishingly simple. We use periodic (torus) boundary conditions at the edges of the
universe. Pressing the Start button automatically seeds this universe with several small
random communities. Some will succeed and some will fail.
C. Moler, 7-11-92, 8-7-92.
Adapted by Ned Gulley, 6-21-93
Copyright 1984-2004 The MathWorks, Inc.
$Revision: 5.10.4.1 $ $Date: 2004/08/16 01:38:30 $
This code strips out the part of life which does the actual iterations and shows how to save the results in an avi movie. Two dierent methods are shown explicitly in the code. The rst initializes the
movie, adds frames explicitly to the movie, and then closes it. The second only saves each frame in a jpg
le; an external software package must then be used to combine these les into a movie. A third method,
which is a slight modication of the rst, is then discussed.
The advantage of the second method is that no additional memory is required; the disadvantage is that
each frame must be individually saved to disk. Another disadvantage of the rst and third methods in
70
Linux and Mac is that the movie le which is generated is not compressed. An external software package
must be used to compress it.
Warning: This code uses a number of MATLAB commands which have not been yet discussed: sparse,
for, if, while, break, find, and logical expressions.
71
72
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
16
17
18
19
20
22
21
22
23
24
25
26
27
28
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
73
Movies
avifile
addframe
getframe
close (<avifile>)
movie
movie2avi
saveas
4.7.
Be Able To Do
After reading this section you should be able to do the following exercises. The answers are given on
page 159.
1. Plot ex and one of its Taylor series approximations.
(a) Begin by plotting ex for x [1, +1].
(b) Then plot
p3 (x) = 1 +
x2
x3
x
+
+
1!
2!
3!
5.1.
a11
a
21
.
.
.
am1
x2
xn
a12
a22
.
.
.
am2
...
...
..
.
...
a1n
a2n
.
.
.
amn
rhs
b1
b2 .
.
.
.
bm
Warning: It is very important to realize that an augmented matrix is not a matrix (because the
operations we apply to augmented matrices are not the operations we apply to matrices). It is
simply a linear system of equations written in shorthand: the rst column is the coecients of
the x1 term, the second column is the coecients of the x2 term, etc., and the last column is
the coecients on the right-hand side. The vertical line between the last two columns represents the equal sign. Normally, an augmented matrix is written without explicitly writing the
header information; however, the vertical line representing the equal sign should be included to
explicitly indicate that this is an augmented matrix.
rref operates on this augmented matrix to make as many of the elements as possible zero by using allowed operations on linear equations these operations are not allowed on matrices, but only on linear
75
systems of equations. The result is an augmented matrix which, when written back out as a linear system
of equations, is particularly easy to solve. For example, consider the system of equations
x1 + 2x2 + 3x3 = 1
4x1 + 5x2 + 6x3 = 1
7x1 + 8x2 + 10x3 = 0 ,
which is equivalent to the matrix equation Ax = b where
1
A = 4
7
2
5
8
3
6
10
1
and b = 1 .
0
x2
2
5
8
x3
3
6
10
rhs
1
1 .
0
(We have included the header information for the last time.) Entering
>> rref([A b])
returns the augmented matrix
1 0 0
2
0 1 0
3 .
0 0 1
1
Clearly, the solution of the linear system is x1 = 2, x2 = 3, and x3 = 1.
Of course, you could just as easily have found the solution by
>> x = A\b
so let us now consider the slightly dierent linear system
x1 + 2x2 + 3x3 = 1
4x1 + 5x2 + 6x3 = 1
7x1 + 6x2 + 9x3 = 1 ,
This is equivalent to the matrix equation Ax = b where
1
A = 4
7
2
5
8
3
6
9
1
and b = 1 .
1
Since A is a singular matrix, the linear system has either no solutions or an innite number of solutions.
The augmented matrix for this linear system is
1 2 3
4 5 6
7 8 9
1
1 .
0
Entering
>> rref([A b])
returns the augmented matrix
1 0
0 1
0 0
1
2
0
76
1
1 ,
0
so the solution of the linear system is x1 = 1 + x3 and x2 = 1 2x3 for any x3 R (or C if desired).
In vector form, the solution is
x1
1 + x3
1
x3
1
1
x2 = 1 2x3 = 1 + 2x3 = 1 + x3 2 .
x3
x3
0
x3
0
1
Suppose you modify the matrix equation slightly by letting b = (1, 1, 0)T . Now entering
>> rref([A b])
results in the augmented matrix
1
1 0 1
0 1 2
1 .
0 0 0
1
Since the third equation is 0 = 1, there is clearly no solution to the linear system.
Warning: The command rref does not always give correct results. For example, if
C=
0.95 0.03
0.05 0.97
then the matrix I C is singular (where I is the identity matrix). However, if you solve
(I C)x = 0 by
>
> C = [0.95 0.03; 0.05 0.97];
>
> rref([eye(size(C))-C [0 0] ])
MATLAB displays
ans =
1
0
0
0
1
0
which indicates that the only solution is x = 0. On the other hand, if you enter
>
> C = [0.95 0.03; 0.05 0.97]; b = 1;
>
> rref([eye(size(C))-C [b 0] ])
then MATLAB realizes that I C is singular. Clearly there is some value of b between 0
and 1 where MATLAB switches between believing that I C is non-singular and singular.
Solving Linear Systems
linsolve(A, b, <properties>)
rref
To understand this switch, look at the actual coding of rref. It uses the variable tol to determine
whether an element of the augmented matrix
0.05
0.05
0.03
0.03
b1
b2
77
5.2.
We have mentioned repeatedly that computers cannot add, subtract, multiply, or divide corUp until now, the errors that have resulted have been very small. Now we present two examples
where the errors are very large.
In this rst example, the reason for the large errors is easy to understand. Consider the matrix
rectly!
1
A = 4
7
2
5
8
3
6 ,
9+
which is singular when = 0 and nonsingular otherwise. But how well does MATLAB do when
1?
Enter
>> eps = input( eps = ); A = [1 2 3; 4 5 6; 7 8 9+eps]; inv(A)*A - eye(size(A))
so that the nal matrix should be O. Begin by letting = 0 and observe that the result displayed is
nowhere close to the zero matrix! However, note that MATLAB is warning you that it thinks something is
wrong with the statement
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 1.541976e-18.
( RCOND is its estimate of the inverse of the condition number. See cond in Section 7 for more details.)
Now choose some small nonzero values for and see what happens. How small can be before MATLAB warns you that the matrix is close to singular or badly scaled? In this example, you know that the
matrix is close to singular if is small (but nonzero) even if MATLAB does not. The next example is
more interesting.
For the second example, consider the Hilbert matrix of order n, i.e.,
1
1/2
Hn = 1/3
.
.
.
1/n
1/2
1/3
1/4
.
.
.
1/3
1/4
1/5
.
.
.
1/(n + 1)
1/(n + 2)
.
.
.
.
. .
. .
. .
. .
. . .
1/n
1/(n + 1)
1/(n + 2)
.
.
.
1/(2n 1)
Hx = b
for a given b. How close is the numerical solution to the exact solution? Of course, the problem is: how
can you know what the analytical solution is for a given b? The answer is to begin with x and calculate b by b = Hx. Then solve Hx = b for x and compare the nal and initial values of x. Do this in
MATLAB by
>> n = 10; x = rand(n, 1); b = H*x; xnum = H\b
and compare x with xnum by calculating their dierence, i.e.,
>> x - xnum
78
The result is not very satisfactory: the maximum dierence in the elements of the two vectors is usually
somewhere between 105 and 103 . That is, even though all the calculations have been done to approximately 16 signicant digits, the result is only accurate to three to ve signicant digits! (To see how
much worse the result can be, repeat the above commands for n = 12.)
It is important to realize that most calculations in MATLAB are very accurate. It is not that solving
a matrix equation necessarily introduces lots of round-o errors; instead, Hilbert matrices are very unstable matrices working with them can lead to inaccurate results. On the other hand, most matrices
are quite stable. For example, if you repeat the above sequence of steps with a random matrix, you nd
that the results are quite accurate. For example, enter
>> n = 1000; R = rand(n); x = rand(n, 1); b = R*x; xnum = R\b; max(abs(x - xnum))
The results are much more reassuring, even though n is 100 times as large for this random matrix as for
the Hilbert matrix and even though there are over 600,000 times as many oating point operations
needed to calculate x by Gaussian elimination for this random matrix!
Note: By entering all the commands on one line, it is easy to repeat this experiment many times for dierent random numbers by simply rerunning this one line.
5.3.
If A Cmn where m > n, Ax = b is called an overdetermined system because there are more equations than unknowns. In general, there are no solutions to this linear equation. However, you can nd a
best approximation by nding the solution for which the vector
r = Ax b
which is called the residual, is smallest in Euclidean length; that is,
n
1/2
2
ri
norm(r)
i=1
is minimized. (The norm function is discussed in Section 7.) This is called the least-squares solution. This
best approximation is calculated in MATLAB by typing
>> A\b
Analytically, the approximation can be calculated by solving
AT Ax = AT b .
However, numerically this is less accurate than the method used in MATLAB.
Note that this is the same command used to nd the solution to a square linear system. This cannot be
the intent here since A is not a square matrix. Instead, MATLAB interprets this command as asking for
the least-squares solution. Again, this command only makes sense if there is a unique solution which minimizes the length of the vector Ax b. If there are an innite number of least-squares solutions, MATLAB
warns you of this fact and then returns one of the solutions. For example, if
1 2 3
2
4 5 6
1
A=
and b =
7 8 9
2
10 11 12
4
then Ax = b has no solutions, but has an innite number of least-square approximations. If you enter
>> A\b
the response is
Warning: Rank deficient, rank = 2 tol = 1.4594e-14.
It also returns the solution (1/4 , 0, 29/60 )T (after using the MATLAB command rats which we discuss
below), which is one particular least-squares approximation. (If A is complex, solve AH Ax = AH b.)
Occasionally, if there are an innite number of least-squares approximations, the solution desired is the
smallest one, i.e., the x for which the length of the vector x is minimized. This can be calculated using the pseudoinverse of A, also called the Moore-Penrose pseudoinverse, which is denoted by A+ . Since
79
6. File Input-Output
A is not square, it cannot have an inverse. However, the pseudoinverse is the unique nm matrix which
satises the Moore-Penrose conditions:
AA+ A = A
A+ AA+ = A+
(AA+ )T = AA+
(A+ A)T = A+ A
In particular, if A is a square nonsingular matrix, then A+ is precisely A1 . This pseudoinverse is calculated in MATLAB by entering
>> pinv(A)
The reason for mentioning the pseudoinverse of A is that the least-squares approximation to Ax = b can
also be calculated by
>> pinv(A)*b
If there are an innite number of least-squares approximations, this returns the one with the smallest
length.
Next, suppose that A Cmn with m < n. Ax = b is called an underdetermined system because there
are less equations than unknowns. In general, there are an innite number of solutions to this equation.
We can nd one particular solution by entering
>> A\b
This solution will have many of its elements being 0. We can also nd the solution with the smallest
length by entering
>> pinv(A)*b
Warning: It is possible for an overdetermined system to have one or even an innite number of solutions
(not least-squares approximations). It is also possible for an underdetermined system to have
no solutions.
DISCUSS HOW TO HANDLE THESE CASES???
One command which is occasionally useful is rats. If all the elements of A and b are rational numbers, then the solution and/or approximation obtained is usually a rational number, although stored as
a oating-point number. This command displays a close rational approximation to the oating-point
number, which may or may not be the exact answer. For example, entering
>> rats(1/3 - 1/17 + 1/5)
results in the text variable 121/255, which is the correct answer.
Warning: Be careful when using this command. rats(sqrt(2)) makes no sense (as was known in 500
BC).
Solving Linear Systems
A\b
pinv(A)
rats(x)
6. File Input-Output
In Section 4.1 we discussed the csvread and csvwrite commands which allow simple input from and
output to a le. The MATLAB commands fscanf and fprintf, which behave very similarly to their C
counterparts, allow much ner control over input and output. Before using them a le has to be opened
by
80
6. File Input-Output
81
82
A1
condF (A) = A
A1
for p [1, ]
or
.
It is calculated in MATLAB by
>> cond(A, p)
where p is 1, 2, Inf, or fro . If p = 2 the command can be shortened to
>> cond(A)
Note that the calculation of the condition number of A requires the calculation of the inverse of A.
The MATLAB command condest approximates the condition number without having to calculate this
inverse. See the discussion of this command below for further information on when it might be preferable.
Note: Sometimes we want to solve, or nd the best approximation to, Ax = b when A Cmn is not a
square matrix. (This is discussed in detail in Section 5.3.) Since we still want to know the accuracy
of any solution, we want to generalize the condition number to nonsquare matrices. This is done by
dening the condition number of a nonsquare matrix in the 2-norm to be the ratio of the largest to
the smallest singular value of A, i.e., 1 /min{m,n} .
condest
Note: Read the discussion on cond above rst.
The calculation of the condition number of A Cnn requires the calculation of its inverse. There are
two reasons this might be inadvisable.
The calculation of A1 requires approximately 2n3 ops, which might take too long if n is very
large.
If A is a sparse matrix (i.e., most of its elements are zero), we discuss in Section 9 how to store only
the nonzero elements of A to conserve storage. (For example, if n = 10,000 and A is tridiagonal ,
the number of nonzero elements in A is approximately 30,000 but the total number of elements in A
is 100,000,000.) Since the inverse of a sparse matrix is generally much less sparse (in fact it may have
no zero elements at all), MATLAB may not be able to store A1 .
The command condest calculates a lower bound to the condition number of a matrix in the 1-norm without having to determine its inverse. This approximation is almost always within a factor of ten of the
exact value.
When MATLAB calculates A\b or inv(A), it also calculates condest(A). It checks if its estimate
of the condition number is large enough that A is likely to be singular. If so, it returns an error message
such as
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 2.055969e-18.
where RCOND is the inverse of condest(A).
det
Let A Cnn . The determinant of A is calculated by
>> det(A)
det(A) = 0 if and only if A is singular. However, due to round-o errors it is very unlikely that you will
obtain 0 numerically unless all the entries to A are integers. For example, consider the matrix
C=
0.95
0.05
0.03
0.97
A matrix is tridiagonal if its only nonzero elements occur on the main diagonal or on the rst diagonal above
or below the main diagonal
83
1
0
1
1
is defective since it has two eigenvalues, both of which are 1, but it only has one eigenvector, namely
(1, 0)T . If you enter
>> B = [1 1; 0 1]; [V, D] = eig(B)
MATLAB calculates the two eigenvalues correctly, but it nds the two eigenvectors (1, 0)T and
T
(1, 2.21016 ) . Clearly the latter eigenvector should be (1, 0)T so that, in fact, there is only one
eigenvector.
Note: If A is a sparse matrix (see Section 9), you cannot use eig. You either have to use the function
eigs or do eig(full(A)).
eigs
Note: Read the discussion on eig above rst.
Frequently, you do not need all the eigenvalues of a matrix. For example, you might only need the
largest ten in magnitude, or the ve with the largest real part, or the one which is smallest in magnitude,
or . . . . Or you might only need a few of the generalized eigenvalues of Ax = Bx. eigs can do all of this.
Of course, this means that there are numerous possible arguments to this function so read the documentation carefully.
Why not just use eig anyway? Calculating all the eigenvalues of a nonsymmetric A Rnn requires
(very) approximately 10n3 ops, which can take a very long time if n is very large. On the other hand,
calculating only a few eigenvalues requires many, many fewer ops. If A is a full matrix, it requires cn2
ops where c is of reasonable size; if A is a sparse matrix (see Section 9), it requires cn ops.
Note: If A is sparse, you cannot use eig you will rst have to do eig(full(A)).
Also, this command generates lots of diagnostic output. To calculate the largest 3 eigenvalues of A in
magnitude without generating any diagnostics, enter
>> op.disp = 0
>> eigs(A, 3, LM , op)
( op.disp is a structure, which was discussed in Section 3.4.)
84
inv
To calculate the inverse of the square matrix A Cnn enter
>> inv(A)
The inverse of A, denoted by A1 , is a matrix such that AA1 = A1 A = I, where I Rnn is the identity matrix. If such a matrix exists, it must be unique.
MATLAB cannot always tell whether this matrix does, in fact, exist. For example, the matrix
A=
1
2
2
4
does not have an inverse. If you try to take the inverse of this matrix, MATLAB will complain that
Warning: Matrix is singular to working precision.
It will display the inverse matrix, but all the entries will be Inf.
The above matrix was very simple. The matrix
1 2 3
A = 4 5 6
7 8 9
(7.1)
also does not have an inverse. If you ask MATLAB to calculate the inverse of A, it will complain that
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 2.055969e-18.
( RCOND is the inverse of a numerical approximation to the condition number of A; see condest above.)
That is, MATLAB is not positive that A is singular, because of round-o errors, but it thinks it is likely.
However, MATLAB still does try to calculate the inverse. Of course, if you multiply this matrix by A
the result is nowhere close to I. (Try it!) In other words, be careful and read (and understand) all
warning messages.
lu
Let A Cnn . Then there exists an upper triangular matrix U, a unit lower triangular matrix L , and
a permutation matrix P such that
LU = PA .
The MATLAB command lu calculates these matrices by entering
>> [L, U, P] = lu(A)
If A is invertible, all the elements of U on the main diagonal are nonzero. If you enter
>> A = [1 2 3; 4 5 6; 7 8 9]; [L, U, P] = lu(A)
where A is the singular matrix dened earlier, u33 should be zero. Entering
>> U(3,3)
displays 1.1102e-16, which clearly should be zero as we discussed in Section 1.5.
Note: This is the rst time we have had a function return more than one argument. We discuss this notation in detail in Section 8.3. For now, we simply state that when [V, D] occurs on the right side
of the equal sign it means the matrix whose rst columns come from V and whose last columns
come from D. However, on the left side of the equal sign it means that the function returns two
arguments where the rst is stored in the variable V and the second in D.
norm
The norm of a vector or matrix is a nonnegative real number which gives some measure of the size of
the vector or matrix. The p-th norm of a vector is dened by
1/p
n
|xi |p
if p [1, )
i=1
x p=
max |xi |
if p = .
1in
A unit lower triangular matrix is lower triangular and, in addition, all the elements on the main diagonal
are 1.
85
= max
x=0
Ax p
x p
for p [1, ]
1/2
|aij |2
=
i=1 j=1
86
pinv
The Moore-Penrose pseudoinverse has already been discussed in Section 5.3. We include it here for
completeness. It is calculated by using the singular value decomposition, which we discuss below.
rank
Let A Cmn . The rank of A is the number of linearly independent columns of A and is calculated by
>> rank(A)
This number is calculated by using the singular value decomposition, which we discuss below.
svd
Let A Rmn . A can be decomposed into
A = UVT
where U Rmm and V Rnn are orthogonal matrices and Rmn is a diagonal matrix (although
not necessarily square) with real nonnegative elements in decreasing order. That is,
1 2 min{m,n} 0 .
(If A Cmn then U Cmm and V Cnn are unitary matrices and Rmn is a diagonal matrix
with real nonnegative elements in decreasing order.) These matrices are calculated by
>> [U, S, V] = svd(A)
The diagonal elements of are called the singular values of A. Although A need not be a square matrix, both AT A Rnn and AAT Rmm are square symmetric matrices. (If A is complex, AH A and
AAH are both square Hermitian matrices.) Thus, their eigenvalues are nonnegative. Their nonzero eigenvalues are the squares of the singular values of A. In addition, the eigenvectors of AT A are the columns of
V and those of AAT are the columns of U. (If A is complex, the eigenvectors of AH A are the columns of
V and those of AAH are the columns of U.)
The best numerical method to determine the rank of A is to use its singular values. For example, to see
that
1 2 3 4
A = 5 6 7 8
9 10 11 12
has rank 2, use the svd command to nd that the singular values of A are 25.4368, 1.7226,
and 8.10791016 . Clearly the third singular value should be 0 and so A has 2 nonzero singular values
and so has a rank of 2. On the other hand, the Hilbert matrix of order 15 has singular values
1.8100 , 4.3101 , 5.7102 , 5.6103 , 4.3104 , 2.7105 , 1.3106 , 5.5108 ,
1.8109 , 4.71011 , 9.31013 , 1.41014 , 1.41016 , 1.21017 , and 2.41018
according to MATLAB. Following Principle 1.2, you can see there is no separation between the singular
values which are clearly not zero and the ones which are close to eps. Thus, you cannot conclude that
any of these singular values should be set to 0. Our best guess is that the rank of this matrix is 15.
The eigenvalues of a real square symmetric matrix are nonnegative. (The eigenvalues of a complex square
Hermitian matrix are real and nonnegative.)
For example, if m > n there are n singular values and their squares are the eigenvalues of AT A. The m
eigenvalues of AAT consist of the squares of these n singular values and mn additional zero eigenvalues.
In fact, it can be proven that the Hilbert matrix of order n is nonsingular for all n, and so its rank is
truly n. However, if you enter
>
> rank( hilb(15) )
you obtain 12, so that MATLAB is o by three.
87
inv(A)
lu(A)
norm(v)
norm(A)
null(A)
orth(A)
qr(A)
rank(A)
svd(A)
8. Programming in MATLAB
Using the commands we have already discussed, MATLAB can do very complicated matrix operations.
However, sometimes there is a need for ner control over the elements of matrices and the ability to test,
and branch on, logical conditions. Although prior familiarity with a high-level programming language is
useful, MATLABs programming language is so simple that it can be learned quite easily and quickly.
8.1.
MATLAB has four ow control and/or branching instructions: for loops, while loops, if-else
branching tests, and switch branching tests.
Notation: All of these instructions end with an end statement, and it is frequently dicult to determine
the extent of these instructions. Thus, it is very important to use indentation to indicate the
structure of a code, as we do in the remainder of this tutorial. This greatly increases the readability of the code for human beings.
The general form of the for loop is
>> for <variable> = <expression>
<statement>
...
<statement>
end
where the variable is often called the index of the loop. The elements of the row vector <expression> are
stored one at a time in the variable and then the statements up to the end statement are executed. For
<expression> can be a matrix in which case each column vector is stored one at a time in i.
88
Warning: In using i as the index of the for loop, i has just been redened to be n instead of 1 .
Caveat emptor!
A more practical example of the use of a for loop is the generation of the Hilbert matrix of order n,
which we have already discussed a number of times. This is easily done using two for loops by
>> H = zeros(n);
>> for i = 1:n
for j = 1:n
H(i,j) = 1/(i + j - 1);
end
end
Warning: In using i
and j as the indices of the for loops, i and j have just been redened to be n
instead of 1 . Caveat emptor!
for loops often have branches in them. For this we need the if branch, which we now describe. The
simplest form of the if statement is
>> if <logical expression>
<statement>
...
<statement>
end
where the statements are evaluated as long as the <logical expression> is true. The
<logical expression> is generally of the form
89
Relational Operators
<
<=
==
Less than.
Less than or equal to.
Equal.
>
>=
=
strcmp(a, b)
Greater than.
Greater than or equal to.
Not equal to.
Compares strings.
90
means that c is true (i.e., 1 ) if exactly one of a and b is true (i.e., nonzero); otherwise c is false
(i.e., 0 ).
In the above statements c is a logical variable which has the logical value TRUE or FALSE. Frequently but not always the variable can be set by c = 1 or c = 0; but c is now not a logical
variable, but a numerical variable. Frequently but not always a numerical variable can be used instead of a logical variable. The preferred ways to set a logical variable are the following. The logical variable can be set by c = logical(1) or c = logical(0) and now c is a logical variable. A simpler
way to set the logical variable c is c = true or c = false.
There are second logical operators AND (denoted by && ) and OR ( || ) which are rarely needed.
The statement
>> c = a && b
returns a (scalar) logical true if both inputs evaluate to true (so if they are variables they both must be
scalars). The dierence from & is that if a is false then b is not evaluated. Similarly,
>> c = a || b
returns a (scalar) logical true if either input evaluates to true. If a is true then b is not evaluated
(as in C, C++, and Java).
Logical Operators
A&B
A|B
A
xor(A, B)
AND.
OR.
NOT.
EXCLUSIVE OR.
a && b
a || b
The second MATLAB loop structure is the while statement. The general form of the while loop is
>> while <logical expression>
<statement>
...
<statement>
end
where the statements are executed repeatedly as long as the <logical expression> is true. For example, eps can be calculated by
>> ep = 1;
>> while 1 + ep > 1
ep = ep/2;
end
>> eps = 2*ep
It is possible to break out of a for loop or a while loop from inside the loop by using the break
command as in C. This terminates the execution of the innermost for loop or while loop.
The continue statement is related to break. It causes the next iteration of the for or while loop
to begin immediately.
The switch command executes particular statements based on the value of a variable or an expression.
91
Generates a logical matrix with all elements having the logical value true.
Use true or true(n) or true(m, n).
Generates a logical matrix with all elements having the logical value false.
Use false or false(n) or false(m, n).
92
8.2.
Although MATLAB does have a quite powerful programming language, it is needed much less frequently than in typical high-level languages. Many of the operations and functions that can only be
applied to scalar quantities in other languages can be applied to vector and matrices in MATLAB. For
example, MATLABs relational and logical operators can also be applied to vectors and matrices. In this
way, algorithms that would normally require ow control for coding in most programming languages can
be coded using simple MATLAB commands.
If A, B Rmn then the relational equation
>> C = A rop B
is evaluated as cij = aij rop bij , where rop is one of the relational operators dened previously. C is a
logical array, that is, its data type is logical not numeric. The elements of C are all 0 or 1: 0 if
aij rop bij is a false statement and 1 if it is a true one. Also, the relational equation
>> C = A rop c
is dened when c is a scalar. It is evaluated as if we had entered
>> C = A rop c*ones(size(A))
Similar behavior holds for logical operators:
>> C = A & B
means cij = aij & bij ,
>> C = A | B
means cij = aij | bij ,
>> C = A
means cij = aij , and
>> C = xor(A, B)
means cij = xor(aij , bij ). Again the elements of C are all 0 or 1.
To show the power of these MATLAB commands, suppose we have entered
>> F = rand(m, n)
and now we want to know how many elements of F are greater than 0.5. We can code this as
>> nr elements = 0;
>> for i = 1:m
for j = 1:n
if F(i,j) > 0.5
nr elements = nr elements + 1;
end
end
end
>> nr elements
However, it can be coded much more simply, quickly, and eciently since the relational expression
>> C = F > 0.5;
or, to make the meaning clearer,
>> C = (F > 0.5);
generates the matrix C where
1 if fij > 0.5
cij =
0 otherwise.
93
The relational expression F > 0.5 generates a matrix with zeroes in all the locations where we want to
zero the elements of F and ones otherwise. Multiplying this new matrix elementwise with F zeroes out all
the desired elements of F. We can also replace all the elements of F which are 0.5 by using
>> C = (F > 0.5)
>> F = F.*C - pi*( C)
Shortly we will present two easier ways to do this.
There is even a MATLAB function which determines the location of the elements of a vector or a matrix where some property is satised. The command
>> find(x)
generates a column vector containing the indices of x which are nonzero. (Recall that nonzero can also
mean TRUE so that this command nds the elements where some condition is true.) For example, if
x = (0, 4, 0, 1, 1, 0, )T then the resulting vector is (2, 4, 5, 7)T . We can add 10 to every nonzero element of x by
>> ix = find(x);
>> x(ix) = x(ix) + 10;
Note: If no element of the vector is nonzero, the result is the empty matrix [].
find can also be applied to a matrix. The command
>> find(A)
rst transforms A to a column vector (i.e., A(:) ) and then determines the locations of the nonzero elements. Instead we can work with the matrix directly by entering
>> [iA, jA] = find(A)
The two column vectors iA and jA contain the rows and columns, respectively, of the nonzero elements.
We can also nd the locations of the nonzero elements and their values by
>> [iA, jA, valueA] = find(A)
As a simple example of the power of this command we can add 10 to every nonzero element of A by
>> ijA = find(A); A(ijA) = A(ijA) + 10
Note: ijA contains the locations of the nonzero elements of A when considered to be a column vector.
Since A(k) has no meaning in linear algebra if k is a scalar (since an element of A requires both
a row and a column number), MATLAB assumes that this is the element number of A as a column
vector.
We can also nd the elements of a vector or a matrix which satisfy a more general property than being
nonzero. For example, to nd the locations of all the elements of x which are greater than 5 enter
>> find(x > 5)
and to nd the locations of all the elements of x which are greater than 5 and less than 8 enter
>> find( (x > 5) & (x < 8) )
We can nd the number of elements which satisfy this last property by entering
>> length( find( (x > 5) & (x < 8) ) )
Previously, we showed how to replace all the elements of F which are 0.5 by . A method which
does not require any multiplication is
>> ijF = find(F <= 0.5);
>> F(ijF) = -pi
or even
>> F( find(F <= 0.5) ) = -pi
The beauty of MATLAB commands such as these is they are so easy to use and to understand (once
you get the hang of it) and they require so few keystrokes.
Another, slightly dierent method uses the matrix
>> D = (F <= 0.5)
rather than the vector ijF. Recall that ijF is a vector which contains the actual locations of the elements we want to zero out, whereas D is a matrix of ones and zeroes which explicitly shows which elements should be zeroed. We can use D to determine which elements of F should be replaced by zero
by
>> F(D) = -pi
(We can even use
94
95
returns true if all the contents are the same and false otherwise. This means that (nonempty) arrays
must have the same data type and be the same size.
For completeness we mention that MATLAB has a number of other functions which can check the
status of variables, the status of the elements of vectors and matrices, and even of their existence. For example, you might want to zero out all the elements of a matrix A which are Inf or NaN. This is easily
done by
>> A( find( isfinite(A) ) ) = 0
where isfinite(A) generates a matrix with 1 in each element for which the corresponding element of A
is nite. To determine if the matrix A even exists, enter
exist( A )
See the table below for more details and more functions.
Logical Functions
all
any
exist( <name> )
isequal
find
logical
ischar
isempty
isfinite
isinf
islogical
isnan
8.3.
True if all the elements of a vector are true; operates on the columns of a
matrix.
True if any of the elements of a vector are true; operates on the columns of a
matrix.
False if this name is not the name of a variable or a le. If it is, this function
returns:
1 if this is the name of a variable,
2 if this is the name of an m-le,
5 if this is the name of a built-in MATLAB function.
Tests if two (or more) arrays have the same contents.
The indices of a vector or matrix which are nonzero.
Converts a numeric variable to a logical one.
True for a character variable or array.
True if the matrix is empty, i.e., [].
Generates a matrix with 1 in all the elements which are nite (i.e., not Inf or
NaN ) and 0 otherwise.
Generates a matrix with 1 in all the elements which are Inf and 0 otherwise.
True for a logical variable or array.
Generates a matrix with 1 in all the elements which are NaN and 0 otherwise.
Function M-les
We have already discussed script m-les, which are simply an easy way to collect a number of statements and execute them all at once. Function m-les, on the other hand, are similar to functions or procedures or subroutines or subprograms in other programming languages. Ordinarily, variables which are
created in a function le exist only inside the le and disappear when the execution of the le is completed
these are called local variables. Thus you do not need to understand the internal workings of a function
le; you only need to understand what the input and output arguments represent.
Note: The generic term for script les and function les is m-les, because the extension is m.
Unlike script les, function les must be constructed in a specic way. The rst line of the le
<file name>.m must begin with the keyword function. Without this word, the le is a script le. The
complete rst line, called the function denition line, is
function <out> = <function name>(<in 1>, ..., <in n>)
or
function [<out 1>, ..., <out m>] = <file name>(<in 1>, ..., <in n>)
where the name of the function must be the same as the name of the le (but without the extension). The
input arguments are <in 1>, <in 2>, . . . . The output arguments must appear to the left of the equal
96
sign: if there is only one output argument, i.e., <out>, it appears by itself; if there is more than one, i.e.,
<out 1>, etc., they must be separated by commas and must be enclosed in square brackets.
Variables in MATLAB are stored in a part of memory called a workspace. The base workspace contains
all the variables created during the interactive MATLAB session, which includes all variables created in
script m-les which have been executed. Each function m-le contains its own function workspace which
is independent of the base workspace and every other function workspace. The only way to connect
these workspaces is through the arguments of a function or by using the global command (which we will
discuss shortly).
There is great exibility in the number and type of input and output arguments; we discuss this topic in
great detail later. The only detail we want to mention now is that the input arguments are all passed by
value as in C. (That is, the values of the input arguments are stored in temporary variables which are
local to the function.) Thus, the input arguments can be modied in the function without aecting any
input variables in the calling statement.
Warning: The name of the le and the name of the function must agree. This is also the name of the com-
Comment lines should immediately follow. A comment line begins with the percent character, i.e., %.
All comment lines which immediately follow the function denition line constitute the documentation for
this function; these lines are called the online help entry for the function. When you type
>> help <function name>
all these lines of documentation are typed out. If you type
type <function name>
the entire le is printed out. In addition, the rst line of documentation, i.e., the second line of the le,
can be searched for keywords by entering
>> lookfor <keyword>
Make sure this rst comment line contains the name of the command and important keywords which describe its purpose.
Note: Comments can be placed anywhere in an m-le, including on a line following a MATLAB statement. The initial comment lines in a script le and the comment lines in a function le which
immediately follow the rst line are special: they appear on the screen when you type
>> help <function name>
Before discussing functions at great length, there is one technical detail it is important to consider before it trips you up: how does MATLAB nd the m-les you have created? Since MATLAB contains
thousands of functions, this is not an easy task. Once MATLAB has determined that the word is not a
variable, it searches for the function in a particular order. We show the order here and then discuss the
items in detail throughout this subsection.
(1) It checks if <function name> is a built-in function (i.e., coded in C).
(2) It checks if <function name> is a function, i.e., the primary function, a subfunction, or a nested
function in the current scope, in the current le. (We discuss all these terms shortly.)
(3) It checks if the le <function name>.m exists in the current directory.
(4) It checks if the current directory has a subdirectory called private; if it does, MATLAB checks if
the le <function name>.m exists in this subdirectory.
(5) It searches the directories in the search path for the le <function name>.m.
Note from (3) that MATLAB searches in the current directory for the function by searching for the mle with the same name. If the m-le is not in the current directory, the simplest way to enable MATLAB
to nd it is have the subdirectory in your search path. If you type
>> path
If you are worried because passing arguments by value might drastically increase the execution time of the
function, we want to reassure you that this does not happen. To be precise, MATLAB does not actually pass all
the input arguments by value. Instead, an input variable is only passed by value if it is modied by the function. If an input variable is not modied, it is passed by reference. (That is, the input argument is the actual
variable used in the calling statement and not a local copy.) In this way you get the benet of call by value
without any unnecessary overhead. And how does MATLAB know if an input argument is modied? It can only
be modied if it appears on the left-hand side of an equal sign inside the function!
97
you will see all the directories that are searched. If you have created a subdirectory called matlab in
your main directory, this is usually the rst directory searched (unless the search path has been modied).
Thus, you can put your m-les in this subdirectory and be sure that MATLAB will nd them. You can
also add directories to the search path by
>> path( new directory , path)
or
>> path(path, new directory )
(The former puts new directory at the beginning of the search path while the latter puts it at the end.)
Alternately, you can add one or more directories at the beginning of the search path by
>> addpath( new directory #1 , new directory #2 , ...)
Warning: When you begin a MATLAB session, it always checks if the subdirectory matlab exists in
your main directory. If you create this subdirectory after you start a MATLAB session, it will
not be in the search path.
Now we return to our discussion of creating functions. We begin with a simple example of a function le
which constructs the Hilbert matrix (which we have already used a number of times).
function H = hilb local(n)
% hilb local: Hilbert matrix of order n (not from MATLAB)
% hilb local(n) constructs the n by n matrix with elements 1/(i+j-1).
% This is one of the most famous examples of a matrix which is
% nonsingular, but which is very badly conditioned.
H = zeros(n);
for i = 1:n
for j = 1:n
H(i,j) = 1/(i+j-1);
end
end
The input argument is n and the output argument is H. The rst line of the documentation includes the
name of the function as well as a brief description that lookfor uses. The following lines of documentation also appear on the screen if we enter
>> help hilb local
Note: The above code is not presently used in MATLAB (although it was in early versions.) The actual
MATLAB code for this function is shown in Section 8.5.
We follow by dening H to be an nn matrix. Although not essential, this statement can greatly increase the speed of the function because space can be preallocated for the matrix. For example, consider
the following code.
function a = prealloc(n, initialize)
% prealloc: testing how well preallocating a vector works
% n = the size of the vector
% initialize = true - preallocate the vector
%
= false - do not
if initialize
a = zeros(n,1);
end
a(1) = 1;
for i = 2:n
a(i) = a(i-1) + 1;
end
If initialize = false the vector a is not preallocated, while if initialize = true it is. We nd
that
>> prealloc(100000, true);
runs over 1600 (thats right, sixteen hundred) times as fast as
>> prealloc(100000, false);
Note that i and j are redened from 1 since they appear as for loop indices. However, since i
and j are local to this function, this does not have any eect when this command is executed. Also, the
98
99
then only f (x) is calculated, while if there are two output arguments then both f (x) and f (x) are
calculated.
Also, note that x can be a scalar (i.e., a single value) or it can be a vector. Similarly, and a can
each be a scalar or a vector. If x is a vector, i.e., (x1 , x2 , . . . , xn )T , while and a are scalars, then the
function is
2
f (xi , , a) = sin(xi )ea(xi ) for i = 1, 2, . . . , n ,
and all the values can be calculated in one call to spruce. If, on the other hand, x, , and a are all vectors, then the function is
2
for i = 1, 2, . . . , n ,
and, again, all the values can be calculated in one call to spruce.
We have now presented all the essential features of the MATLAB programming language, and it certainly is a minimal language. MATLAB can get away with this because most matrix operations can
be performed directly unlike in most other programming languages. You only need to write your own
function if MATLAB cannot already do what you want. If you want to become procient in this language,
simply use the type command to look at the coding of some functions.
Now that we have discussed the essentials of programming in MATLAB, it is necessary to discuss how
to program correctly. When you are entering one statement at a time in the text window, you immediately
see the result of your calculation and you can determine whether or not it is correct. However, in an m-le
you have a sequence of statements which normally end with semicolons so that you do not see the intermediate calculations. What do you do if the result is incorrect? In other words, how do you debug your
m-le?
There are a number of simple techniques you can use and we discuss them in turn. In a script m-le
intermediate calculations are normally not printed out, but they are still available to look at. This can frequently lead to an understanding of where the calculation rst went wrong. However, this is not true of
function m-les since all the local variables in the function disappear when the function ends. Of course,
with any m-le you can selectively remove semicolons so that intermediate results are printed out. This is
probably the most common method of debugging programs no matter what programming language is
being used.
When loops are involved (either using for or while statements), the printed output can seem to be
endless (and it is endless if you are in an innite loop). And it is usually impossible to read the output since it is zipping by at (what appears to be) nearly the speed of light! The pause command can
slow down or even stop this output. By itself pause stops the m-le until some key is pressed while
pause(<floating-point number>) pauses execution for this many seconds or fractions of a second.
(This is computer dependent, but pause(0.01) should be supported on most platforms.) You can even
turn these pauses on and o by using pause on and pause off.
Note: Occasionally, you will forget that you have put the command
pause
into your code and wonder why it is taking so long to execute. The alternative
input( Press Enter to continue , s );
pauses the code and also reminds you that it has been paused.
The echo command is also useful for debugging script and function m-les, especially when if statements are involved. Typing
>> echo on
turns on the echoing of statements in all script les (but not printing the results if the statements end
with semicolons), and echo off turns echoing o again. However, this does not aect function les. To
turn echoing on for a particular function, type
>> echo <function name> on
and to turn echoing on for all functions, type
>> echo on all
100
The keyboard command is also very useful for debugging m-les. It stops execution of the m-le,
similar to the pause command. However, it returns complete control to the user to enter any and all
MATLAB commands. In particular, you can examine any variables in the functions workspace. If desired, you can also change the value of any of these variables. The only way you will recognize this is not a
standard MATLAB session is that the prompt is
K>>
for Keyboard. To terminate the keyboard session and return control to the m-le, enter
K>> return
To terminate both the keyboard session and the execution of the m-le, enter
K>> dbquit
When using the debugger, you are not running your program. Instead, you are running the debugger
which is running your program. Thus, many of the commands you enter are commands for the debugger;
to distinguish these commands from normal MATLAB commands they begin with db. There are two
ways to run the debugger: you can type the debugger commands into the workspace, or in a MATLAB
window you can use the mouse and click on the commands.
In addition, you are still in the workspace so many MATLAB commands can still be executed. For example, to see the values of variables just type the variable name into the workspace. (Alternatively, you
can move the mouse over the variable name in the window and its description and value(s) will be shown.)
Also, you can run most MATLAB commands as long as you do not try to create new variables (but you
can modify existing variables).
We will not discuss the commands in this debugger in detail, but only provide a brief description of
each one, because these are similar to commands in any debugger. If you have experience with using a
debugger, doc will give you complete details.
Debugging Commands
keyboard
dbstep
dbstep n
dbstep in
dbstep out
dbcont
dbstop
dbclear
dbup
dbdown
dbstack
dbstatus
dbtype
dbquit
return
Now we want to discuss the arguments in a MATLAB function, since they are are used somewhat dierently than in other programming languages. For example, in
function out = funct1(a, t)
a and t are the input arguments and out is the output argument. Any and all input variables are local to the function and so can be modied without aecting the arguments when the function funct1 is
called. (This is true no matter what type of variables they are.) In
function [out1, out2, out3] = funct2(z)
z is the only input argument and there are three output arguments, each of which can be any type of
variable. There is no requirement that all three of these output arguments actually be used. For example,
101
102
A closure is a complicated term to explain. In this context it means that the parameters used when the function is dened are saved and can be referenced when the function is later used.
103
fncz1 c(y) is evaluated as fncz1(y, alpha, beta, Gamma, omega). This discussion of saving parameters in functions has been somewhat lengthy but it has many uses.
Another technical detail concerns how to group input arguments and/or output arguments together,
especially when there can be a variable number of arguments. For example, suppose there can be any
number of input arguments to the function fnc. Then we can declare the function as
function fnc(varargin)
or, if there is always at least the argument x, as
function fnc x(x, varargin)
The varargin argument, which must always be the last in the argument, is a cell vector whose length
(which can be 0 ) is calculated by length(varargin). This argument can even be passed into another
function and will be handled exactly as if each element was passed separately. For example, if fnc x calls
the function fnc2 and passes all but the rst argument, i.e., x, then the call can be written as
fnc2(varargin)
By the way, the output argument varargout is handled exactly the same on the left hand side of the
function declaration statement.
Warning: Recall that the k-th argument in varargin is varargin{k}, NOT varargin(k).
The nal but very important technical detail about function m-les concerns an important element of programming style in any computer language. It frequently happens that a block of code occurs
two or more times in a function. Sometimes these blocks can be combined by using a loop, but, even if
possible, this often makes the code unwieldly. Instead, this block of code can be put into a new function
and called from the original function. Another reason for splitting a block of code o into a new function is when the function has grown large enough to be hard to comprehend. The remedy is to split the
code up into a number of functions, each of which can be easily understood and debugged. In MATLAB
functions normally have to be separated into dierent les so that each function and its le name agree;
otherwise, MATLAB cannot nd the function. This can be annoying if a number of les have to be created: for example, it can be dicult to remember the purpose of all these functions, and it can be dicult
to debug the primary function. MATLAB has a feature to handle this proliferation of les; function mles can contain more than one function. The rst function in the le is called the primary function and
its name must agree with the name of the le. There are two further types of functions: Any remaining
functions are called subfunctions and nested functions. (At the end of Section 10.2 we code the function
gravity using a number of nested functions.)
Note: The primary function or a subfunction begins with the function denition line (i.e., the line which
begins with the keyword function ). It is possible to end the primary function and each subfunction with the command end, but this is not necessary because MATLAB recognizes that a function
has ended when it encounters the next function statement. However, if a nested function is used
then it and all other functions must end with the end statement.
First, we discuss subfunctions, which are quite simple. They are placed following the primary function
and between or following other subfunctions. They are only visible to the primary function and to other
subfunctions in the same le. Thus, dierent m-les can contain subfunctions with the same name. Also,
the help, lookfor, and type commands can only access the primary le. It is crucial to understand
that variables in the primary function or in a subfunction are local to that function and unknown outside it (unless they are declared to be global ). The only way to pass variables between these functions is
through the argument list.
Usually, subfunctions are sucient and they are much easier to describe. When they are not sucient, we have nested functions. Its main advantage (as far as we are concerned) is that variables can be
passed into and out of a nested function without being in the argument list. Nested functions are more
complicated than subfunctions and we will only provide a brief discussion.
They are similar to internal functions in Fortran 95, and they are somewhat related to inner classes in Java
but not in C++.
104
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
27
28
29
30
31
%
%
%
%
%
%
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
%
%
%
%
%
1
2
3
4
5
6
32
33
34
35
36
37
A nested function is within another function. For example, the nested functions nest 1 and nest 2 are
nested within the primary function nested ex, and the nested function nest 3 is nested within the subfunction sub 1. (Nested functions can have other nested functions within them, but enough is enough.)
The important concept to understand when using nested functions is the scope of variables in the function m-le. The scope of a variable is the context within which it is dened, i.e., where it can be set, modied, and used. Now let us consider a function workspace. The workspace of the primary function is also
independent of the workspace of each subfunction. However, since a nested function is within one or more
other functions, it is within the workspace of this function or these functions. In the function nested ex
the nested functions nest 1 (lines 715) and nest 2 (lines 1623) have access to the variables p1, p2,
and p3 of the primary function (lines 126). They also have access to the subfunction sub 1 (lines 27
37) (but not any of its variables) as shown in line 13. Note that nest 2 also has access to nest 1 as
105
CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDB
FHEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEHG
FG
FG
FG
FG
FG
FG
WARNING
FG
FG
FG One of the common mistakes when coding in Matlab is dening what you think is FG
FG a local variable in a nested function and forgetting that the same variable name
FG
FG
FG
FG is used in the outer function. It is hard to imagine making that mistake here
FG
FG because the code is so short but it can easily happen in a real code. One soFG
FG
FG
FG lution is to append an underscore, i.e., , to the end of the name of each local
FG
FG
FG
FG variable.
FG
FG
FG
FG
FG
FHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDHG
@EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEA
Just for completeness, none of the variables in nested ex can be accessed in sub 1 and vice versa.
For instance, p2 cannot be accessed in the subfunction sub 1 as we show on line 30.
Now let us return to the topic of how MATLAB nds a function. As we stated previously (but did not
discuss), when a function is called from within an m-le, MATLAB rst checks if the function named is
the primary function or a subfunction in the current le. If it is not, MATLAB searches for the m-le in
the current directory. Then MATLAB searches for a private function by the same name (described below).
Only if all this fails does MATLAB use your search path to nd the function. Because of the way that
MATLAB searches for functions, you can replace a MATLAB function by a subfunction in the current
m-le but make sure you have a good reason for doing so!
In the previous paragraph we described how to create a subfunction to replace one function by another
of the same name. There is another, more general, way to handle this replacement: you can create a subdirectory in your current directory with the special name private. Any m-les in this subdirectory are
visible only to functions in the current directory. The functions in this subdirectory are called private
functions. For example, suppose we are working in the directory personal and have created a number of
les which use rref to solve linear systems. And suppose we have written our own version of this command, because we think we can calculate the reduced row echelon of a matrix more accurately. The usual
way to test our new function would be to give it a new name, say myrref, and to change the call to rref
in every le in this directory to myrref. This would be quite time-consuming, and we might well miss
some. Instead, we can code and debug our new function in the subdirectory private, letting the name of
our new function be rref and the name of the m-le be rref.m. All calls in the directory to rref will
Since MATLAB contains thousands of functions, this means you do not have to worry about one of your subfunctions being hijacked by an already existing function. When you think up a name for a primary function
(and, thus, for the name of the m-le) it is important to check that the name is not already in use. However,
when breaking a function up into a primary function plus subfunctions, it would be very annoying if the name of
every subfunction had to be checked especially since these subfunctions are not visible outside the m-le.
106
use the new function we are testing in the subdirectory private, rather than MATLABs function. Even
more important, any function in any other directory which calls rref will use the MATLAB function and
not our new, improved version.
The nal topic we will briey discuss involves recursion. It is possible and sometimes useful for a
function to call itself. As a simple example, consider the Fibonacci sequence
fn+2 = fn+1 + fn
for n 0
and f1 = 1 .
This sequence, i.e., 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, . . ., can be coded as
function y = fibonacci(n)
% WARNING: VERY VERY INEFFICIENT CODE
% ***** n must be a nonnegative integer *****
if n == 0
y = 1;
% no recursion if n = 0
elseif n == 1
y = 1;
% no recursion if n = 1
else
y = fibonacci(n-1) + fibonacci(n-2);
% two recursive calls for
end
n > 1
A recursive code must be able to stop, and this code stops if n = 0 or n = 1. For larger values of n, the
function is called recursively.
Warning: This code is very, very, very inecient. We have provided it simply to show how recursion can
lead to a very compact code. The reason this code is very inecient is because it uses an incredibly large amount of CPU time for large n (and 50 is very, very, very large). In fact,
in order to calculate fn the function fibonacci is called recursively 2fn 2 times and fn
grows exponentially with n.
There are examples for which recursion is advantageous. However, our aim is simply to show how to use
it not whether to use it.
Function Commands
function
end
error( <message> )
echo
global
persistent
return
nargin
nargout
pause
varargin
varargout
107
8.4.
In MATLAB it is possible for a program to create or modify statemennts on the y, i.e., as the program is running. Entering
>> eval(<string>)
executes whatever statement or statements are contained in the string. For example, entering
>> s = x = linspace(0, 10, n); y = x.*sin(x).*exp(x/5); plot(x, y)
>> eval(s)
executes all three statements contained in the string s. In addition, if an executed statement generates
output, this is the output of eval. For example, if we type
>> A = zeros(5,6);
>> [m, n] = eval( size(A) );
then m is 5 and n is 6.
There is a very practical applications for this command since it can can combine a number of statements into one. For example, suppose we want to work with the columns of the Hilbert matrix of size n
and we want to create variables to hold each column, rather than using H(:,i). We can do this by hand
by typing
>> c1=H(:,1);
>> c2=H(:,2);
...
which gets tiring very quickly. Instead, we can do this by typing
>> for i = 1:n
eval( [ c num2str(i) =H(:,i) ] )
end
This requires some explanation. It might be a little clearer if we separate the statement inside the for
loop into two statements by
s = [ c , num2str(i), =H(:,i) ]
eval(s)
(where we include commas in the rst statement for readability). s is a text variable which contains
c1=H(:,1) the rst time the loop is executed, then c2=H(:,2) the second time, etc. (To understand
how s is created, recall that s is really just a row vector with each element containing the ASCII representation of the corresponding character.)
Finally, there is a very esoteric application for this command that allows it to catch errors. This is similar to the catch and throw commands in C++ and Java. To use this feature of eval, call it using
two arguments as
>> eval(<try string>, <catch string>)
The function executes the contents of <try string> and ignores the second argument if this execution
succeeds. However, if it fails then the contents of <catch string> are executed. (This might be a call
to a function which can handle the error.) If there is an error, the command lasterr returns a string
containing the error message generated by MATLAB.
A MATLAB command which is occasionally useful in a function is feval. It executes a function, usually dened by an m-le, whose name is contained in a string by
>> feval(<string>, x1, x2, ..., xn)
(See below for other ways to pass the function in the argument list.) Here x1, x2, ..., xn are the
arguments to the function. For example, the following two statements are equivalent
108
>> A = zeros(5,6)
>> A = feval( zeros , 5, 6)
Suppose that in the body of one function, say sample, we want to execute another function whose
name we do not know. Instead, the name of the function is to be passed as an argument to sample.
Then feval can be used to execute this text variable. For example, suppose in function sample we want
to generate either linear or logarithmic plots. We can input the type of plot to use by
function sample(<type of plot>)
...
feval(<type of plot>, x, y1, x, y2, -- , xx, y3, : )
...
There are two common ways to pass the function <type of plot> in the argument list:
(1) use a character string, e.g., feval( loglog , ...), or
(2) use a function handle, e.g., feval(@logval, ...), or
Note: eval and feval serve similar purposes since they both evaluate something. In fact, feval can
always be replaced by eval since, for example, feval( zeros , 5, 6) can always be replaced by
eval( zeros(5,6) ). However, there is a fundamental dierence between them: eval requires
the MATLAB interpreter to completely evaluate the string, whereas feval only requires MATLAB
to evaluate an already existing function. feval is much more ecient, especially if the string must
be evaluated many times inside a loop.
Odds and Ends
eval
feval
lasterr
8.5.
As long as your MATLAB code executes quickly, there is no need to try to make it faster. However, if
your code is executing slowly, you might be willing to spend some time trying to speed it up. There are
three standard methods to speed up a code:
(0) Preallocate matrices as shown in the function prealloc on page 98. This is very simple and very
eective if the matrices are large.
(1) Use MATLAB functions, whenever possible, rather than writing your own. If a MATLAB function is
built-in, then it has been written in C and is faster than anything you can do. Even if it is not, much
time has been spent optimizing the functions that come with MATLAB; you are unlikely to do better.
(2) Replace ow control instructions with vector operations. We have already discussed this topic at
length in Section 8.2. Here we will focus on some advanced techniques.
Of course, we should rst determine how much CPU time is really being expended in our program
and that is the profile command. It will happily show you the percentage of CPU time spent in
each line of each function in your program! And it will return the results in a very readable fashion! The
commands
>> profile on
>> ..........
>> profile viewer
begin and end proling and display the results in the Proler window.
We have put quickly and slowly in quotes because this is quite subjective. Remember that your time is
valuable: if it takes you longer to optimize your code than you will save in running it more quickly, stie the urge
to muck around with it. Also remember that the amount of time it actually takes to optimize a code is usually a
factor of two or three or . . . longer than the time you think it will take before you get started.
109
As a simple example of method (0), consider the function hilb on page 98. hilb local(2000) runs
over 300 times slower if the line H = zeros(n) is omitted.
Continuing with this example, currently the MATLAB function hilb is written as
function H = hilb2(n)
J = 1:n;
% J is a row vector
J = J(ones(n, 1),:);
% J is now an n by n matrix with each row being 1:n
I = J ;
% I is an n by n matrix with each column being 1:n
E = ones(n, n);
H = E./(I+J-1);
as can be seen by entering
>> edit hilb
In the past this code ran nearly 20 times as fast as hilb local. However, now hilb local runs 50%
faster. The reason is that MATLAB has greatly improved its handling of for and while statements.
Thus, it is frequently not necessary to convert simple loops into complicated vector code.
As a realistic example of method (2), suppose you have a large vector y which is the discretization of
a smooth function and you want to know some information about it. In particular, consider the intervals in y where yi > R. What is the average length of these intervals and what is their standard deviation? Also, only include intervals which lie completely within y (i.e., ignore any intervals which begin or
end y ). It is not dicult to write such a code using ow control statements:
function ylen intvl = get intervals slow(y, R)
n = length(y);
if y(1) > R
% check if the first point is in an interval
in intvl = 1;
% yes
intvl nr = 1;
yin(intvl nr) = 1;
else
in intvl = 0;
% no
intvl nr = 0;
end
for i = [2: n]
% check the rest of the points
if in intvl == 1
% we are currently in an interval
if y(i) <= R
% check if this point is also in the interval
yout(intvl nr) = i;
% no, so end the interval
in intvl = 0;
end
else
% we are currently not in an interval
if y(i) > R
% check if this point is in the next interval
intvl nr = intvl nr + 1;
% yes, so begin a new interval
yin(intvl nr) = i;
in intvl = 1;
end
end
end
if y(1) > R
% check if we have begun in an interval
yin(1) = [];
% yes, so delete it
yout(1) = [];
end
if length(yin) > length(yout)
% check if we have ended in an interval
yin( length(yin) ) = [];
% yes, so delete it
end
ylen intvl = yout - yin;
When completed, yin and yout contain the element numbers where an interval begins and where it
ends, respectively. This is straightforward but very slow if y has millions of elements.
110
9. Sparse Matrices
Finally, the question remains: is the time savings signicant? For large y the CPU time is reduced by
over 50 (but this can vary greatly depending on y and R ).
Note: In get intervals slow we did not preallocate the vectors yin and yout. Since we have no idea
how many intervals there are, we have no way to preallocate these vectors to a reasonable size.
We could preallocate them to a large size, say length(y)/4, and then strip out the unused elements at the end of the code. However, unless the number of intervals is in the tens of thousands,
this will probably not save any time.
Improving Eciency of Function
profile
Prole the execution time of a MATLAB code. This is very useful for improving the
performance of a code by determining where most of the CPU time is spent.
9. Sparse Matrices
Many matrices that arise in applications only have a small proportion of nonzero elements. For example, if T Cnn is a tridiagonal matrix, then the maximum number of nonzero elements is 3n2. This
is certainly a small proportion of the total number of elements, i.e., n2 , if n is large (which commonly
means in the hundreds or thousands or . . . ).
For full matrices (i.e., most of the elements are nonzero) MATLAB stores all the elements, while for
sparse matrices (i.e., most of the elements are zero) MATLAB only stores the nonzero elements: their
locations (i.e., their row numbers and column numbers) and their values. Thus, sparse matrices require
much less storage space in the computer. In addition, the computation time for matrix operations is signicantly reduced because zero elements can be ignored.
Once sparse matrices are generated, MATLAB is completely responsible for handling all the details
of their use: there are no special commands needed to work with sparse matrices. However, there are a
111
9. Sparse Matrices
number of commands which are inappropriate for sparse matrices, and MATLAB generally generates a
warning message and refers you to more appropriate commands. For example, cond(S) has to calculate
S1 , which is generally a full matrix; instead, you can use condest which estimates the condition number
by using Gaussian elimination. You have two alternatives: rst, use full to generate a full matrix and
use the desired command; or, second, use the recommended alternative command.
There are two common commands in MATLAB for creating sparse matrices. You can enter all the
nonzero elements of S Cmn individually by
>> S = sparse(i, j, s, m, n)
where i and j are vectors which contain the row and column indices of nonzero elements and s is the
vector which contains the corresponding values. For example, the square bidiagonal matrix
S=
2
n1
4
n2
6
..
.
..
.
2
2n + 2
1
si,j
si,j
1
2
3
.
.
.
1
2
3
.
.
.
n
n1
n2
.
.
.
1
2
3
.
.
.
2
3
4
.
.
.
2
4
6
.
.
.
n1
n
n1
n
2
1
n2
n1
n1
n
2n + 4
2n + 2
112
9. Sparse Matrices
Warning:
Be Careful! The command spdiags is somewhat similar to diag but must be handled more
carefully. Note that the element b1,2 is 0, which does not appear in S. The diculty is that
the number of rows of B is generally larger than the lengths of the diagonals into which the
columns of B are to be placed and so some padding is required in B. The padding is done so
that all the elements in the k-th row of B come from the k-th column of S.
For example, the matrix
0 0 6 0 0
1 0 0 7 0
S1 = 0 2 0 0 8
0 0 3 0 0
0 0 0 4 0
113
Finally, you can generate sparse random symmetric matrices by sprandsym; if desired, the matrix will also be positive denite. (There is no equivalent command for non-sparse matrices so use
full(sprandsym(...))
Additionally, sparse matrices can be input from a data le with the spconvert command. Use
csvread or load to input the sparsity pattern from a data le into the matrix <sparsity matrix>.
This data le should contain three columns: the rst two columns contain the row and column indices of
the nonzero elements, and the third column contains the corresponding values. Then type
>> S = spconvert(<sparsity matrix>)
to generate the sparse matrix S. Note that the size of S is determined from the maximum row and the
maximum column given in <sparsity matrix>. If this is not the size desired, one row in the data le
should be m n 0 where the desired size of S is mn. (This element will not be used, since its value is
zero, but the size of the matrix will be adjusted.)
Sparse Matrix Functions
speye
sprand
sprandn
sparse
spdiags
full
find
nnz
spfun( <function name> , A)
spy
spconvert
sprandsym
for t t0
where y Rn with initial condition y(t0 ) = y0 . The basic MATLAB commands are easily learned. However, the commands become more involved if we want to explore the trajectories in more detail. Thus, we
divide this section into the really basic commands which are needed to generate a simple trajectory and
into a more advanced section that goes into many technical details. We also provide a large number of examples, many more than in other sections of this overview, to provide a template of how to actually use
the advanced features.
10.1.
Basic Commands
which is called Dungs equation. This ode has many dierent types of behavior depending on the values
of the parameters , , , and .
As written, this is not in the form of a rst-order system. To transform it we dene y1 = y and
y2 = y1 = y so that
y1 = y2
2
y2 = y1 = y = y1 (1 y1 ) y2 + cos t
or
y1
y2
y2
2
y1 (1 y1 ) y2 + cos t
We have capitalized the Y in [t, Y] to indicate that the output is a matrix whereas the argument y is a
vector in the function.
115
where the default value of RelTol is 103 and of the vector AbsTol is 106 for each element. (However, there is no guarantee that the error in the numerical calculation actually satises this bound.)
ODE Solvers
ode45
ode23
ode113
ode15s
ode23s
ode23t
ode23tb
It is up to you to decide which ode solver to use. As a general rule, unless you believe that the ode is
sti (which we discuss in the next paragraph), try ode45 or ode113. For a given level of accuracy, these
methods should run reasonably fast. (Which one runs faster is very dependent on the ode.) If you know
(or believe) that the ode is sti, or if these two non-sti solvers fail, then try ode15s.
And what is a sti ode? There is no precise denition. Instead, we say it is sti if the time step required to obtain a stable and accurate solution is unreasonably small. The best way to explain this
rather vague impression is through some simple examples.
Consider the second-order time-evolution ode
y + 999y + 1000y = 0
for t 0
with the initial conditions y(0) = 1 and y (0) = 2 . The solution to this ode is
y(t) = c1 et + c2 e1000t
where
c1 =
1
(1 2 )
1001
and c2 =
1
(10001 + 2 ) .
1001
There are two time scales in this solution: there is a rapid decay due to the e1000t term and there is a
slow growth due to the et term. Initially, the time step will be very small so that the rapid decay is
1
calculated accurately (i.e., t
/1000 ). However, soon it will be negligible and the time step should increase so that it calculates the slow growth accurately (i.e., t
1 ). However, if a non-sti solver, such
as ode45 or ode23, is used, the time step must always be very small. That is, it must accurately track
the rapidly decaying term even after this term has disappeared in the numerical solution. The reason
is that a numerical instability will cause the trajectory to blow up if the time step increases. However, if
a sti solver is used, the time step can increase by many orders of magnitude when the rapidly decaying
term has disappeared.
The same is true for the ode
y + 1001y + 1000y = 0
whose solution is
y(t) = c1 et + c2 e1000t .
Initially, the time step will be very small so that the rapid decay is calculated accurately (i.e.,
1
t
/1000 ). However, soon it will be negligible and the time step should increase so that it calculates
the slowly decaying mode accurately (i.e., t
1 ).
On the other hand, consider the ode
y 1001y + 1000y = 0
whose solution is
y(t) = c1 et + c2 e1000t .
116
the time step must always be very small so that the rapidly growing mode e1000t is calculated accu1
rately (i.e., t
/1000 ). Thus, this is not a sti ode.
The above examples are very simple. They are only designed to show that an ode is sti if there is a
rapidly decaying mode and any growth in the solution occurs on a much slower time scale. (This frequently happens in chemical reaction models, where some reactions occur on a very fast time scale and
and other occur on a much slower time scale.) In the next subsection we discuss van der Pols equation, a
second-order ode which is either non-sti or sti depending on the value of one parameter. You can plot
the solution and observe the separation of the fast scale and the slow scale as this parameter increases.
One diculty with a sti ode solver is that you may well have to supply the Jacobian of the ode yourself. The Jacobian of f(t, y) is the nn matrix
J(t, y) =
fi
(t, y)
yj
117
The next simplest approach is to use a nested function, and so there must also be a primary function.
function duffing ode(alpha, beta, Gamma, omega, y0, final time)
ode45(@duffing n, [0 final time], y0);
%%%%% nested function follows
function deriv = duffing n(t, y)
deriv = [ y(2) ; y(1)*(1-beta*y(1) 2)-alpha*y(2)+Gamma*cos(omega*t) ];
end
end
(The n denotes the fact that duffing n is a nested function.) Note that the parameters are input to
the primary function and so are immediately accessible to the nested function. Clearly, this second approach (of using a nested function) requires more coding that the rst approach (of using an anonymous
function). However, the rst approach only works if the right-hand side can be dened using one MATLAB statement. If the right-hand side is more complicated, then a nested function is the simplest choice.
Note: Since duffing n is a function, and not a function handle, we have to include @ before the name
of the function.
The third, and oldest, approach is to create a separate function m-le (i.e., a primary function) which
calculates the right hand side of this ode system.
function deriv = duffing p(t, y)
% duffing p: Duffings equation, primary function
alpha = 0.05;
beta = 1.0;
Gamma = 0.5;
omega = 1.0;
deriv = [ y(2) ; y(1)*(1-beta*y(1) 2)-alpha*y(2)+Gamma*cos(omega*t) ];
(The p denotes the fact that duffing p is a primary function.) Note that all the parameters are dened in the m-le so that it will have to be modied whenever we want to modify the parameters. This is
a very bad approach because this le will have to be repeatedly modied.
Note: Since duffing p is a function, and not a function handle, we have to include @ before the name
of the function.
Finally, it is very inconvenient that the parameters in Dungs equation are determined in the function
itself. We should be able to explore the rich behavior of Dungs equation without having to constantly
modify the function in fact, once we have the function exactly as we want it, we should never touch
it again. (This is not only true for esthetic reasons; the more we fool around with the function, the more
likely we are to screw it up!)
This is easily done by adding parameters to the function le.
function deriv = duffing p2(t, y, alpha, beta, Gamma, omega)
% duffing p2: Duffings equation, primary function
% with coefficients passed through the argument list
deriv = [ y(2) ; y(1)*(1-beta*y(1) 2)-alpha*y(2)+Gamma*cos(omega*t) ];
(The p2 denotes the fact that duffing p2 is another primary function.) However, this function cannot
be called directly by the ode solver. Instead it is called indirectly using closure by
%%%%% script m-file: duffing closure
alpha = 0.05;
beta = 1.0;
Gamma = 0.5;
omega = 1.0;
duffing c = @(t, y) duffing p2(t, y, alpha, beta, Gamma, omega);
ode45(duffing c, [0 100], [2 1]);
(which is contained in the accompanying zip le). Notice that the function duffing c takes only two
arguments: t and y. But the function it invokes is duffing p2 which takes six arguments. Thus,
ode45 thinks it is only passing two arguments to duffing c, but it is actually passing six arguments to
duffing p2.
118
To see a sampling of the dierent type of behavior in Dungs equation, let = 0.15, = 1, = 0.3
and = 1, and let the initial condition be y(0) = (0, 1)T . After a short initial transient, the solution settles down and appears to be regular by t = 100: in fact, it appears to be exactly periodic with a period
of 2 due to the 0.3 cos t term. (In fact, to the accuracy of the computer it is exactly periodic.) However, if we merely change the initial condition to y = (1, 0)T the behavior appears to be chaotic, even at
t = 1000. Here is an example of a ode which has periodic motion for one initial condition and is chaotic
for another! If we now change from 0.15 to 0.22 we nd periodic motion with a period of 6. This is
just a sampling of the behavior of Dungs equation in dierent parameter regions.
By the way, to separate the initial transient behavior from the long-time behavior, you can use the
script m-le
initial time = ???
final time = ???
y0 = ???
alpha = ???;
beta = ???;
Gamma = ???;
omega = ???;
duffing a = @(t, y)[ y(2) ; y(1)*(1-beta*y(1) 2)-alpha*y(2)+Gamma*cos(omega*t) ];
[t, Y] = ode45(duffing a, [0 initial time], y0);
figure(1)
plot(Y(:,1), Y(:,2))
l t = length(t);
[t, Y] = ode45(duffing c, [t(l t) final time], Y(l t,:));
figure(2)
plot(Y(:,1), Y(:,2))
10.2.
Advanced Commands
There are a number of parameters that we can use to tune the particular ode solver we choose. The
MATLAB function odeset is used to change these parameters from their default values by
>> params = odeset( <Prop 1> , <Value 1>, <Prop 2> , <Value 2>, ...)
where each parameter has a particular name and it is followed by the desired value. The result of this
command is that the parameters are contained in the variable params. You include these parameters in
the ode solver by adding this variable to the argument list of the ode solver function as
>> [t, Y] = <ode solver>(<function handle>, tspan, y0, params)
Some of the more common parameters are shown in the table below; they will be discussed further later.
To determine all the parameters, their possible values and the default value, enter
>> odeset
119
Assigns values to properties; these are passed to the ode solver when it is
executed.
The absolute error tolerance. This can be a scalar in which case it applies to all the
elements of y or it can be a vector where each element applies to the corresponding
element of y. (Default value: 106 .)
Events
A handle to a function which determines when an event occurs.
Jacobian A handle to a function which returns the Jacobian.
JPattern A sparse matrix whose nonzero elements (which should be 1 ) correspond to the possible nonzero elements of the Jacobian. This is only used when the Jacobian is calculated
numerically, i.e., when the Jacobian property is not used.
OutputFcn A handle to a function which is called after each successful time step. For example, a
plot of the trajectory can be generated automatically as it is being calculated.
Useful MATLAB functions are:
odeplot which generates a plot of time versus all the components of the trajectory,
i.e., t vs. y1 , y2 , . . . , yn ;
odephas2 which generates a plot of y1 vs. y2 , i.e., Y(:,1) vs. Y(:,2);
odephas3 which generates a plot of y1 vs. y2 vs. y3 , i.e., Y(:,1) vs. Y(:,2)
vs. Y(:,3).
It is possible to plot dierent components of y using OutputSel.
OutputSel A vector containing the components of Y which are to be passed to the function specied by the OutputFcn parameter.
Refine
Renes the times which are output in t. This integer value increases the number of
times by this factor. (Default value: 1 for all ode solvers except ode45, 4 for ode45.)
RelTol
The relative error tolerance. (Default value: 103 ).
Stats
Whether statistics about the run are output on the terminal (value: on ) after the
trajectory is calculated or they are not (value: off ). (Default value: off .)
AbsTol
For example, if you want to use ode45 with the relative error tolerance set to 106 for Dungs equation, enter
>> params = odeset( RelTol , 1.e-6);
>> [t, Y] = ode45(duffing a, tspan, y0, params);
The trajectory will be more accurate but the command will run slower. If you also want the statistics
on the performance of the particular ode solver used, enter
>> params = odeset( RelTol , 1.e-6, Stats , on );
>> [t, Y] = ode45(@duffing a, tspan, y0, params);
and the number of successful steps, the number of failed steps, and the number of times f(t, y) was evaluated will be printed on the terminal. This might be useful in optimizing the performance of the ode
solver if the command seems to be running excessively slowly. For implicit methods where the Jacobian
needs to be calculated, the number of times the Jacobian was evaluated, the number of LU decompositions,
and the number of times the linear system was solved will also be returned.
The ode solver can also record the time and the location when the trajectory satises a particular condition: this is called an event. For example, if we are calculating the motion of the earth around the sun,
we can determine the position of the earth when it is closest to the sun and/or farthest away; or, if we are
following the motion of a ball, we can end the calculation when the ball hits the ground or we can let it
continue bouncing. Enter
>> ballode
to see a simple example.
For example, suppose we want to record where and when a trajectory of Dungs equation passes
through y1 = 0.5. That is, we dene an event to be whenever the rst component of y passes
120
through 0.5 or +0.5. This can be done by modifying the primary function duffing ode and replacing the ode45 statement by
params = odeset( RelTol , 1.e-6, Events , @duffing event);
[t, Y, tevent, Yevent, indexevent] = ode45(@duffing n, tspan, y0, params);
where we create a new nested function in the primary function duffing ode.
function [value, isterminal, direction] = duffing event(t, y)
value = [y(1)+0.5; y(1)-0.5];
% check whether y(1) passes through
0.5
isterminal = [0; 0];
% do not halt when this occurs
direction = [0; 0];
% an event occurs when y(1) passes through
% zero in either direction
end
Note that we can dene the right-hand side of Dungs equation by using duffing a, duffing n,
duffing p, or duffing p2 and duffing c. We have chosen duffing n since we have created the nested
function duffing event. (We could let duffing event be a primary function, but there is no reason to
do so.)
There are a number of steps we have to carry out to turn events on. First, we have to use the odeset
command. However, this only tells the ode solver that it has to watch for one or more events; it does not
state what event or events to watch for. Instead, we describe what an event is in this new function. Three
vector arguments are output:
value A column vector of values which are checked to determine if they pass through zero during
a time step. No matter how we describe the event, as far as the ode solver is concerned an
event only occurs when an element of this vector passes through zero. In some cases, such
as this example it is easy to put an event into this form. In other cases, such as determining
the apogee and perigee of the earths orbit, the calculation is more complicated.
isterminal A column vector determining whether the ode solver should terminate when this particular event occurs: 1 means yes and 0 means no.
direction A column vector determining how the values in value should pass through zero for an
event to occur:
1 means the value must be increasing through zero for an event to occur,
1 means the value must be decreasing through zero for an event to occur, and
0 means that either direction triggers an event.
The nal step is that the left-hand side of the calling statement must be modied to
[t, Y, tevent, Yevent, index event] = ode45(...);
Any and all events that occur are output by the ode solver through these three additional variables:
tevent is a vector containing the time of each event,
Yevent is a matrix containing the location of each event, and
index event is a vector containing which value in the vector value passed through zero.
If the result is stored in the structure sol, the new output is
sol.xe is a vector containing the time of each event,
sol.ye is a matrix containing the location of each event, and
sol.ie is a vector containing which value in the vector value passed through zero.
Since the function duffing event might appear confusing, we now discuss how an event is actually
calculated. At the initial time, t and y are known and duffing event is called so that the vector
(0)
e(0) =
y1 + 0.5
(0)
y1 0.5
i.e., value, can be calculated. In addition, isterminal and direction are returned. Next, duffing is
called and the solution y(1) is calculated at time t(1) . duffing event is called again and e(1) is calculated and compared elementwise to e(0) . If the values have dierent signs in some row, then direction
is checked to determine if the values are passing through zero in the correct direction or if either direction
is allowed. If so, the time at which the element is zero is estimated and the ode is solved again to obtain
121
a more accurate estimate. This procedure continues until the zero is found to the desired accuracy. Then
isterminal is checked to see if the run should be continued or should be stopped.
Another interesting ode is van der Pols equation
y (1 y 2 )y + y = 0
where > 0 is the only parameter. As a rst order system it is
y1
y2
y2
2
(1 y1 )y2 y1
0
2y1 y2 1
1
2
(1 y1 )
The right-hand side can be coded as a nested function inside a primary function by
function vdp ode(mu, y0, final time)
ode45(@vdp n, [0 final time], y0);
%%%%% nested function follows
function deriv = vdp n(t, y)
deriv = [y(2); mu*(1-y(1) 2)*y(2)-y(1)];
end
end
This is not sti unless is large. For example, let = 1 and solve the ode with initial conditions
y(0) = 1 and y (0) = 0 for t [0, 100] using ode45. Then, plot the result and note the number of elements in t. Repeat this procedure using = 10 and increase the nal time, if necessary, so that you still
see a few complete oscillations. Then let = 100, etc., until the time required to plot a few oscillations
becomes very large. Then use ode15s and note the huge dierence in the time required. ADD ALL
VDPS???
There is no need to use the ode solver parameters JPattern or Jacobian in this example because this
ode is so nice. However, since they might be needed for a nastier ode, we include them by using
Vdp pattern = sparse([1 2 2], [2 1 2], [1 1 1], 2, 2);
params = odeset( Jacobian , @vdpj n, JPattern , Vdp pattern):
[t, Y] = <ode solver>(@vdp n, tspan, y0, opt);
where the Jacobian is calculated numerically using the nested function
function J = vdpj n(t, y)
% vdpj n: Jacobian for van der Pols equation
J = [ 0 1; -2*mu*y(1)*y(2)-1 mu*(1-y(1) 2) ];
end
for the elements determined by Vdp pattern. By the way, if we use the property JPattern but not
Jacobian then the Jacobian is calculated numerically just for the elements determined by the sparse matrix.
Note: Plotting the trajectory by
plot(t, Y)
is not very instructive. Instead, use
subplot(2,1,1)
plot(t, Y(:,1))
subplot(2,1,2)
plot(t, Y(:,2))
Our nal example is slightly more complicated. Suppose we kick a ball into the air with initial speed
s and at an angle of , and we want to follow its motion until it hits the ground. Let the x axis be the
horizontal axis along the direction of ight and z be the vertical axis. Using Newtons laws we obtain the
ode system
x = 0 and z = g
122
where g = 9.8 meters/second is the acceleration on the ball due to the earths gravity. The initial conditions are
x(0) = 0 , x (0) = s cos , z(0) = 0, and z (0) = s sin
where we assume, without loss of generality, that the center of our coordinate system is the initial location
of the ball. We also want to determine four events in the balls ight: the highest point of the trajectory
of the ball and the time it occurs, the distance it travels and the time it hits the ground, and the x values and times when the ball reaches the height h > 0. But beware because the ball may never attain this
height!
Although these odes can be solved analytically (consult any calculus book), our aim is to give an example of how to use many of the advanced features of MATLABs ode solvers. (If we would include the
eects of air resistance on the ball, then these odes would become nonlinear and would not be solvable
analytically.) We convert Newtons laws to the rst-order system
y2
y1
y2 0
=
y4
y3
g
y4
One complication with solving this system numerically is that we do not know when the ball will hit
the ground, so we cannot give the nal time. Instead, we use a time, 10s/g which is much greater than
needed and we let the program stop itself when the ball hits the ground. In addition, we want the relative
error to be 106 . Finally, we want the trajectory (i.e., z vs. x ) to be plotted automatically.
The following is a completely self-contained example using nested functions.
123
where n is a nonnegative integer and the initial condition is given at t = 0. The solution is denoted by
Jn (t) and, for specicity, we will concentrate on n = 1. At t = 0 the ode reduces to y(0) = 0 and so
we require y(0) = 0. The free initial condition is y (0) and for this example we choose y (0) = 1.
If we write Bessels equation as
1
n2
y (t) + y (t) + 1 2
t
t
y(t) = 0
(10.2)
we clearly have a problem at t = 0 and for t 0. The ode solvers we discussed previously can handle (10.2) for t 1 with the initial conditions that y(1) and y (1) are given. However, a completely
dierent method of solution is required for t 0 and the form (10.1) is preferred to (10.2).
When we convert Bessels equation to the rst order system we again let y1 (t) = y(t) and y2 (t) = y (t)
and leave the t2 in the numerator to obtain
y1
t2 y2
y2
ty2 (t2 1)y1
Previously, we have always written the rst-order system as y = f(t, y), but this form has a problem
when t = 0. Instead, we write it as g(t, y, y ) = 0 so that
g(t, y, y ) =
y1 y2
t2 y2 + ty2 + (t2 1)y1
Finally, we not only have to input the initial condition y(0) = (0, 1)T , but we also have to input
T
y (0) = y1 (0), y2 (0) . It is easy to calculate y1 (0) = y2 (0), but y2 (0) y (0) is more complicated.
Dierentiate (10.1) with respect to t to obtain
t2 y (t) + 3ty (t) + t2 y (t) + 2ty(t) = 0
and dierentiate it again to obtain
t2 y
Now set
>>
>>
>>
>>
>>
>>
for x [a, b]
where y Rn but conditions are given at both ends of the interval. If the boundary conditions are separated, then k conditions are given at x = a and n k other conditions are given at x = b. If the
boundary conditions are non-separated, then the conditions at x = a and at x = b are related. To allow
any of these boundary conditions we write the boundary conditions as y(a), y(b) = 0 where Rn .
For simplicity, we will only consider two closely related second-order odes, i.e., n = 2. This example
should enable you to study any boundary-value ode. Consider the two nonlinear boundary-value ordinary
dierential equations
dy
d2 y
(x) + 2 (x) + ey(x) = 0
dx2
dx
(11.1a)
dy
d2 y
(x) + 2 (x) + ey(x) = 0
dx2
dx
(11.1b)
and
y(0), y(1) =
=0,
(11.2)
which are called Dirichlet boundary conditions. These two odes are quite simple, but also quite interesting
and challenging to solve for certain intervals in .
We could use the Neumann boundary conditions y (0) = 4 and y (1) = 7 by
y(0), y(1) =
y (0) 4
y (1) + 7
=0.
(11.3)
Or we could use the mixed boundary conditions y(0) y (0) = 1 and y(1) + 2y (1) = 3 by
y(0), y(1) =
y(0) y (0) 1
y(1) + 2y (1) 3
=0.
(11.4)
y(1) y(0)
y (1) y (0)
=0.
(11.5)
The primary MATLAB function is bvp4c. However, the functions bvpinit and deval are also
needed. We solve the boundary value problem by
>> sol = bvp4c(<right-hand side>, <boundary conditions>, <initial guess>)
There are two functions we need to write: odefun is f(x, y) and bcfun is the boundary conditions. For
our example the ode given by
function yp = nlode(x, y)
global which ode eps
if which ode == 1
yp = [y(2); -eps*exp(y(1))-2*y(2)];
else
yp = [y(2); -(exp(y(1))+2*y(2))/eps];
end
where we use global to input which ode to use and . The boundary condition is given by
function bc = nlode bc(ya, yb)
bc = [ya(1); yb(1)];
Since these boundary conditions are particularly simple, we also include the function
function bc = nlode bc2(ya, yb)
bc = [ya(1)-ya(2)-1; yb(1)+2*yb(2)-3];
126
for mixed boundary conditions (11.4). In addition, we have to choose an initial guess for y(x) using
bvpinit by either
>> bvpinit(x, y init)
or
>> bvpinit(x, <initial guess function>)
For example, if we want the initial iterate to be a parabola which is zero at x = 0 and 1 and has maximum value A then y(x) = y1 (x) = 4Ax(1 x) and y (x) = y2 (x) = 4A(1 2x) then we can write
>> x = linspace(0, 1, 21);
>> solinit = bvpinit(x, @nlode y ic);
where nrode y ic is written as
function y ic = nlode y ic(x)
global A
y ic = [4*A*x.*(1 - x); 4*A*(1-2*x)];
The only alternative is to write
>> x = linspace(0, 1, 21);
>> y1 val = ???;
>> y2 val = ???;
>> solinit = bvpinit(x, [y1 val; y2 val]);
where y1 val and y2 val are scalar values. Thus the initial guess is y1 = y1 val*ones(size(x)) and y2
= y2 val*ones(size(x)). This is often unacceptable because constant initial guesses may be so far from
the solution that convergence cannot be obtained. What we would like to do is
>> x = linspace(0, 1, 21);
>> y1 = 4*A*x.*(1 - x);
>> y2 = 4*A*(1 - 2*x);
>> solinit = bvpinit(x, [y1; y2]); % WRONG
This fails because y1 and y2 must be scalar variables and not vectors. If you really, really need y1 and
y2 to be vectors, then do not use bvpinit. Instead, specify the structure solinit directly by entering
>> x = linspace(0, 1, 21);
>> y1 = 4*A*x.*(1 - x);
>> y2 = 4*A*(1 - 2*x);
>> solinit.x = x;
>> solinit.y = [y1;y2];
Warning: This is dangerous because future versions of Matlab might change the eldnames of the structure solinit. However, it works for now.
We are nally ready to solve this ode by
%%%%% script m-file: nlode1 >
> global which ode e
>> global A
>> which ode = 1;
>> A = 1;
>> e = 3;
>> x = linspace(0, 1, 21);
>> solinit = bvpinit(x, @nlode y ic);
>> sol = bvp4c(@nlode, @nlode bc, solinit);
The solution is contained in sol and is extracted by deval. For example, if xi = (i 1)x where
x1 = 0 and xn = 1 then we determine, and plot, the numerical solution y by
%%%%% script m-file: nlode2 >
> xpt = linspace(0, 1, 101);
>> Ypt = deval(sol, xpt);
>> plot(xpt, Ypt(1,:), xpt, Ypt(2,:), r )
Having done all this work, we now combine everything into the function m-le nlode all to show how
127
much easier it is to use nested functions and to combine everything into one primary function.
function sol = nlode all(which ode, e, A, nr points)
% nlode all: boundary-value solver using bvp4c
% which ode = 1 y + 2 y + e exp(y) = 0, y(0) = y(1) = 0
%
= 2 e y + 2 y + exp(y) = 0 , y(0) = y(1) = 0
% A = the initial guess is y = 4 A x (1 - x)
% nr points = number of equally spaced points in initial guess
x = linspace(0, 1, nr points);
solinit = bvpinit(x, @nlode y ic);
sol = bvp4c(@nlode, @nlode bc, solinit);
xpt = linspace(0, 1, 101);
Ypt = deval(sol, xpt);
plot(xpt, Ypt(1,:), xpt, Ypt(2,:), r )
%%%%% nested functions follow
function y ic = nlode y ic(x)
y ic = [4*A*x.*(1 - x); 4*A*(1-2*x)];
end
function yp = nlode(x, y)
if which ode == 1
yp = [y(2); -e*exp(y(1))-2*y(2)];
else
yp = [y(2); -(exp(y(1))+2*y(2))/e];
end
end
function bc = nlode bc(ya, yb)
bc = [ya(1); yb(1)];
end
end
This m-le is easy to read and easy to debug and easy to modify. Also, the solution is returned so it can
be used in the MATLAB workspace.
The reason we chose these particular odes is to check out bvp4c. For the ode (11.1a) there are two
solutions for 0
3.82 and no solutions for
3.82. This is a good test of any boundary-value
solver. For the ode (11.1a) there is one solution for any > 0. The interesting feature of this ode is
that for
1 the solution rises rapidly from y(0) = 0 to y(x) log 2 for x = O( ) and then decays
gradually so that y(1) = 0. It is very challenging for a boundary-value solver to be able to capture this
rapid rise.
One nal point needs to be emphasized. Sometimes, any halfway decent initial choice of y will converge to a solution. In fact, this is true for our example but it is not true for many examples. Sometimes it takes a good initial choice to obtain convergence; a bad choice will never converge to the desired solution. The standard method to use to obtain a good initial iterate is the continuation method.
Frequently there are values of the parameter(s) for which good initial iterates are known. For example,
for the ode (11.1a) if
1 we can approximate ey by the Taylor series expansion (1 + y) and solve
the resulting linear ode. If = 0.1 the resulting analytical solution is a very good approximation to the
numerical solution. You can use this solution as the initial guess for = 0.2. The numerical solution can
then be used as an initial guess for a larger value of , etc.
The only diculty with this method is that there might be more solutions. When = 0.1 there is a
second solution whose maximum is over 8. For this solution y (0) 35 which indicates how rapidly the
solution is growing at the left endpoint. This solution can only be found by trying large initial guesses
(e.g., choosing A to be large in nlode y ic ).
For the ode (11.1b) it is very dicult to determine good initial guesses when
1 since the solution grows so rapidly. Again, the continuation method is very helpful. Start with a large value of ,
say = 1, and choose a reasonable initial guess. (Since the two odes are identical when = 1 you can
use the solution you found to ode (11.1a).) Then slowly decrease . For example, when = 0.01 we have
y (0) 130 and when = 0.001 we have y (0) 1300. In conclusion, we want to remind you that for
128
the odes we have discussed here almost any halfway reasonable initial choice for the ode (11.1a) will
converge to one of the two solutions and for the ode (11.1b) will converge to the single solution. However,
you might well nd an ode for which this is not true.
Boundary-Value Solver
bvp4c(<right-hand side>,
<boundary conditions>,
<initial guess>)
bvpinit(x,y)
bvpinit(x, <initial guess function>)
deval(x,y soln)
y1
x1 1
x2 1 c1
y2
.
.
.
. c2 = . .
.
.
.
.
xn 1
yn
129
In general, there is no solution to this overdetermined linear system. Instead, we nd the least-squares
solution c = (c1 , c2 )T by
>> c = [x ones(n, 1)] \ y
We can plot the data points along with this straight line by
>> xx = linspace(min(x), max(x), 100);
>> yy = polyval(c, xx);
>> plot(xx, yy, x, y, o )
We can nd the best t by a polynomial of degree m < n, i.e., y = c1 xm + c2 xm1 + + cm+1 , by
calculating the least-squares solution to
Vc = y
where
xm
1
xm
2
V= .
.
.
xm
n
m1
x1
m1
x2
.
.
.
x1
x2
.
.
.
1
1
.
.
.
xm1
n
xn
c1
c2
and c = . .
.
.
cn
130
spline : Cubic splines are used to connect the given data points. That is, cubic polynomials
connect each pair of adjacent data points. The additional constraints needed to obtain
unique polynomials are that the the two polynomials which overlap at each interior data
point have the same rst and second derivatives at this point.
pchip : Piecewise cubic Hermite polynomials connect each pair of adjacent data points. This is
similar to spline but the second derivatives need not be continuous at the interior data
points. Instead, this interpolation is better at preserving the shape of the data. In particular, on intervals where the data is monotonic so is the piecewise polynomial, and on
intervals where the data is concave up or down so is the piecewise polynomial.
cubic : The same as pchip.
An alternate way to interpolate these points is by using the two commands
>> pp = spline(x, y)
>> yvalues = ppval(pp, xvalues)
to generate and interpolate the cubic spline or
>> pp = pchip(x, y)
>> yvalues = ppval(pp, xvalues)
to generate and interpolate the piecewise cubic Hermite polynomials. The rst command generates the
structure pp which contains all the information required to obtain a unique piecewise polynomial. The
second command interpolates the piecewise polynomial at the x values given by the vector xvalues.
Interpolation really means interpolation. If a value lies outside the interval [x1 , xn ] then, by default,
NaN is returned. This can be changed by adding a fth argument:
If the fth argument is a number, this value is returned whenever the value lies outside the interval.
If the fth argument is extrap , extrapolation (using the same method) is used.
The command spline can be used instead of using interp1 with the method spline. With it you
can specify precisely the boundary conditions to use. Similarly, the command pchip can be used instead
of using interp1 with the method pchip or cubic.
131
Polynomial Functions
interp1(x, y, xvalues, <method>)
interp2
interp3
interpn
pchip
poly(<roots>)
polyder(q)
polyfit(x, y, n)
polyint(q)
polyval(q, x)
polyvalm(q, A)
ppval
roots(q)
spline
vander
132
f(x) =
x1 + x2 + sin(x1 x2 )
x1 x2 + 2 cos(x1 + x2 )
133
xmax
ymax
f (x, y) dxdy
xmin
ymin
by
>> dblquad(<function handle>, xmin, xmax, ymin, ymax)
It can also calculate the triple integral
xmax
ymax
zmax
f (x, y, z) dxdy dz
xmin
ymin
zmin
by
>>
134
quadl(<function handle>, a, b)
f (t) = a0 +
ak cos
k=1
where
a0 =
1
T
2
ak =
T
2
bk =
T
2kt
2kt
+ bk sin
T
T
(14.1)
f (t) dt
0
T
0
f (t) cos kt dt
T
0
for k N[1, ) .
f (t) sin kt dt
The coecients a0 , a1 , a2 , . . . and b1 , b2 , . . . are called the real Fourier coecients of f , and ak and bk
are the coecients of the k-th mode. The power of the function f (t) is
P =
1
T
f (t)
dt
The term power is a misnomer because the function f need not be related to a physical quantity for which
the power makes any sense. However, we will stick to the common usage.
135
so that
1
P = |a0 | +
2
2
|ak |2 + |bk |2 .
k=1
|a0 |2
1
2
if k = 0
2
|ak | + |bk |
if k > 0
and the frequency of the k-th mode is k/T cycles per unit time.
Since
eit eit
eit + eit
and sin t =
,
cos t =
2
2i
we can rewrite the real Fourier series as the complex Fourier series
1
2 (ak
f (t) = a0 +
k=1
so that
ck e2ikt/T
f (t) =
(14.2)
for k > 0 .
(14.3)
k=
where
c0 = a 0
1
ck = 2 (ak ibk )
1
ck = 2 (ak + ibk )
The coecients . . . , c2 , c1 , c0 , c1 , c2 , . . . are called the complex Fourier coecients of f , and ck and
ck are the coecients of the k-th mode. (Note that these Fourier coecients are generally complex.) We
can also calculate ck directly from f by
ck =
1
T
f (t)e2ikt/T dt
for k = . . . , 2, 1, 0, 1, 2, . . .
Note that if f is real, then ck = c (by replacing k by k in the above equation). The power of f (t)
k
is
P = |c0 |2 +
|ck |2 + |ck |2
k=1
To understand the physical signicance of power, we begin with the denition of work. Consider a particle
which is under the inuence of the constant force F . If the particle moves from the point P0 to P1 then the
work done to the particle is F q r, where r is the vector from P0 to P1 . The power of the particle is the work
done per unit time, i.e., F q v where v = r/t.
Next, consider a charge q which is moving between two terminals having a potential dierence of V . The
work done on the charge is W = qV = ItV , where I is the current and t is the time it takes for the charge to
move between the two terminals. If R is the resistance in the circuit, V = IR and the power is
W
V2
= IV = I 2 R =
.
t
R
Thus, if we consider f (t) to be the voltage or the current of some signal, the instantaneous power in the signal is
proportional to f 2 (t) and the average power is proportional to
P =
1
T
f (t)
0
136
dt .
Pk =
if k = 0
2
|ck | + |ck |
if k > 0 .
We can only calculate a nite number of Fourier coecients numerically and so we truncate the innite
series at the M -th mode. We should choose M large enough that
M
ck e2ikt/T
f (t)
k=M
k e2iktj /T
for j = 0, 1, 2, . . . , N 1
k e2ijk/N
f (tj ) =
for j = 0, 1, 2, . . . , N 1
k=M
fj =
(14.4)
k=M
1
N
N 1
fj e2ijk/N
for k = M, M + 1, . . . , M .
(14.5)
j=0
k e2ikt/T
fFS (t) =
k=M
It is our responsibility (using our experience) to choose M large enough that f (t) fFS (t). Given
f = (f0 , f1 , f2 , . . . , fN 1 )T , the Fourier coecients are calculated in MATLAB by
>> fc = fft(f)/N
where the coecients of the discrete Fourier transform are contained in fc in the order
0 , 1 , . . . , M 1 , M , M , M +1 , . . . , 2 , 1
Note that tN is not used because f (tN ) has the same value as f (t0 ) and so does not provide us with an
independent equation.
137
not
M , M +1 , . . . , 2 , 1 0 , 1 , . . . , M 1 , M .
There is only one diculty with our presentation. As we have already stated, the vector f has
N = 2M + 1 elements, which is an odd number. The Fast Fourier Transform (FFT, for short), which
is the method used to calculate the discrete Fourier coecients by fft and also to recover the original
function by ifft, generally works faster if the number of elements of f is even, and is particularly fast if
it a power of 2.
The gure below shows the cputime needed to calculate fft(f) as a function of N . Since the vertical axis is logarithmic, it is clear that there is a huge dierence in the time required as we vary N .The
dashed lines show the minimum and maximum asymptotic times as cn log2 n.
138
10
10
10
10
10
200
400
600
800
1000
n
1200
1400
1600
For N to be even, we have to drop one coecient, and the one we drop is M . Now
N = 2M
is even. The discrete complex Fourier series is
M 1
k e2ikt/T
fFS (t) =
k=M
1
N
N 1
fj e2ijk/N
for k = M, M + 1, . . . , M 2, M 1 .
j=0
139
1800
2000
140
that power0(k) is the power in the k1-st mode.) Clearly, the original spikes are still dominant, but the
random noise has excited every mode.
To see how much power is in the unperturbed signal and then the perturbed signal, enter
>> sum(power0)
>> sum(powerpert)
The perturbed signal has about ve times as much power as the original signal, which makes clear how
large the perturbation is.
Let us see if we can reconstruct the original signal by removing any mode whose magnitude is small.
By looking at the power plots, we see that the power in all the modes, except for those corresponding
to the spikes, have an amplitude
0.1. Thus, we delete any mode of the perturbed Fourier spectrum,
i.e., fcpert, whose power is less than this value; we call this new Fourier spectrum fcchop. We then
construct a new signal ychop from this chopped Fourier spectrum and compare it with the original
unperturbed signal in
%%%%% script m-file: fft ex3
fcchop = fcpert;
% initialize the chopped Fourier spectrum
ip = zeros(size(fcpert));
% construct a vector with 0s
ip(1:N/2) = ( powerpert > 0.1 );
% where fcchop should be
ip(N:-1:N/2 +2) = ip(2:N/2);
% zeroed out
fcchop( find( ip) ) = 0;
% zero out "small" modes
ychop = real( N*ifft(fcchop) );
% signal of "chopped" Fourier spectrum
figure(1)
plot(t, ychop, b )
figure(3)
plot(t, y0, r , t, ychop, b )
(which is contained in the accompanying zip le). ( ychop is the real part of N*ifft(fcchop) because,
due to round-o errors, the inverse Fourier transform returns a slightly complex result.) The result is
remarkably good considering the size of the perturbation.
Discrete Fourier Transform
fft(f)
ifft(fc)
fftshift(fc)
ifftshift(cf)
A
A2
A3
+
+
+ .
1!
2!
3!
141
(Thus, if A Cmn where m = n then eA does not exist because Ak does not exist if A is not a square
matrix.)
If A is a square diagonal matrix eA is particularly simple to calculate since
Ap =
a11
a22
. .
.
ap
11
an1,n1
ann
ap
22
. .
.
ap
n1,n1
ap
nn
Thus,
eA =
ea11
e
a22
. .
.
ean1,n1
eann
is
y(t) = yic eat .
Similarly, the solution of
y (t)
a11
1
y2 (t) a21
d
. = .
dt . .
.
.
an1
yn (t)
i.e., y (t) = Ay(t), is
a12
a22
.
.
.
..
.
an2
y (t)
a1n
1
a2n y2 (t)
. .
. .
.
.
ann
yn (t)
142
Matrix Functions
expm(A)
sqrtm(A)
logm(A)
funm(A, <function handle>)
Calculates
Calculates
Calculates
Calculates
matrix.
143
144
These tables summarize the functions and operations described in this tutorial. The number (or numbers) shown give the page number of the table where this entry is discussed.
Arithmetical Operators
+
*
.*
/
./
\
\
.\
Addition.(p. 7, 29)
Subtraction.(p. 7, 29)
Scalar or matrix multiplication.(p. 7, 29)
Elementwise multiplication of matrices.(p. 29)
Scalar division.(p. 7, 29)
Elementwise division of matrices.(p. 29)
Scalar left division, i.e., b\a = a/b. (p. 7)
The solution to Ax = b for A Cmn : when m = n and A is nonsingular this
is the solution Gaussian elimination; when m > n this is the least-squares approximation of the overdetermined system; when m < n this is a solution of the
underdetermined system.(p. 29, 80)
Elementwise left division of matrices i.e., B.\A = A./B. (p. 29)
Scalar or matrix exponentiation.(p. 7, 29)
Elementwise exponentiation of matrices.(p. 29)
Special Characters
:
;
,
...
%
145
Getting Help
demo
doc
help
helpdesk
load
lookfor
profile
save
type
who
whos
C
Predened Variables
ans
pi
eps
Inf
NaN
i
j
realmin
realmax
The default variable name when one has not been specied.(p. 9)
. (p. 9)
Approximately the smallest positive real number on the computer such that
1 + eps = 1. (p. 9)
(as in 1/0 ).(p. 9)
Not-a-Number (as in 0/0 ).(p. 9)
1 . (p. 9)
1 . (p. 9)
The smallest usable positive real number on the computer.(p. 9)
The largest usable positive real number on the computer.(p. 9)
Format Options
The default setting.(p. 11)
Results are printed to approximately the maximum number of digits of accuracy in
MATLAB.(p. 11)
format short e Results are printed in scientic notation.(p. 11)
format long e Results are printed in scientic notation to approximately the maximum number of
digits of accuracy in MATLAB.(p. 11)
format short g Results are printed in the best of either format short or format short e.
(p. 11)
format long g Results are printed in the best of either format long or format long e. (p. 11)
format short
format long
146
147
Input-Output Functions
csvread
csvwrite
diary
fopen
fclose
fscanf
fprintf
input
load
print
Reads data into MATLAB from the named le, one row per line of input.(p. 54)
Writes out the elements of a matrix to the named le using the same format as
csvread. (p. 54)
Saves your input to MATLAB and most of the output from MATLAB to
disk.(p. 7)
Opens the le with the permission string determining how the le is to be accessed.(p. 82)
Closes the le.(p. 82)
Behaves very similarly to the C command in reading data from a le using any
desired format.(p. 82)
Behaves very similarly to the C command in writing data to a le using any desired format.
It can also be used to display data on the screen.(p. 82)
Displays the prompt on the screen and waits for you to enter whatever is desired.(p. 10)
Reads data into MATLAB from the named le, one row per line of input.(p. 54)
Prints a plot or saves it in a le using various printer specic formats.(p. 54)
A\B
b/A
B/A
A.*B
A. p
p. A
A. B
A./B
B.\A
148
Elementary Matrices
eye
false
ones
rand
randn
randperm(n)
speye
sprand
sprandsym
sprandn
true
zeros
Specialized Matrices
hilb
vander
The
The
The
The
149
Manipulating Matrices
cat
clear
diag
fliplr
flipud
ipermute
permute
spdiags
repmat
toeplitz
bsxfun
reshape
rot90
squeeze
triu
tril
[]
150
Two-Dimensional Graphics
plot
fill
semilogx
semilogy
loglog
ezplot
polar
ezpolar
linspace
xlabel
ylabel
title
axis
hold
hist
hist
errorbar
subplot
shg
Three-Dimensional Graphics
plot3
ezplot3
fill3
mesh
ezmesh
surf
ezsurf
view
meshgrid
ndgrid
pol2cart
zlabel
axis
contour
contourf
ezcontour
contour3
ezcontour3
clabel
subplot
colorbar
colormap
shg
drawnow
151
152
min
mean
norm
prod
sort
std
sum
153
xor
&&
||
<
<=
==
>
>=
=
strcmp
Flow Control
break
case
continue
else
elseif
end
error
for
if
otherwise
switch
while
Logical Functions
all
any
exist
isequal
find
ischar
isempty
isfinite
isinf
islogical
isnan
logical
True if all the elements of a vector are true; operates on the columns of a matrix.(p. 96)
True if any of the elements of a vector are true; operates on the columns of a matrix.(p. 96)
False if this name is not the name of a variable or a le.(p. 96)
Tests if two (or more) arrays have the same contents.(p. 96)
The indices of a vector or matrix which are nonzero.(p. 96)
True if a vector or array contains character elements.(p. 96)
True if the matrix is empty, i.e., []. (p. 96)
Generates a matrix with 1 in all the elements which are nite (i.e., not Inf or
NaN ) and 0 otherwise.(p. 96)
Generates a matrix with 1 in all the elements which are Inf and 0 otherwise.(p. 96)
True for a logical variable or array.(p. 96)
Generates a matrix with 1 in all the elements which are NaN and 0 otherwise.(p. 96)
Converts a numeric variable to a logical one.(p. 96)
154
Debugging Commands
keyboard
dbstep
dbcont
dbstop
dbclear
dbup
dbdown
dbstack
dbstatus
dbtype
dbquit
return
155
Non-sti ode solver; fourth-order, one-step method for the ode y = f(t, y).
(p. 116)
Non-sti ode solver; second-order, one-step method.(p. 116)
Non-sti ode solver; variable-order, multi-step method.(p. 116)
Sti ode solver; variable-order, multi-step method.(p. 116)
Sti ode solver; second-order, one-step method.(p. 116)
Sti ode solver; trapezoidal method.(p. 116)
Sti ode solver; second-order, one-step method.(p. 116)
Sti ode solver; variable-order, multi-step method for the fully implicit ode
f(t, y, y ) = 0. (p. 125)
Assigns values to properties of the ode solver.(p. 120)
Boundary-Value Solver
bvp4c
bvpinit
deval
Numerically solves y (x) = f(x, y) for x [a, b] with given boundary conditions
and an initial guess for y. (p. 129)
Calculates the initial guess either by giving y directly or by using a function
y = initial guess function(x). (p. 129)
Interpolate to determine the solution desired points.(p. 129)
quadl
156
Matrix Functions
expm
funm
logm
sqrtm
157
158
Solutions To Exercises
These are the solutions to the exercises given in subsections 1.9, 2.10, 3.6, and 4.7.
1.9.1a)
>
>
>
>
or
>
>
answer:
b)
c = sqrt(a 2
6.1751
b 2
- 2*a*b*cosd(ab))
>
> format long
>
> c
answer: 6.175085147187636
c)
>
>
>
>
format short e
asin( (b/c)*sin(ab*deg) ) / deg
or
>
> asind( (b/c)*sind(ab) )
answer: 4.9448e+01
d)
1.9.2)
1.9.3)
>
>
diary
triangle.ans
>
> (1.2e20 - i*12 20) (1/3)
answer: 1.3637e+07 - 7.6850e+06i
>
>
>
>
>
>
>
>
A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
A = [1:4; 5:8; 9:12; 13:16]
A = [ [1:4:13] [2:4:14] [3:4:15] [4:4:16] ]
b)
>
>
2.10.2)
>
>
2.10.3)
>
>
2.10.4a)
>
>
b)
>
>
A = A - tril(A,-1)
2.10.5)
>
>
x = [0:30] . 2
2.10.6a)
>
>
R = rand(5)
b)
>
>
c)
>
>
mean(mean(R))
d)
e)
>
>
>
>
S = sin(R)
r = diag(R)
2.10.7a)
>
>
>
>
>
>
A = [1 2 3; 4 5 6; 7 8 10]
B = A .5
% or B = sqrtm(A)
C = A. .5
% or C = sqrt(A)
>
>
>
>
A A -
b)
% or
% or
x = [0:30]. 2
mean(R(:))
B 2
C. 2
159
Solutions To Exercises
3.6.1)
3.6.2a)
>
> s1.name = Alfonso Bedoya
>
> s1.rank = bandit
>
> s1.serial number = 1
>
> s2 = struct( name , Alfonso Bedoya , rank ,
serial number , 1)
>
> s1.serial number = s1.serial number + 1
bandit ,
>
>
>
>
>
>
>
>
>
>
>
>
c{1,1}=
c{2,1}=
c{1,2}=
c{2,2}=
c{1,3}=
c{2,3}=
b)
>
>
>
>
c{1,1}(1,2)
c{2,2}(5)
3.6.3a)
>
>
b)
>
>
c)
>
>
4.7.1a)
>
>
>
>
>
>
b)
>
>
>
>
>
>
z = 1 + x + x. 2 /2 + x. 6 /6
hold on
plot(x, z)
c)
>
>
plot(x, y-z)
d)
>
>
>
>
>
>
>
>
>
>
>
>
hold off
plot(x, y, r , x, z, g , x, y-z,
axis equal
xlabel( x )
ylabel( y )
title( e i\pi = -1 is profound )
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
subplot(2, 1,
hold off
plot(x, y, r
axis equal
xlabel( x )
ylabel( y )
title( e i\pi
subplot(2, 1,
plot(x, y-z)
>
>
>
>
>
>
>
>
>
>
x = linspace(-3, 3, 91);
y = x;
[X, Y] = meshgrid(x, y);
% or just do [X, Y] = meshgrid(x, x);
Z = (X. 2 + 4* Y. 2) .* sin(2*pi*X) .* sin(2*pi*Y);
surf(X, Y, Z);
e)
4.7.2a)
rand(5)
uniform
pi 10
@(x) sin(exp(x))
c{1,2} 2
true
m )
1)
, x, z,
g )
= -1 is profound )
2)
160
Solutions To Exercises
% or
view([63 66])
4.7.3) x is a row vector containing all the points at which the function is to be evaluated. c is
a column vector of the speeds. We can consider these to be the horizontal and vertical
n
axes in two dimensions. We dene h(x, c, t) = f (x ct) so that g(x, t) = k=1 h(x, ck , t).
meshgrid then turns these vectors into a mesh so that h(xj , ci , t) is evaluated by
h(X(i, j), C(i, j), t), where i refers to the vertical axis and j the horizontal one. (Since the
matrices X and C never change, they would not need to be actual arguments to h.) Thus,
h(t) (short for h(X, C, t) ) is a matrix whose (i, j)th element is f (xj ci t). We need to
multiply this by ai and then sum over i. This is done by multiplying the matrix R, whose
(i, j)th element is ai , elementwise by the matrix h(X, C, t). The sum command then adds all
the rows in each column.
161
Solutions To Exercises
162
ASCII Table
ASCII Table
Octal
Decimal
000
001
002
003
004
005
006
007
010
011
012
013
014
015
016
017
020
021
022
023
024
025
026
027
030
031
032
033
034
035
036
037
040
041
042
043
044
045
046
047
050
051
052
053
054
055
056
057
060
061
062
063
064
065
066
067
070
071
072
073
074
075
076
077
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Control
Sequence
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
Description
Octal
Decimal
Null character
Start of header
Start of text
End of text
End of transmission
Enquiry
Acknowledgment
Bell
Backspace
Horizontal tab
Line feed
Vertical tab
Form feed
Carriage return
Shift out
Shift in
Data link escape
Device control 1 (often XON)
Device control 2
Device control 3 (often XOFF)
Device control 4
Negative acknowledgement
Synchronous idle
End of transmissions block
Cancel
End of medium
Substitute
Escape
File separator
Group separator
Record separator
Unit separator
Space
!
Double quote
# Numer sign
$
Dollar sign
% Percent
& Ampersand
100
101
102
103
104
105
106
107
110
111
112
113
114
115
116
117
120
121
122
123
124
125
126
127
130
131
132
133
134
135
136
137
140
141
142
143
144
145
146
147
150
151
152
153
154
155
156
157
160
161
162
163
164
165
166
167
170
171
172
173
174
175
176
177
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
Control
Sequence
Description
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
AT symbol
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
Left bracket
Back slash
Right bracket
Caret
Underscore
Opening single quote
Left brace
Vertical bar
Right brace
Tilde
Delete
American Standard Code for Information Interchange (ASCII) species a correspondence between bit patterns and character symbols. The octal and decimal representations of the bit patterns are shown along
163
ASCII Table
with a description of the character symbol. The rst 32 codes (numbers 031 decimal) as well as the last
(number 127 decimal) are non-printing characters which were initially intended to control devices or provide meta-information about data streams. For example, decimal 10 ended a line on a line printer and
decimal 8 backspaced one character so that the preceding character would be overstruck. The control
sequence column shows the traditional key sequences for inputting these non-printing characters where
the caret ( ) represents the Control or Ctrl key which must be held down while the following key is
depressed.
164
Index
In this index MATLAB commands come rst, followed by symbols, and then followed by the function m-les and
named script les which are coded in this tutorial and contained in the corresponding zip le. Only then does the
index begin with the letter A.
Note: All words shown in typewriter font are MATLAB commands or predened variables unless it is specically
stated that they are dened locally (i.e., in this document).
Note: If an item is a primary topic of a section, an appendix, or a subsection, this is indicated as well as the page
number (in parentheses).
Note: When an item appears in a box at the end of a subsection, or in the reference tables in the appendix, it is
underlined.
MATLAB functions
abs, 13, 14, 147
acos, 13, 147
acosd, 13, 147
acosh, 13, 147
acot, 13, 147
acotd, 13, 147
acoth, 13, 147
acsc, 13, 147
acscd, 13, 147
acsch, 13, 147
addframe, 74, 152
addpath, 98, 108, 150
all, 34, 95, 96, 154
angle, 14, 147
any, 34, 95, 96, 154
asec, 147
asecd, 147
asech, 147
asin, 13, 147
asind, 13, 147
asinh, 13, 147
atan, 13, 147
atan2, 13, 147
atand, 13, 147
atanh, 13, 147
avifile, 74, 152
axis, 50, 55, 58, 62, 151
ballode, 120
break, 91, 92, 154
bsxfun, 25, 26, 150
bvp4c, 126, 127, 129, 156
bvpinit, 127, 129, 156
case, 92, 154
dierent than in C, 92
cat, 36, 150
caxis, 61, 62, 152
ceil, 13, 147
cell, 42, 44, 45, 152
celldisp, 42, 44, 152
char, 45
chol, 82, 88, 153
clabel, 56, 58, 151
class, 45, 46, 152
classdef, 46
clear, 9, 12, 32, 150
danger in using, 9
clf, 60, 62, 152
close, 60, 74, 152
colorbar, 60, 62, 151
colormap, 60, 62, 151
cond, 78, 82, 88, 153
condest, 83, 88, 153
conj, 14, 147
continue, 91, 92, 154
contour, 56, 58, 151
contour3, 56, 58, 151
contourf, 57, 58, 61, 151
cos, 13, 147
cosd, 13, 147
cosh, 13, 147
cot, 13, 147
cotd, 13, 147
coth, 13, 147
cputime, 29, 148, 150
csc, 13, 147
cscd, 13, 147
csch, 13, 147
csvread, 53, 54, 80, 148
csvwrite, 53, 54, 80, 148
cumprod, 34, 35, 153
cumsum, 34, 35, 153
dbclear, 101, 155
dbcont, 101, 155
dbdown, 101, 155
dblquad, 134, 135, 156
dbquit, 101, 155
dbstack, 101, 155
dbstatus, 101, 155
dbstep, 101, 155
dbstop, 101, 155
dbtype, 101, 155
dbup, 101, 155
demo, 3, 16, 47, 58, 62, 146, 152
det, 83, 88, 153
deval, 127, 129, 156
diag, 23, 26, 150
diary, 6, 7, 148
diff, 34, 35
165
disp, 8, 9, 41, 81
doc, 4, 16, 146
double, 45
drawnow, 50, 55, 151
echo, 100, 107, 155
edit, 15
eig, 30, 84, 88, 99, 153
eigs, 84, 88, 153
else, 90, 92, 154
elseif, 90, 92, 154
end, 22, 88, 89, 91, 92, 104, 107, 154, 155
error, 99, 107, 154, 155
errorbar, 52, 55, 151, 153
eval, 108, 109, 155
events, 46
exist, 96, 154
exp, 13, 14, 147
expm, 142, 143, 157
expm1, 12, 13
eye, 20, 21, 149
ezcontour, 57, 58, 151
ezcontour3, 57, 58, 151
ezmesh, 57, 58, 151
ezplot, 51, 55, 151
ezplot3, 56, 58, 151
ezpolar, 51, 55, 151
ezsurf, 57, 58, 151
factorial, 11, 13, 147
false, 91, 92, 149
fclose, 81, 82, 148
feval, 108, 109, 111, 155
fft, 137, 141, 155
fftshift, 138, 140, 141, 155
fieldnames, 44, 152
figure, 59, 62, 152
fill, 60, 61, 62, 151
fill3, 60, 61, 62, 151
find, 94, 96, 113, 114, 154, 156
fix, 13, 147
fliplr, 24, 26, 150
flipud, 24, 26, 150
floor, 13, 147
fminbnd, 133, 135, 156
fminsearch, 133, 135, 156
fopen, 81, 82, 148
for, 22, 88, 92, 154
format, 11, Subsect. 2.6 (30), 146
fplot, 39, 50, 62, 152
fprintf, 8, 41, 53, 80, 82, 148
fscanf, 53, 80, 82, 148
full, 112, 114, 156
function, 96, 104, 107, 155
function handle, 45
funm, 142, 143, 157
fzero, 132, 133, 135, 156
gca, 64, 152
gcf, 64, 152
get, 63, 64, 152
getfield, 44, 152
getframe, 74, 152
ginput, 58, 62, 152
166
167
uint32, 45
uint64, 45
uipanel, 67, 70, 152
uiresume, 70, 152
uiwait, 70, 152
vander, 130, 132, 149
varargin, 104, 107, 155
varargout, 104, 107, 155
vectorize, 39
view, 56, 58, 151
while, 22, 91, 92, 154
who, 16, 146
whos, 16, 146
xlabel, 51, 55, 59, 63, 151
xor, 90, 91, 93, 154
ylabel, 51, 55, 59, 63, 151
zeros, 20, 21, 149
zlabel, 56, 58, 63, 151
Symbols
+, 7, 26, 29, 145, 148
exception to, 28
-, 7, 26, 29, 145, 148
*, 7, 26, 27, 29, 145, 148
.*, 27, 29, 145, 148
/, 7, 27, 29, 145, 148
warning about matrix division, 27
./, 28, 29, 145, 148
\, 7, 29, 75, 76, 79, 80, 145, 148
.\, 28, 29, 148
, 6, 7, 27, 29, 145, 148
. , 28, 29, 148
, 7, 19, 21, 149
. , 19, 21, 149
..., 14, 15, 145
%, 15, 145
,, 7, 9, 18, 26, 145
;, 7, 9, 18, 26, 145
:, 19, Subsect. 2.2 (21), Subsect. 2.3 (22), 26, 145
<, 90, 154
<=, 90, 154
>, 90, 154
>=, 90, 154
==, 90, 154
=, 90, 154
&, 90, 91, 93, 154
&&, 91, 154
|, 90, 91, 93, 154
||, 91, 154
, 90, 91, 93, 154
!, See factorial
[], 25, 26, 32, 150
@, 39
up-arrow key, 6, 7, 145
61
A
AH , See Conjugate transpose
AT , See Transpose
A+ , See Matrix, pseudoinverse of
Abort statement, 15
abs, 13, 14, 147
Accuracy, 11
principle, 11
acos, 13, 147
acosd, 13, 147
acosh, 13, 147
acot, 13, 147
acotd, 13, 147
acoth, 13, 147
acsc, 13, 147
acscd, 13, 147
acsch, 13, 147
addframe, 74, 152
addpath, 98, 108, 150
all, 34, 95, 96, 154
AND (logical operator), 90, 91, 93, 154
angle, 14, 147
Anonymous functions, See Function
ans, 8, 9, 146
any, 34, 95, 96, 154
Arithmetic progression, 21
Arithmetical operations, Subsect. 1.1 (6), Subsect. 2.4
(26), 145
+, 7, 26, 29, 145, 148
exception to, 28
168
B
Ball, 122124
ballode, 120
Bessels equation, See Initial-value ordinary dierential
equations
Binary format, 16, 53
Boundary-value ordinary dierential equations, Sect. 11
(125), 129, 156
continuation method, 128
break, 91, 92, 154
bsxfun, 25, 26, 150
bvp4c, 126, 127, 129, 156
bvpinit, 127, 129, 156
C
15, 16, 146
C,(programming language),
C
169
disp, 8, 9, 41, 81
Display
formatting the, Subsect. 1.4 (11)
misinterpreting, Subsect. 2.6 (30)
suppressing, 7, 9, 18, 26, 145
variable, 8, 9, 81
See also disp and fprintf
doc, 4, 16, 146
Documentation (MATLAB), 15
Dot product, 28
double, 45
drawnow, 50, 55, 151
Dungs equation, See Initial-value ordinary
dierential equations
D
Data
best polynomial t to, 129
closing les, 81
manipulation, Subsect. 2.8 (32), 153
opening les, 81
reading into MATLAB, 52, 53, 54, 80, 114, 148
writing from MATLAB, 52, 54, 80, 148
Data types, 38, Subsect. 3.5 (44)
fundamental
fundamental (table), 45
dbclear, 101, 155
dbcont, 101, 155
dbdown, 101, 155
dblquad, 134, 135, 156
dbquit, 101, 155
dbstack, 101, 155
dbstatus, 101, 155
dbstep, 101, 155
dbstop, 101, 155
dbtype, 101, 155
dbup, 101, 155
Debugging m-les, See Function m-le and Script m-le
demo, 3, 16, 47, 58, 62, 146, 152
Demonstration program, 3, 16, 58, 62
det, 83, 88, 153
Determinant, 83
deval, 127, 129, 156
diag, 23, 26, 150
Diagonals, See Matrix
diary, 6, 7, 148
diff, 34, 35
Digits of accuracy, 11
ez , 14
Earth, 62
echo, 100, 107, 155
edit, 15
eig, 30, 84, 88, 99, 153
Eigenvalues, 30, 82, 84, 87, 99
denition of, 84
Eigenvectors, 84, 87, 99
eigs, 84, 88, 153
else, 90, 92, 154
elseif, 90, 92, 154
end, 22, 88, 89, 91, 92, 104, 107, 154, 155
eps, 9, 10, 11, 91, 146
See also Machine epsilon
Erase (a gure), 60
See also clf
error, 99, 107, 154, 155
Error bars, 52
errorbar, 52, 55, 151, 153
Euclidean length, See Length of a vector
eval, 108, 109, 155
events, 46
EXCLUSIVE OR (logical operator), 91, 93, 154
exist, 96, 154
exp, 13, 14, 147
expm, 142, 143, 157
expm1, 12, 13
Exponentiation, 6, 7, 27
Extrapolation, 130
See also Interpolation
eye, 20, 21, 149
ezcontour, 57, 58, 151
ezcontour3, 57, 58, 151
ezmesh, 57, 58, 151
ezplot, 51, 55, 151
ezplot3, 56, 58, 151
ezpolar, 51, 55, 151
ezsurf, 57, 58, 151
F
factorial, 11, 13, 147
Factorial function, 11
false, 91, 92, 149
170
Function (cont.)
inline, 39
warning, 39
input and output arguments, 96, 101102
grouping together, 104
pass by reference, 97
pass by value, 97
variable number of, 99
name of, 14
warning about user-dened m-les, 14
nested, 97, 104
order in which MATLAB searches for functions, 97,
106
passing arguments indirectly, See Closure
passing function name in argument list, Subsect. 3.2
(39), 108, 109
primary, 104
private, 106
return, 99, 101, 107, 155
saving parameters in, 102104
subfunctions in, 97, 104
Function handle, 38, 39, 43
function handle, 45
Function m-le, Subsect. 8.3 (96)
debugging, 100, 101
names of, 96
passing name into, 39
recursive, 107
Functions (mathematical)
See also Polynomials
common mathematical, Subsect. 1.5 (11)
denite integrals of, 134
hijacked, 106
local minimum of, 133
numerical operations on, 132, 135, 156
zeroes of, 132, 133
funm, 142, 143, 157
fzero, 132, 133, 135, 156
G
Gauss-Kronrod quadrature (for numerical integration),
134
Gauss-Lobatto quadrature (for numerical integration),
134
Gaussian elimination, 75, 79
gca, 64, 152
gcf, 64, 152
Generalized eigenvalue problem, 84
get, 63, 64, 152
getfield, 44, 152
getframe, 74, 152
ginput, 58, 62, 152
global, 102, 107, 155
Graphics, Sect. 4 (47)
advanced techniques, Subsect. 4.3 (58), 152
changing endpoints, 50
customizing lines and markers, 48
demonstration, 47
handle, Subsect. 4.4 (62)
holding the current plot, 48
171
Graphics (cont.)
labelling, 5862
text properties, 63
using TEX commands, 59, 64
multiple plots, 50
multiple windows, 59
object, 63
handle for an, 63
printing, 53, 54, 148
properties, Subsect. 4.4 (62)
saving to a le, 53, 54, 148
three-dimensional, Subsect. 4.2 (56)
two-dimensional, Subsect. 4.1 (47), 151
window, 47
Gravity, 123
gtext, 59, 60, 62, 63, 152
GUI (Graphical User Interface), Subsect. 4.5 (64)
guide, 65, 70, 152
H
H
I
I, See Identity matrix
i, 6, 9, 146
Identity matrix, 20
See also eye
if, 22, 89, 92, 154
ifft, 138, 141, 155
ifftshift, 138, 140, 141, 155
imag, 14, 147
image, 62, 152
Imaginary numbers, 6, 9, 146
Inf, 9, 50, 146
Initial-value ordinary dierential equations,
(114)
Bessels equation, 124
Dungs equation, 114122
rst-order system, 115
with constant coecients, 142
solvers, 115, 116, 156
absolute error, 115
adaptive step size, 115
J
j, 6, 9, 146
Java (programming language), 108
Sect. 10
K
keyboard, 101, 155
Keywords, 8
L
lasterr, 108, 109, 111, 155
172
M
M-les, 96
See also Function m-le and Script m-le
Machine epsilon (eps), 9, 146
calculation of, 91
Mathematical functions, Subsect. 1.5 (11), 14, Subsect.
2.7 (32), 147
Matrix
augmented, 7477
is not a matrix, 75
Cholesky decomposition, 82
condition number, 82
approximation to, 83
Matrix (cont.)
defective, 84
deleting rows or columns, 25
determinant of, See Determinant
diagonals of, 23, 112, 113
elementary, 21, 149
elementary operations, 149
empty, See null (below)
extracting submatrices, 22
full, 111
generating, Subsect. 2.1 (18), Subsect. 2.3 (22)
by submatrices, 20
individual elements, 19
Hermitian, 19
Hilbert, See Hilbert matrix
identity, 20
inverse of, 85
Jacobian, 117, 122
lower triangular part of, 24, 85
unit, 85
LU decomposition, 85
manipulation, Subsect. 2.3 (22), 150
masking elements of, 95
maximum value, 33
minimum value, 33
multidimensional, Subsect. 2.9 (35)
null, 25, 26, 32, 150
orthogonal, 86
positive denite, 114
preallocation of, 20, 42, 98
pseudoinverse of, 79, 87
QR decomposition, 86
replicating, 25
reshaping, 23, 24
singular, 76, 77, 78, 82, 83
warning of, 85
singular value decomposition, 87
sparse, Sect. 9 (111), 156
specialized, 149
sum of elements, 33
SVD, See singular value decomposition (above)
symmetric, 18, 114
Toeplitz, 24
tridiagonal, 83, 111
unitary, 86
upper triangular part of, 24
Vandermonde, See Vandermonde matrix
max, 32, 35, 153
Maximum value, 32
mean, 33, 35, 153
Mean value, 33
Memory (of variables), 32
mesh, 56, 58, 60, 151
meshgrid, 56, 57, 58, 151
methods, 46
min, 33, 35, 153
Minimum value, 33
mod, 13, 147
Monotonicity, test for, 34
Monty Python, 40
Moore-Penrose conditions, 80
173
N
NaN, 9, 146
nargin, 99, 107, 155
nargout, 99, 107, 155
ndgrid, 57, 58, 151
Newtons laws, 122
nnz, 113, 114, 156
norm, 34, 35, 85, 88, 99, 153
Norm
matrix, 85
Frobenius, 86
p -norm, 86
vector, 85
NOT (logical operator), 90, 91, 93, 154
Notation (for vectors and matrices), 5
null, 86, 88, 153
Null matrix, 25, 26, 150
Null space, 86
num2str, 40, 41, 54, 81, 152
O
Ode, See Initial-value ordinary dierential equations
ode15i, 124, 125, 156
ode15s, 116, 156
ode23, 116, 156
ode23s, 116, 156
ode23t, 116, 156
ode23tb, 116, 156
ode45, 116, 156
ode113, 116, 156
odeset, 119, 120, 124, 156
ones, 20, 21, 149
Operator precedence, Subsect. 2.5 (29)
optimset, 132, 135, 156
OR (logical operator), 90, 91, 93, 154
orderfields, 44, 152
Ordinary dierential equations, See Initial-value
ordinary dierential equations and Boundary-value
ordinary dierential equations
orth, 86, 88, 153
Orthonormal basis, 86
otherwise, 92, 154
Outer product, 28
Overdetermined system, See Linear system of equations
P
Parentheses, 10
path, 97, 108, 150
Path, See Search path
174
Q
qr, 86, 88, 153
QR decomposition, 86
quad, 134, 135, 156
quadgk, 134, 135, 156
quadl, 134, 135, 156
Quadratic polynomial, roots of,
Quote mark, 7
13
R
rand, 20, 21, 52, 78, 79, 149
randn, 20, 21, 52, 149
Random matrix, 20, 24, 78, 79, 114, 156
Random numbers, 20
Gaussian distribution, 20, 52
normal distribution, 20
pseudorandom numbers, 20
seed, 20
state, 20
uniform distribution, 20, 52
randperm, 20, 21, 149
rank, 87, 88, 153
Rank of matrix, 87
Rational approximation to oating-point number, 80,
150
rats, 80, 150
RCOND, 78, 83, 85
real, 14, 147
realmax, 9, 146
realmin, 9, 10, 146
Recursion, 107
Reduced row echelon form, 75
round-o errors in, 77
Relational operators, 90, 154
<, 90, 154
<=, 90, 154
>, 90, 154
>=, 90, 154
==, 90, 154
=, 90, 154
matrix, Subsect. 8.2 (93)
result of, 93
rem, 13, 147
Remainder, 13, 147
repmat, 25, 26
Request input, 10
S
save, 16, 146
Save terminal commands, 6
Save work, 6
saveas, 74, 152
Scientic notation, 6
Scope, See Variables
Script m-le, 14, 97, 100
debugging, 100, 101
names of, 14
Search path, 97, 106
sec, 13, 147
secd, 13, 147
sech, 13, 147
semilogx, 50, 55, 151
semilogy, 50, 55, 151
set, 63, 64, 152
setfield, 44, 152
shg, 49, 55, 151, 152
sign, 13, 147
Simpsons method (of numerical integration),
sin, 13, 147
sin z, 14
sind, 13, 147
single, 45
Singular value decomposition, 87
sinh, 13, 147
size, 20, 21, 149
sort, 34, 35, 153
Sort numbers, 34
sparse, 112, 113, 114, 156
spconvert, 114, 156
spdiags, 112, 114, 156
dierences from diag, 113
speye, 114, 149, 156
spfun, 114, 156
spline, 131, 132, 157
Splines, See Interpolation
sprand, 113, 114, 149, 156
sprandn, 113, 114, 149, 156
sprandsym, 114, 149
sprintf, 41, 152
specications (format), 81
spy, 114, 156
sqrt, 13, 32, 147
sqrtm, 27, 142, 143, 157
squeeze, 36, 150
sscanf, 41, 152
specications (format), 81
175
134
U
stairs, 52, 55, 151
Stairstep graph, 52
Standard deviation, 33
Statements
executing in text variables, 108
rerunning previous, 10
separating on a line, 7, 9, 18, 26, 145
std, 33, 35, 153
Step function, plotting a, 52
Sti ode, 116, 122
str2num, 41, 152
strcmp, 89, 90, 152, 154
String, See Character string
struct, 43, 44, 45, 152
Structure, 38, 42, 132
equal (are two structures), 95
eld, 42
Subfunctions, See Function m-le
subplot, 50, 55, 58, 151
warning, 50
sum, 35, 93, 153
surf, 56, 58, 60, 151
Surface plot, 56
changing view, 56
lled-in, 56
wire-frame, 56
svd, 87, 88, 153
SVD, See Singular value decomposition
switch, 22, 91, 92, 154
T
T
, See Transpose
tan, 13, 147
tand, 13, 147
tanh, 13, 147
Taylor series expansion, 141
TEX, See Character string
text, 59, 60, 62, 63, 152
Text properties, 63
Text window, 47
tic, 29, 148, 150
Time, See cputime and tic and toc
title, 51, 55, 63, 151
multiline, See Character string, multiline
Title
for entire gure, 64
Toeplitz matrix, See Matrix
toeplitz, 24, 26, 150
toc, 29, 148, 150
Transpose, 19, 21, 149
conjugate, 19, 21, 149
Trigonometric functions, Subsect. 1.5 (11), Subsect. 2.7
(32)
tril, 24, 26, 150
triplequad, 134
triu, 24, 26, 150
true, 91, 92, 149
TRUE (result of logical expression), 90
type, 14, 15, 16, 97, 104, 146
V
Van der Pols equation, See Initial-value ordinary
dierential equations
vander, 130, 132, 149
Vandermonde matrix, 130
varargin, 104, 107, 155
varargout, 104, 107, 155
Variables, Subsect. 1.2 (7)
about, 9
case sensitive, 9
conict between variable and function name, 12
dened, 96
deleting, 9
global, 102
inputting, 10
list of, 16
loading, 16
local, 96, 101, 102
logical, 95
modifying, 102
overwriting, 7
persistent, 102
predened, 8, 9, 146
ans, 8, 9, 146
eps, 9, 10, 11, 91, 146
i, 6, 9, 146
Inf, 9, 50, 146
j, 6, 9, 146
NaN, 9, 146
overwriting, 8, 89
pi, 8, 9, 146
realmax, 9, 146
realmin, 9, 10, 146
saving, 16
saving local variables in functions, 102
scope of, 105
special cases of vectors or matrices, 7
static, 102
string, 7, Subsect. 3.3 (40)
See also Character string
typeless, 8, 102
valid names, 8
Vector
average value of elements, 33
column vs. row, 17
deleting elements, 25
equal (are two vectors), 95
176
Vector (cont.)
generating, Subsect. 2.1 (18)
individual elements, 19
masking elements of, 95
maximum value, 32
mean value of elements, 33
minimum value, 33
preallocation of, 20, 42, 98
repeated elements, testing for, 34
sort elements, 34
standard deviation of elements, 33
sum of elements, 33
vectorize, 39
Vectorizing code, Subsect. 8.5 (109)
prole execution time, 109
view, 56, 58, 151
W
while, 22, 91, 92, 154
who, 16, 146
whos, 16, 146
Workspace, 6, 101
X
xlabel, 51, 55, 59, 63, 151
xor, 90, 91, 93, 154
Y
ylabel, 51, 55, 59, 63, 151
Z
zeros, 20, 21, 149
zlabel, 56, 58, 63, 151
177
Index
178