Matlab
Matlab
A MATLAB Tutorial
Ed Overman
Department of Mathematics
The Ohio State University
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
1 Scalar Calculations . . . . . . . . . . . . . . . . . . . . . . 6
1.1 Simple Arithmetical Operations . . . . . . . . . . . . . . . . . 6
1.2 Variables . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3 Round-off Errors . . . . . . . . . . . . . . . . . . . . . . 9
1.4 Formatting Printing . . . . . . . . . . . . . . . . . . . . . 10
1.5 Common Mathematical Functions . . . . . . . . . . . . . . . . 11
1.6 Complex Numbers . . . . . . . . . . . . . . . . . . . . . 13
1.7 Script M-files . . . . . . . . . . . . . . . . . . . . . . . 13
1.8 Help! . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.9 Be Able To Do . . . . . . . . . . . . . . . . . . . . . . 16
2 Arrays: Vector and Matrix Calculations . . . . . . . . . . . . . . . 16
2.1 Generating Matrices . . . . . . . . . . . . . . . . . . . . . 17
2.2 The Colon Operator . . . . . . . . . . . . . . . . . . . . . 21
2.3 Manipulating Matrices . . . . . . . . . . . . . . . . . . . . 21
2.4 Simple Arithmetical Operations . . . . . . . . . . . . . . . . . 26
2.5 Operator Precedence . . . . . . . . . . . . . . . . . . . . 29
2.6 Be Careful! . . . . . . . . . . . . . . . . . . . . . . . 30
2.7 Common Mathematical Functions . . . . . . . . . . . . . . . . 31
2.8 Data Manipulation Commands . . . . . . . . . . . . . . . . . 32
2.9 Advanced Topic: Multidimensional Arrays . . . . . . . . . . . . . . 34
2.10 Be Able To Do . . . . . . . . . . . . . . . . . . . . . . 35
3 Anonymous Functions, Strings, and Other Data Types . . . . . . . . . . 36
3.1 Anonymous Functions . . . . . . . . . . . . . . . . . . . . 37
3.2 Passing Functions as Arguments to Commands . . . . . . . . . . . . 38
3.3 Strings . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.4 Cell Arrays and Structures . . . . . . . . . . . . . . . . . . . 40
3.5 Advanced Topic: Data Types and Classes . . . . . . . . . . . . . . 43
3.6 Be Able To Do . . . . . . . . . . . . . . . . . . . . . . 45
4 Graphics . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1 Two-Dimensional Graphics . . . . . . . . . . . . . . . . . . . 45
4.2 Three-Dimensional Graphics . . . . . . . . . . . . . . . . . . 55
4.3 Advanced Topic: Commands . . . . . . . . . . . . . . . . . . 57
4.4 Advanced Topic: Handles and Properties . . . . . . . . . . . . . . 61
4.5 Advanced Topic: GUIs (Graphical User Interfaces) . . . . . . . . . . . 63
4.6 Advanced Topic: Making Movies . . . . . . . . . . . . . . . . . 69
4.7 Be Able To Do . . . . . . . . . . . . . . . . . . . . . . 73
5 Solving Linear Systems of Equations . . . . . . . . . . . . . . . . 73
5.1 Square Linear Systems . . . . . . . . . . . . . . . . . . . . 74
5.2 Catastrophic Round-Off Errors . . . . . . . . . . . . . . . . . 77
5.3 Overdetermined and Underdetermined Linear Systems . . . . . . . . . . 78
6 File Input-Output . . . . . . . . . . . . . . . . . . . . . . 79
7 Some Useful Linear Algebra Commands . . . . . . . . . . . . . . . 81
8 Programming in MATLAB . . . . . . . . . . . . . . . . . . . 87
8.1 Flow Control and Logical Variables . . . . . . . . . . . . . . . . 87
8.2 Matrix Relational Operators and Logical Operators . . . . . . . . . . . 92
8.3 Function M-files . . . . . . . . . . . . . . . . . . . . . . 95
8.4 Odds and Ends . . . . . . . . . . . . . . . . . . . . . . 107
8.5 Advanced Topic: Vectorizing Code . . . . . . . . . . . . . . . . 108
9 Sparse Matrices . . . . . . . . . . . . . . . . . . . . . . . 110
10 Initial-Value Ordinary Differential Equations . . . . . . . . . . . . . 113
10.1 Basic Commands . . . . . . . . . . . . . . . . . . . . . . 113
10.2 Advanced Commands . . . . . . . . . . . . . . . . . . . . 118
11 Boundary-Value Ordinary Differential Equations . . . . . . . . . . . 124
12 Polynomials and Polynomial Functions . . . . . . . . . . . . . . . 128
13 Numerical Operations on Functions . . . . . . . . . . . . . . . . 130
14 Discrete Fourier Transform . . . . . . . . . . . . . . . . . . . 133
15 Mathematical Functions Applied to Matrices . . . . . . . . . . . . . 140
Appendix: Reference Tables . . . . . . . . . . . . . . . . . . . . 143
Arithmetical Operators . . . . . . . . . . . . . . . . . . . . . 143
Special Characters . . . . . . . . . . . . . . . . . . . . . . . 143
Getting Help . . . . . . . . . . . . . . . . . . . . . . . . 144
Predefined Variables . . . . . . . . . . . . . . . . . . . . . . 144
Format Options . . . . . . . . . . . . . . . . . . . . . . . . 144
Some Common Mathematical Functions . . . . . . . . . . . . . . . . 145
Input-Output Functions . . . . . . . . . . . . . . . . . . . . . 146
Arithmetical Matrix Operations . . . . . . . . . . . . . . . . . . . 146
Elementary Matrices . . . . . . . . . . . . . . . . . . . . . . 147
Specialized Matrices . . . . . . . . . . . . . . . . . . . . . . 147
Elementary Matrix Operations . . . . . . . . . . . . . . . . . . . 147
Manipulating Matrices . . . . . . . . . . . . . . . . . . . . . . 148
Odds and Ends . . . . . . . . . . . . . . . . . . . . . . . . 148
Two-Dimensional Graphics . . . . . . . . . . . . . . . . . . . . 149
Three-Dimensional Graphics . . . . . . . . . . . . . . . . . . . . 149
Advanced Graphics Features . . . . . . . . . . . . . . . . . . . . 150
String Functions, Cell Arrays, Structures, and Classes . . . . . . . . . . . . 150
Data Manipulation Commands . . . . . . . . . . . . . . . . . . . 151
Some Useful Functions in Linear Algebra . . . . . . . . . . . . . . . . 151
Logical and Relational Operators . . . . . . . . . . . . . . . . . . 151
Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 152
Logical Functions . . . . . . . . . . . . . . . . . . . . . . . 152
Programming Language Functions . . . . . . . . . . . . . . . . . . 153
Debugging Commands . . . . . . . . . . . . . . . . . . . . . . 153
Discrete Fourier Transform . . . . . . . . . . . . . . . . . . . . 153
Sparse Matrix Functions . . . . . . . . . . . . . . . . . . . . . 154
Time Evolution ODE Solvers . . . . . . . . . . . . . . . . . . . . 154
Boundary-Value Solver . . . . . . . . . . . . . . . . . . . . . 154
Numerical Operations on Functions . . . . . . . . . . . . . . . . . . 154
Numerical Operations on Polynomials . . . . . . . . . . . . . . . . . 155
Matrix Functions . . . . . . . . . . . . . . . . . . . . . . . 155
Solutions To Exercises . . . . . . . . . . . . . . . . . . . . . . 157
ASCII Table . . . . . . . . . . . . . . . . . . . . . . . . . 161
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
2
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 com-
plicated algorithms involving vectors and matrices.
• It can numerically solve nonlinear initial-value ordinary differential equations.
• It can numerically solve nonlinear boundary-value ordinary differential equations.
• It contains a wide variety of toolboxes which allow it to perform a wide range of applications from sci-
ence 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 program-
ming language, but as a powerful calculator that gives you fingertip access to exploring interesting prob-
lems in science, engineering, and mathematics. And this access is available by using only a small number
of commands and function† because MATLAB’s 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 difficult 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 op-
erations require the use of sophisticated software packages, which you have to find 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 find in a reference man-
ual, such as Mastering MATLAB 7 by Duane Hanselman and Bruce Littlefield (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 differential equations, mathematical modelling, and numerical analysis. It also includes an intro-
duction to two- and three-dimensional graphics because graphics is often the preferred way to present the
results of calculations.
In this tutorial MATLAB is first introduced as a calculator and then as a plotting package. Only after-
wards 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 com-
mands 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 fine 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.
3
they work. If an idea works, fine; if it doesn’t, investigate further and figure out why. Maybe you mis-
understood some MATLAB command, or maybe your idea needs some refinement. “Play around” in-
teractively and figure it out. There are no hard and fast rules for figuring it out — try things and see
what happens. Don’t be afraid to make mistakes; MATLAB won’t call you an idiot for making a mistake.
When you first learned to ride a bicycle, you fell down a lot — and you looked pretty silly. But you kept
at it until you didn’t fall down. You didn’t study Newton’s laws of motion and try to analyze the motion
of a bicycle; you didn’t take classes in how to ride a bicycle; you didn’t 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 de-
signed 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 sec-
tion 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 find and to understand. Next, we collect all the commands discussed in a sub-
section 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 HUGE 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 \use-
ful" 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 di-
mensions. 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 find any and
all solutions of Ax = b where A ∈ Cm×n need not be a square matrix; there might be no solutions, one
solution, or an infinite number to this linear system. When no solution exists, it discusses how to calcu-
late a least-squares solution (i.e., the “best” approximation to a solution). In addition, it discusses how
round-off errors can corrupt the solution, and how to determine if this is likely to occur.
4
Section 6 is quite brief and discusses advanced commands to input data into MATLAB and output it
to a file. (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 alge-
bra. 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 ele-
ment 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-files (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 affect 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 gener-
ate 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 differential equa-
tions. This section is divided up into a “basic” part and an “advanced” part. It often requires very little
effort to solve even complicated odes; when it does we discuss in detail what to do and provide a num-
ber of examples. Section 11 discusses how to use MATLAB to numerically solve boundary-value ordinary
differential equations.
Section 12 discusses how to numerically handle standard polynomial calculations such as evaluating
polynomials, differentiating polynomials, and finding 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 finding things that are “just on the tip of
your tongue”. All the MATLAB commands discussed here are listed at the beginning of the index, as well
as alphabetically throughout the index.
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 vec-
tor or matrix). In a linear algebra setting we always define 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 0 *y, i.e., x1 y1 + x2 y2 + · · · + xn yn (where “ 0 ” is the MATLAB
command to take the transpose of a real vector or matrix).
5
1. Scalar Calculations
1.1. Simple Arithmetical Operations
MATLAB can be used as a scientific 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
And
P12 ˆ
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 scientific notation using the “ ” operator. For example, you can enter
2×10−20 by
ˆ
>> 2*10 -20
ˆ
MATLAB, however, uses “e” to represent “10 ” so that MATLAB displays
2.0000e-20
ˆ
The “standard” way to input 2×10−20 is as 2e-20 or 2E-20 or 2.e-20 or 2.E-20 (even
2.0000000e-00020 is acceptable).
Warning: 10−20 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 5×1030 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 5×1030i ). 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 prob-
lems. 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 file, this archive is saved to the file diary (no extension) in the present direc-
tory. If the file already exists, this is appended to the end of the file (i.e., the file is not overwritten).
Because of this feature you can use the diary command without fear that crucial work will be overwrit-
ten.
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.
6
1.2. Variables
Arithmetical Operations
↑ The up-arrow key moves backward in the MATLAB workspace, one line at a time.
1.2. Variables
Notation: We always use lowercase letters to denote scalar variables.
Variables can be used to store numerical values. For example, you can store the value 21/3 in the vari-
able x by entering
>> x = 2 (1/3)
ˆ
This variable can then be used on the right-hand side of an equation such as
>> fx = 3*x 6 - 17*x 3 + 79
ˆ ˆ
There can also be more than one command on a line. For example, if you type
>> x = 2 (1/3); fx = 3*x 6 - 17*x 3 + 79; g = 3/fx;
ˆ ˆ ˆ
then all three commands will be executed. Nothing will be printed out because semicolons follow each
command. If you want everything printed out then type
>> x = 2 (1/3), fx = 3*x 6 - 17*x 3 + 79, g = 3/fx
ˆ ˆ ˆ
Thus, you can separate statements on a line by commas or semicolons. If semicolons are used, the results
of the statement are not displayed, but if commas are used, the results appear on the computer screen.
Warning: A variable can be overwritten at will. For example, at present x = 21/3 . If you now type
>> x = x + 5
then x becomes 21/3 + 5. No warning messages are printed if a variable is overwritten, just as
in a programming language.
Although we do not discuss vectors and matrices until the next section, it is important to understand
that MATLAB considers scalar variables to be vectors of length one or matrices of size 1×1. For exam-
ple, if you type
>> fx
the number 57 is returned. But you can also type
>> fx(1)
or
>> fx(1,1)
and obtain the same result.
Character strings can also be stored in variables. For example, to store the string “And now for some-
thing completely different” in a variable, enter
>> str = 0 And now for something completely different 0
(We discuss text variables in more detail in section 3.)
Note: To put a single quote mark into the string, use two single quote marks.
You can change a variable from a scalar to a vector or a matrix whenever you desire — or whenever
you forget that the variable has already been defined. Unlike C, for example, variables do not need to be
7
1.2. Variables
declared (or typed). A variable springs into existence the first time it is assigned a value, and its type
depends on its context.
At start-up time, MATLAB also contains some predefined variables. Many of these are contained in the
table below. Probably the most useful of these is pi.
Warning: Be careful since you can redefine these predefined variables. For example, if you type
>> pi = 2
then you have redefined π — and no error messages will be printed out!
Another very useful predefined 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 = 0 Silly Walks 0
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( 0 And now for something completely different 0 )
>> disp( 0 ------------------------------------------ 0 )
displays
-23.6000
31.0063
8
1.3. Round-off Errors
Predefined Variables
ans The default variable name when one has not been specified.
pi π.
eps Approximately the smallest positive real number on the computer such that
1 + eps 6= 1 .
Inf ∞ (as in 1/0 ). You can also type inf.
NaN Not-a-Number (as in 0/0 ). You can also type nan.
√
i √−1 .
j −1 (the same as i because engineers often use these interchangeably).
realmin 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 ).
realmax 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
9
1.4. Formatting Printing
Request Input
input( 0 <prompt> 0 ) Displays the prompt on the screen and waits for you to input whatever is de-
sired. The optional second argument of “ 0 s 0 ” allows you to enter a string
(including spaces) without using quote marks.
10
1.5. Common Mathematical Functions
Format Options
†
Be sure to define deg = pi/180 beforehand.
11
1.5. Common Mathematical Functions
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 vec-
tor 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.7. Script M-files
MATLAB can work with complex numbers as easily as with real numbers. For example, to find 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
As another example, to calculate eiπ/2 enter
>> exp(i*pi/2)
and obtain
0.0000 + 1.0000i
There are standard commands for obtaining the real part, the imaginary part, and the complex conju-
gate† of a complex number or variable. For example,
>> x = 3 - 5i
>> real(x)
>> imag(x)
>> conj(x)
returns 3, -5, and 3.0000 + 5.0000i respectively.
Note that many of the common mathematical functions can take complex arguments. Above, MATLAB
has calculated eiπ/2 , which is evaluated using the formula
Similarly,
eiz + e−iz eiz − e−iz
cos z = and sin z = .
2 2i
So far we have always entered MATLAB statements directly into the text window so that they are ex-
ecuted 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 file named <file name>.m. It is easy to edit this file 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 file is called a script m-file: when MATLAB executes the command
†
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∗ = e−iπ/4 ; if a = (2 + 3i) sin(1 + 3i)/(3 − 5 i), then a∗ = (2 − 3i) sin(1 − 3i)/(3 + 5 i).
13
1.8. Help!
<file name> the contents of the file “ <file name>.m” are executed just as if you had typed them into
into the text window. We will not emphasize script m-files further, but you will find many occasions where
they are very helpful.
However, there is one point we need to emphasize. Make sure your file name is not the same as
one of MATLAB's commands or functions. If it is, your file will not execute — MATLAB’s will! To
check this, you can enter
>> type <file name>
which types out the entire file 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 file is typed out,
fine; if not, change the name of your file.
A long expression can be continued to a new line by typing three periods followed by the “enter (or
P20
“return”) key. For example, 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 + ...
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-file.
If your m-file 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.
type Displays the actual MATLAB code for a command or function or m-file.
... Continue an expression onto the next line.
% Begin a comment
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 specific command, simply type help followed by the name of the com-
mand, 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 first line of all MATLAB help entries for a particular keyword.
It is case insensitive so capital letters need not be used. For example,
>> lookfor plot
14
1.8. Help!
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 keyword need not be a complete word. For example, the keyword compl is contained in the
words “complement”, “complex”, “complete”, “completion”, and “incomplete” — and in the capi-
tals of all these words.
If you want to find out more about a specific command, enter
>> type <command>
or
>> edit <command>
If the command is written in MATLAB’s 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 can-
not 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
>> doc
or
>> helpdesk
This hypertext documentation is displayed using your Web browser. It generally gives much more infor-
mation than the help command, and in a more easily understood format.
After working for a while, you may well forget what variables you have defined in the workspace. Sim-
ply 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 defined, 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 some-
thing.
Two commands that don’t quite fit in any category are save and load. However, since these com-
mands 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 finishing 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 vari-
ables to the file “ matlab.mat”. Use doc to learn how to save all the variables to a file 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.)
†
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 file 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.
15
2. Arrays: Vector and Matrix Calculations
Getting Help
1.9. Be Able To Do
After reading this section you should be able to do the following exercises. The MATLAB statements
are given on page 157.
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 ,
to calculate c if a = 3.7, b = 5.7, and ∠ab = 79◦ .
(b) Then show c to its full accuracy.
(c) Use the law of sines, i.e.,
sin ∠ab sin ∠ac
= ,
c b
to calculate ∠ac in degrees and show it in scientific notation.
(d) What MATLAB command should you have used first if you wanted to save these results to the file
triangle.ans?
√
2. Calculate 3 1.2×1020 − 1220 i.
3. Analytically, cos 2θ = 2 cos2 θ − 1. Check whether this is also true numerically when using MATLAB by
using a number of different values of θ. Use MATLAB statements which make it as easy as possible to do
this.
4. How would you find out information about the fix command?
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 rows of
the matrix A equals the number of columns 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 0 A is legitimate ( x 0 denotes the conjugate transpose of the
vector x ) as long as the row vector x 0 has the same number of columns as the number of rows
of the matrix A.
In addition, we have very specific 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 vec-
tors with m elements.
Rm×n denotes all real m×n matrices (i.e., having m rows and n columns) and Cm×n de-
notes all complex m×n matrices.
Notation: In this overview the word “vector” means a column vector so that Cm = Cm×1 . Vectors are de-
noted 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 specific reason not to. If there is a distinction be-
tween the real and complex case, we will first describe the real case and then follow with the complex case
in parentheses.
17
2.1. Generating Matrices
1
2
3
x = = (1, 2, 3, 4, 5, 6)T
4
5
6
can be entered as
>> x = [1; 2; 3; 4; 5; 6]
However, this requires many semicolons; instead, take the transpose of a row vector by entering
>> x = [1 2 3 4 5 6]. 0
where the MATLAB command for the transpose, i.e., “ T ”, is “ . 0 ” (i.e., a period followed by a single
quote mark). There is one further simplification that is usually observed when entering a vector. The
MATLAB command for the conjugate transpose, i.e., “ H ”, of a matrix is “ 0 ” (i.e., just a single quote
mark), which requires one less character than the command for the transpose. Thus, x is usually entered
as
>> x = [1 2 3 4 5 6] 0
Aside: In fact, x should be entered as
>> x = [1:6] 0
since this requires much less typing. (We will discuss the colon operator shortly.)
Warning: xT → x. 0 while xH → x 0 so that you can only calculate xT by x 0 if x is real. This
has bitten us occasionally!
Sometimes the elements of a matrix are complicated enough that you will want to simplify the process
p √ √ √ p T
of generating the matrix. For example, the vector r = 2/3 , 2 , 3 , 6 , 2/3 can be entered by
typing
18
2.1. Generating Matrices
without having to enter all nine elements. If A (see the beginning of this section) has already been gener-
ated, 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
enter
>> x = [1:50] 0 ; x(50) = 51
or
>> x = [1:50] 0 ; x(50) = x(50) + 1
or
>> x = [1:50] 0 ; 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,
>> C = zeros(5)
or
>> C = zeros(5, 5)
generates a 5×5 zero matrix. Also,
>> C = zeros(5, 8)
generates a 5×8 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 fre-
quently 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 off 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 num-
bers. This is generated by the rand command, which takes the same arguments as above. Specifically,
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 ini-
tial “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 different sequence of random numbers is generated.
If desired, a different seed can be set at any time by entering
>> rand( 0 state 0 , <non-negative integer state number>)
Note: You can use the word “seed”, rather than “state”, as the first 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 dis-
tributed (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.
19
2.1. Generating Matrices
Elementary Matrices
20
2.3. Manipulating Matrices
21
2.3. Manipulating Matrices
6 5 4 3 2 1
12 11 10 9 8 7
G = 18 17 16 15 14 13 .
24 23 22 21 20 19
30 29 28 27 26 25
It is also very easy to switch rows in a matrix. For example, to switch the third and fifth 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 first five elements of f are the first
column of E, the next five 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 different 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 con-
verse also holds: when diag is applied to a vector, it generates a symmetric matrix. The command
>> F = diag(d)
22
2.3. Manipulating Matrices
generates a 5×5 matrix whose main diagonal elements are the elements of d, i.e., 1, 8, 15, 22, 29, and
whose off-diagonal elements are zero. Similarly, entering
>> F1 = diag(d1, 1)
generates a 6×6 matrix whose first 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 2 0 0 0 0
0 0 9 0 0 0
0 0 0 16 0 0
F1 = .
0 0 0 0 23 0
0 0 0 0 0 30
0 0 0 0 0 0
Finally, typing
>> F2 = diag(d2, -2)
generates a 5×5 matrix whose −2-nd diagonal elements (i.e., two below the main diagonal) are the ele-
ments of d2, i.e., 13, 20, 27, and whose other elements are zero, i.e.,
0 0 0 0 0
0 0 0 0 0
F2 = 13 0 0 0 0 .
0 20 0 0 0
0 0 27 0 0
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 first 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 first command might not generate exactly the same matrix as the following three
because of round-off 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 first 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) flips the matrix from left to right, i.e., reverses the columns of the matrix;
23
2.3. Manipulating Matrices
flipud(A) flips 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 k×90◦ .
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 ∈ Cp×q into K ∈ Cm×n where m and n must satisfy mn = pq (or an error mes-
sage will be generated). A column vector is generated from H, as in H(:), and the elements of K are
taken columnwise from this vector. That is, the first m elements of this column vector go in the first col-
umn 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) 0
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] 0
>> 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 sufficient.) If A is a p by q matrix, then B ∈ Rmp×nq . 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 specific operation is to be applied to each row or to each col-
umn 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 multi-
dimensional matrixes, but we will only describe it for bsxfun(<function handle>, A, b). <fun> is a
function handle which operates on the matrix A ∈ Rm×n and the column vector b ∈ Rm or the row vec-
tor b ∈ R1×n . The simplest operation is to let the function handle be one of the following:
24
2.3. Manipulating Matrices
Manipulating Matrices
A(i,j) ai,j .
A(:,j) the j-th column of A.
A(i,:) the i-th row of A.
A(:,:) A itself.
A(?1,?2) 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].
A(:) On the right-hand side of an equation, this is a column vector containing
the columns of A one after the other.
diag(A) A column vector of the k-th diagonal of the matrix (i.e., non-vector) A. If
o
diag(A, k) k is not given, then k = 0.
diag(d) A square matrix with the k-th diagonal being the vector d. If k is not
o
diag(d, k) given, then k = 0.
triu(A) A matrix which is the same size as A and consists of the elements on and
o
triu(A, k) above the k-th diagonal of A. If k is not given, then k = 0.
tril(A) The same as the command triu except it uses the elements on and below
o
tril(A, k) the k-th diagonalof A. If k is not given, then k = 0.
fliplr(A) Flips a matrix left to right.
flipud(A) Flips a matrix up and down.
rot90(A) Rotates a matrix k×90◦ . If k is not given, then k = 1.
o
rot90(A, k)
repmat(A, m, n) Generates a matrix with m rows and n columns of copies of A. (If n = m
the third argument is not needed.)
bsxfun(<fnc>, A, b) 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
reshape(A, m, n) Generates an m×n 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.
25
2.4. Simple Arithmetical Operations
Matrix Addition:
If A, B ∈ Cm×n 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 ∈ Cm×n then the MATLAB operation
>> A - B
means A − B = (aij ) − (bij ) = (aij − bij ).
Matrix Multiplication by a scalar:
If A ∈ Cm×n 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 gener-
ated by
>> q = [ 0 : .1*pi : .5*pi ] 0
but more easily by
>> q = [ 0 : .1 : .5 ] 0 *pi
or
>> q = [0:5] 0 *.1*pi
Matrix Multiplication:
If A ∈ Cm×` and B ∈ C`×n then the MATLAB operation
>> A*B P
`
means AB = (aij )(bij ) = k=1 a ik b kj . That is, the (i, j)-th element of AB is ai1 b1j + ai2 b2j +
· · · + ai` b`j .
Matrix Exponentiation:
If A ∈ Cn×n and p is a positive integer, then the MATLAB operation
>> A p
ˆ
means Ap = AA · · · A} .
| {z
p times
Matrix Exponentiation is also defined when p is not an integer. For example,
>> A = [1 2; 3 4]; B = A (1/2)
ˆ
calculates a complex matrix B whose square is A. (Analytically, B2 = A, but numerically
>> B 2 - A
ˆ
returns a non-zero matrix — however, all of its elements are less than 10 · eps in magnitude.)
Note: For two values of p there are equivalent MATLAB commands:
A1/2 can also be calculated by sqrtm(A) and
A−1 can also be calculated by inv(A).
Matrix Division:
The expression
A
B
makes no sense in linear algebra: if B is a square non-singular matrix it might mean B−1 A or it
might mean AB−1 . Instead, use the operation
>> A\b
to calculate the solution of the linear system Ax = b (where A must be a square non-singular ma-
trix) by Gaussian elimination. This is much faster computationally than calculating the solution of
x = A−1 b by
>> x = inv(A)*b
Similarly,
A\B
solves AX = B by repeatedly solving Ax = b where b is each column of B in turn and x is the corre-
sponding column of X.
26
2.4. Simple Arithmetical Operations
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 different 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
27
2.4. Simple Arithmetical Operations
In linear algebra this is called the inner product and is defined for vectors a, b ∈ Rn by aT b. It is calcu-
lated by
>> a 0 *b
(If a, b ∈ Cn the inner product is aH b and is calculated by a 0 *b.) The outer product of these two vec-
tors is defined to be abT and is calculated by
>> a*b 0
(If a, b are complex the outer product is abH and is calculated by a*b 0 .) 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
product is an n×n matrix, i.e., abT ∈ Rn×n (if complex, abH ∈ Cn×n ).
In linear algebra we often work with “large” matrices and are interested in the amount of “work” re-
quired to perform some operation. Previously, MATLAB kept track of the number of flops, i.e., the num-
ber of fl oating-pointoperations, performed during the MATLAB session. Unfortunately, this disappeared
in version 6. Instead, we can calculate the amount of CPU time† required to execute a command by us-
ing cputime. This command returns the CPU time in seconds that have been used since you began your
MATLAB session. This time is frequently difficult to calculate, and is seldom more accurate than to
1/
100 -th of a second. Here is a simple example to determine the CPU time required to invert a matrix.
>> n = input( 0 n = 0 ); time = cputime; inv(rand(n)); cputime - time
Warning: Remember that you have to subtract the CPU time used before the operation from the CPU
time used after the operation.
By the way, you can also calculate the wall clock time required for some sequence of commands by using
tic and toc . For example,
>> tic; <sequence of commands>; toc
returns the time in seconds for this sequence of commands to be performed.
Note: This is very different from using cputime. tic followed by toc is exactly the same as if you had
used a stopwatch to determine the time. Since a timesharing computer can be running many dif-
ferent processes at the same time, the elapsed time might be much greater than the CPU time.
Normally, the time you are interested in is the CPU time.
†
The CPU, Central Processing Unit, is the “guts” of the computer, that is, the hardware that executes the
instructions and operates on the data.
28
2.5. Operator Precedence
cputime Approximately the amount of CPU time (in seconds) used during this session.
tic, toc Returns the elapsed time between these two commands.
3 + [unary plus]
ˆ
- [unary minus]
ˆ
4 .∗ ./
˜.\ ∗ / \
5 + [addition] − [subtraction]
6 :
7 < <= > >= ==
8 &
˜=
9 |
10 &&
11 ||
The unary plus and minus are the plus and minus signs in x = +1 and x = −1. The plus and mi-
nus 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.
†
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).
29
2.6. Be Careful!
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.) To calculate the eigenvalues of the Hilbert matrix of or-
der 5, i.e.,
1 1/ 1/ 1/ 1/
2 3 4 5
1/2 1/
3
1/
4
1/
5
1/
6
1/3 1/
4
1/
5
1/
6
1/
7
,
1/ 1/ 1/ 1/ 1/
4 5 6 7 8
1/ 1/ 1/ 1/ 1/
5 6 7 8 9
0.0000
0.0003
0.0114
0.2085
1.5671
You might think the the first element of this vector is 0. However, if it was zero MATLAB would display
0 and not 0.0000. Entering
>> format short e
>> ans
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
30
2.6. Be Careful!
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 calcu-
lated 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
1.5437 0.8262
H100 ≈ 1010 ,
0.8262 0.4421
while in MATLAB entering
>> format short
>> H = hilb(2)
>> H 100
displays
ˆ
ans =
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.
Similarly, entering
>> format short
>> H = hilb(2)
>> ( H (1/2) ) 2 - H
ˆ ˆ 2
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 sufficient memory, MATLAB may slow to a crawl and become unusable. The whos com-
mand 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!
31
2.8. Data Manipulation Commands
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 definitions in
section 15.)
Here we are interested in how MATLAB applies common mathematical functions to matrices and vec-
tors. For example, you might want to take the sine of every element of the matrix A = (aij ) ∈ Cm×n , 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)
p
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 Func-
tions” 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.
32
2.8. Data Manipulation Commands
>> sum(x)
sum behaves similarly to max when applied to a matrix. That is, it returns the row vector of the sums
of each column of the matrix. This command is sometimes useful in adding a deterministic series. For
example,
>> 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
is entered much more easily as
>> sum(ones(1, 20)./[1:20])
or even as
>> sum(1./[1:20])
The mean, or average, of these elements is calculated by
>> mean(x)
where mean(x) = sum(x)/length(x).
std calculates the standard deviation of the elements of a vector. The standard deviation is a measure
of how much a set of numbers “vary” and is defined as
n 1/2
1X 2
std(x) = xi − h x i
n i=1
33
2.9. Advanced Topic: Multidimensional Arrays
(As we discuss in section 7, the norm of a vector is a more general concept than simply the Euclidean
length.)
max(A) A row vector containing the maximum element in each column of a matrix.
[m, i] = max(A) also returns the element in each column which contains the maxi-
mum value in i.
min(x) The sum of the elements of a vector, or a row vector containing the sum of the ele-
o
min(A) ments in each column in a matrix.
mean(x) The mean, or average, of the elements of a vector, or a row vector containing the
o
mean(A) mean of the elements in each column in a matrix.
norm(x) The Euclidean length of a vector.
norm(A) The matrix norm of A.
Note: the norm of a matrix is not the Euclidean length of each column in the
matrix.
prod(x) The product of the elements of a vector, or a row vector containing the product of
o
prod(A) the elements in each column in a matrix.
sort(x) Sorts the elements in increasing order of a real vector, or in each column of a real
o
sort(A) matrix.
std(x) The standard deviation of the elements of a vector, or a row vector containing the
o
std(A) standard deviation of the elements in each column in a matrix.
sum(x) The sum of the elements of a vector, or a row vector containing the sums of the
o
sum(A) elements in each column in a matrix.
diff(x) The difference between successive elements of a vector, or between successive ele-
o
diff(A) ments in each column of a matrix.
cumsum(x) The cumulative sum between successive elements of a vector, or between successive
o
cumsum(A) elements in each column of a matrix.
34
2.10. Be Able To Do
matrices A, B, C, and D ∈ R2×7 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 di-
mension 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] )
cat Concatenates arrays; this is useful for putting arrays into a higher-dimensional array.
ipermute The inverse of permute.
permute Reorders the dimensions of a multidimensional array.
squeeze Removes (i.e., squeezes out) dimensions which only have one element.
2.10. Be Able To Do
After reading this section you should be able to do the following exercises. The answers are given on
page 157.
1. Consider the matrix
1 2 3 4
5 6 7 8
A= .
9 10 11 12
13 14 15 16
35
3. Anonymous Functions, Strings, and Other Data Types
(iii) since each column is in arithmetic progression, use the colon operator (and the transpose opera-
tor) to enter each column.
(b) Multiply the second row of A by −9/5 , add it to the third row, and put the result back in the second
row. Do this all using one MATLAB statement.
2. Generate the tridiagonal matrix
4 −1
−1 4 −1 0
−1 4 −1
A= . . . . . . ∈ Rn×n
. . .
−1 4 −1
0 −1 4
where the value of n has already been entered into MATLAB.
3. Generate the tridiagonal matrix
1 −1
e1 4 −1 0
e2 9 −1
A= .. .. .. ∈ Rn×n
. . .
en−1 (n − 1)2 −1
0 en n2
where the value of n has already been entered into MATLAB.
4. Consider the matrix
1 1 1 1 0 0 0 0 0 −5
1 1 1 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0
A= .
1 1 1 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0
5 1 1 1 0 0 0 0 0 0
(a) Enter it using as few keystrokes as possible. (In other words, don’t 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, don’t enter the elements individually.)
6. (a) Generate a random 5×5 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.
36
3.1. Anonymous Functions
anonymous functions allow us to easily define a function which we can then plot. Second, some graphics
functions require that the name of a function be passed as an argument. Third, character strings are nec-
essary in labelling plots. And, finally, cell arrays are occasionally helpful in labelling plots. Cell arrays are
generally used to manage data and since structures are also used to manage data we also include them
here. Another reason is that there are a number of data types in MATLAB including floating-point vari-
ables, integers, text variables, cell arrays, structures, and logical variables We might as well get all these
out of the way at once.
by
>> f = @(t) t. 5 .* exp(-2*t) .* cos(3*t)
and then evaluate it by
ˆ
>> x = [0:.01:1] 0
>> fx = f(x)
>> A = rand(5)
>> fA = f(A)
More generally, we can define
g(x, y, a, b, c) = xa e−bx 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 multipli-
cation (i.e., * ), division (i.e., / ), and exponentiation (i.e., ). For example, if f is defined 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 defining an anonymous function is
>> @(<argument list>) <expression>
(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 ad-
dress 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
37
3.2. Passing Functions as Arguments to Commands
It is sometimes necessary to pass the name of a function into a MATLAB function or a function m-file
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 defined by an anonymous function, then we enter
fplot(f, [-5 +5])
because f is a variable which we have already defined. If fnc is a MATLAB function or a user-defined
function m-file, 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
38
3.3. Strings
Note: There are a number of “older” ways to pass function names. For example,
>> fplot( 0 fnc 0 , [-5 +5])
will also work. We can even pass a “simple” function by, for example,
>> fplot( 0 (x*sin(x) + sqrt(1 + cos(x)))/(x 2 + 1) 0 , [-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 sec-
tion, now is a good time to discuss how characters are stored in MATLAB variables. A string variable,
such as
>> str = 0 And now for something completely different 0
is simply a row vector with each character (actually its ASCII representation as shown on page 161) 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
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 0 - by Monty Python 0 ]
or
>> str2 = [str, 0 - by Monty Python 0 ]
(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) 0
>> 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), 0 *sin(x) + 0 , num2str(c2), 0 *cos(x) 0 ]
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 = [ 0 And 0
0 0
now
0 0
for
0
something 0
0
completely 0
0
different 0 ]
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
each row must have the same number of characters.)
Note: We do not usually enter matrices this way, i.e., one column per line. Instead, we simply use “;” to
separate columns. However here we need to make sure that each row has exactly the same number
of characters — or else a fatal error message will be generated.
If desired, you can have more control over how data is stored in strings by using the sprintf command
which behaves very similarly to the C commands sprintf, fprintf, and printf. It is also very similar
to the fprintf command in MATLAB which is discussed in detail in Section 6. Note that the data can
39
3.4. Cell Arrays and Structures
be displayed directly on the screen by using disp. That is, sprintf(...) generates a character string
and disp(sprintf(...)) displays it on the screen.
There also is a str2num command to convert a text variable to a number and sscanf to do the same
with more control over how the data is read. (This is also very similar to the C command, as discussed in
section 6.)
num2str(x) Converts a variable to a string. The argument can also be a vector or a matrix.
str2num(str) Converts a string to a variable. The argument can also be a vector or a matrix
string.
sscanf Behaves very similarly to the C command in reading data from a file using any
desired format. (See fscanf for more details.)
sprintf Behaves very similarly to the C command in writing data to a string using any
desired format. (See fprintf for more details.)
0
[2.0000 + 3.0000i] go cells 0
[3x1 double] [5x5 double]
The only difference 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) = { 0 go cells 0 }
>> C(2,1) = {[1 2 3] 0 }
>> C(2,2) = {hilb(5) }
and a third way is by
>> C{1,1} = 2+3i
>> C{1,2} = 0 go cells 0
>> C{2,1} = [1 2 3] 0
>> C{2,2} = hilb(5)
It is important to understand that there is a difference between C(i,j) and C{i,j}. The former is the
cell containing element in the (i, j)-th location whereas the latter is the element itself. For example,
>> C(1,1) 5 % WRONG
ˆ
returns an error message because a cell cannot be raised to a power whereas
>> C{1,1} 5 % CORRECT
ˆ
40
3.4. Cell Arrays and Structures
returns 1.2200e+02 - 5.9700e+02i. All the contents of a cell can be displayed by using the celldisp
function. In addition, just as a “standard” array can be preallocated by using the zeros function, a cell
array can be preallocated by using the cell function. We will not discuss cells further except to state
that cell array manipulation is very similar to “standard” array manipulation.
Warning: In MATLAB you can change a variable from a number to a string to a matrix by simply
putting it on the left-hand side of equal signs. For example,
>> c = pi
>> c = 0 And now for something completely different 0
>> c(5,3) = 17
redefines c twice without any difficulty. However, this cannot be done with cells. If you now
try
>> c{3} = hilb(5)
MATLAB will return with the error message
??? Cell contents assignment to a non-cell array object.
In order to use c as a cell (if has been previously used as a non-cell), you have to either clear it
using clear, empty it using [], or explicitly redefine it by using the cell function.
One particularly useful feature of cell arrays is that a number of text variables can be stored in one cell
array. We previously defined a “standard” array of strings in Str on page 39 where each string had to
have the same length. Using a cell array we can simply enter
>> Str cell = { 0 And 0
0
now 0
0
for 0
0
something 0
0
completely 0
0
different 0 }
or
>> Str cell = { 0 And 0 ; 0 now 0 ; 0 for 0 ; something 0 ; 0 completely 0 ; 0 different 0 }
and obtain the i-th row by
>> Str cell{i,:}
Structures can store different types of data similarly to cell arrays, but the data is stored by name,
called fields , rather than by number. Structures are very similar to structures in C and C++ . The cell
array we have been using can be written as a structure by
>> Cs.scalar = 2+3i
>> Cs.text = 0 go cells 0
>> Cs.vector = [1 2 3] 0
>> Cs.matrix = hilb(5)
Typing
>> Cs
returns
Cs =
41
3.4. Cell Arrays and Structures
returns
Cs =
0
scalar 0
0
text 0
0
vector 0
0
matrix 0
and
>> isfield(Cs, 0 vector 0 )
returns 1.
We can also use function handles in cell elements and structures. For example, suppose you want to
work with all six basic trig functions. They can be stored in a cell array by
>> T = {@sin, @cos, @tan, @cot, @sec, @csc}
so that T{2}(0) = 1. They can also be stored in a structure by
>> Tr.a = @sin; Tr.b = @cos; Tr.c = @tan; Tr.d = @cot; Tr.e = @sec; Tr.f = @csc;
so that Tr.b(0) = 1. By the way, we can even store anonymous functions in cell arrays and structures.
For example,
>> C = {@sin, @(x) exp(sin(x)), @(x) exp(exp(sin(x)))}
is allowed — but probably not very interesting.
Note: We cannot store function handles in standard matrices — we can only store numbers.
42
3.5. Advanced Topic: Data Types and Classes
A MATLAB variable can have a large number of different types of values. These values used to be
called data types, but they are now commonly called classes — which is a central concept in object-
oriented 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, first we discuss the
“fundamental” classes in MATLAB. An important point to remember is that a variable in most program-
ming 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 first discuss those which occur
frequently in this tutorial.
double: By default any variable that is given a numerical value is a double precision floating-point
number. For example, the variable x which is defined 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 inter-
ested in ASCII characters).
cell: A cell variable itself is an instance of the cell class, but it can contain any number of ele-
ments, which can all be instances of different classes.
struct: Similarly, a structure variable is an instance of the struct class, but it can contain any
number of fields, which can all be instances of different 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 ∈ R2×2 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 0×0 matrix up to an n
dimensional matrix for any n ). For completeness, we now list them all.
Fundamental Classes
double double precision floating-point number (8 bytes)
single single precision floating-point number (4 bytes)
int8 integer in the range −127 to 128 (1 byte)
uint8 unsigned integer in the range 0 to 255 (1 byte)
int16 integer in the range −215 + 1 to 215 (2 bytes)
uint16 unsigned integer in the range 0 to 216 − 1 (2 bytes)
int32 integer in the range −231 + 1 to 231 (4 bytes)
uint32 unsigned integer in the range 0 to 232 − 1 (4 bytes)
int64 integer in the range −263 + 1 to 263 (8 bytes)
uint64 unsigned integer in the range 0 to 264 − 1 (8 bytes)
char string (each character is 2 bytes)
logical logical (true or false) (1 byte)
cell its elements can be instances of any classes and sizes
struct its fields can be instances of any classes and sizes
function handle allows indirect references to functions
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 different numerical classes is very different from
43
3.5. Advanced Topic: Data Types and Classes
Classes
44
4.1. Two-Dimensional Graphics
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 157.
1. Generate a structure with the fields “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 2×3 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) .
ˆ
(2,3): the logical value true.
(b) Square the value of the element (1, 2) which is in the cell element (1, 1).
Evaluate the function in the cell element (2, 2) at x = 5.
3. Use anonymous functions to define
(a) f (x, y) = sin(x + y) cos(x − y).
x3
(b) f (x) = x1 − ex2 + cos .
|x1 + x2 | + 1
(c) f (x) = 1 − cos x for x ∈ [0, 2π]
n
0 otherwise.
Hint: Use the heaviside function.
4. Graphics
A very useful feature of MATLAB is its ability to generate high quality two- and three-dimensional
plots using simple and flexible 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 fine control over the appearance of the plots. We be-
gin 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 vec-
tors.
The MATLAB command plot is used to constructing basic two-dimensional plots. For example, sup-
pose you want to plot the functions y1 = sin x and y2 = ecos x for x ∈ [0, 2π]; also, you want to plot
45
4.1. Two-Dimensional Graphics
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] 0 /(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 fits 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:
(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-off errors are minimalized so you are guaranteed that x has exactly n elements, and its first
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 different 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, 0 -- 0 , xx, y3, 0 : 0 )
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, 0 -- 0 , xx, y3, 0 :* 0 )
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 defined by giving
the intensities of the red, green, and blue components.)
†
As we discussed previously, it is very unlikely (but it is possible) that round-off errors might cause the
statement
>> x = [0: 2*pi/(n-1): 2*pi] 0 ;
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] 0 /(n-1);
above, which does not suffer from round-off errors because the colon operator is only applied to integers.
46
4.1. Two-Dimensional Graphics
For example,
>> plot(x, y1, 0 r 0 , x, y2, 0 g--o 0 , x, y3, 0 mp 0 )
plots three curves: the first 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.
We can also plot the first 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 briefly 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 beneficial to put this before the first plot command in a script
M-file: it cannot do any harm, and it will make the plot visible if it is already hidden.†
We also briefly digress to suggest another possible use for the plot command: make a movie. In Sec-
tion 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 exam-
ple, suppose that (for some strange reason) you want to plot the periodic function
10
(x − ck t)(modL) − L/2 2 /w2
X
g(x, t) = ak e
k=1
†
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.
47
4.1. Two-Dimensional Graphics
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 con-
tained in the accompanying zip file) 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] 0 ;
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, 0 r* 0 )
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 fly across the plot. The for loop, which will be discussed in Section 8.1, causes the plot
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 final plot.†
Instead of putting a number of curves on one plot, you might want to put a number of curves individu-
ally 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 m×n 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 different rectangles by calling subplot repeatedly for differ-
ent values of p. You can also position the plots anywhere in the figure by subplot( 0 Position 0 , [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 fly” — which
is very difficult. Of course, you frequently do not know how large the axes need to be until you
have filled up the entire graphics window. The axis command (discussed below) can then be
used to rescale all the plots.
In addition, you can also change the endpoints of the axes by
>> axis([-1 10 -4 4])
†
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.
48
4.1. Two-Dimensional Graphics
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 maxi-
mum). 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 effect for one plot. Every new plot turns it off, 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 logarith-
mic 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 different 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 asymp-
totes and other “strange behavior”. We will show some examples shortly.
The first 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 gener-
ated function m-file (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.
Note: Recall in section 3.2 we discussed how to pass a function as an argument.
This function uses adaptive step control to generate as many data points as it considers necessary to
plot the function accurately. You can also store the data points calculated by
>> [x, y] = fplot(<function handle>, <limits>)
rather than having the function plotted directly. You then have complete control over how to plot the
curve using the plot function.
The other command which can plot a function is ezplot, which is more general than fplot. To plot a
function on the interval [−2π, +2π] enter
>> ezplot(<function handle>)
To include limits (as with fplot ) enter
>> ezplot(<function handle>, <limits>)
In addition, a parametrically defined function can be plotted by
>> ezplot(<fnc 1>, <fnc 2>, <limits>)
Finally, this command can also plot an implicitly defined function, i.e., f (x, y) = 0, by
>> ezplot(<2D fnc>, <limits>)
For example,
>> f = @(x, y) (x 2 + y 2) 2 - (x 2 - y 2);
>> ezplot(f)
ˆ ˆ ˆ ˆ ˆ
plots the lemniscate of Bernoulli (basically an “∞” symbol).
Warning: Be particularly careful when plotting implicit functions because they can be really nasty and
occasionally ezplot may not get it right.
There is an important difference between
>> fplot(f, [-5 5])
and
>> ezplot(f, [-5 5])
In the former f(x) is only evaluated for scalar values of x, while in the latter f(x) is evaluated for vec-
tor values of x. Thus, when using ezplot care must be taken if f is evaluated in a function m-file. If
49
4.1. Two-Dimensional Graphics
50
4.1. Two-Dimensional Graphics
of the histogram fluctuate. To avoid this “instability”, fix the endpoints of the histogram by
>> xmax = 4;
>> nrbin = 20;
>> nrdata = 1000;
>> c = xmax*[ -1+1/nrbin : 2/nrbin : 1-1/nrbin ];
>> x = randn(nrdata, 1);
>> hist(x, c)
Note that c contains the midpoints of each bin and not their endpoints. Another way to calculate c,
which might be clearer, is
>> c = linspace(-xmax+xmax/nrbin, xmax-xmax/nrbin, nrbin);
Of course, to get a “good” histogram you should increase nrbin, say to 100, and nrdata, say to
100,000. If you now rerun this code you will see a much smoother histogram.
We have already seen how to plot the vector x vs. the vector y by using the plot command. If, ad-
ditionally, you have an error bar of size ei for each point yi , you can plot the curve connecting the data
points along with the error bars by
>> errorbar(x, y, e)
Sometimes the error bars are not symmetric about the y values. In this case, you need vectors l and u
where at xi the error bars extend from yi − li to yi + ui . This is done by
>> errorbar(x, y, l, u)
Note: All the elements of l and u are non-negative.
Data can also be entered into MATLAB from a separate data file. For example,
>> M = csvread( 0 <file name> 0 )
reads in data from a file one row per line of input. The numbers in each line must be separated by com-
mas. The data can then be plotted as desired. The command csvwrite writes the elements of a matrix
into a file using the same format. (If desired, you can have much more control over how data is input and
output by using the fscanf and fprintf commands, which are similar to their C counterparts. These
commands are discussed in detail in section 6.)
The load command can also be used to read a matrix into MATLAB from a separate data file. The
data must be stored in the data file one row per line. The difference between this command and csvread
is that the numbers can be separated by commas or by spaces. The matrix is input by entering
>> load <file name>
or
>> load 0 <file name> 0
or
>> load( 0 <file name> 0 )
and it is stored in the matrix named <file name-no extension> (i.e., drop the extension, if any, in the
file name). Or you can enter
51
4.1. Two-Dimensional Graphics
†
The load command is a little tricky because it can read in files 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 file 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 file, 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 file depending on the extension.
52
4.1. Two-Dimensional Graphics
Input-Output
csvread( 0 <file name> 0 ) Reads data into MATLAB from the named file, one row per line of
input; the numbers in each line must be separated by commas.
load( 0 <file name> 0 ) Reads data into MATLAB from the named file, 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>.
csvwrite( 0 <file name> 0 , A) Writes out the elements of a matrix to the named file using the
same format as csvread.
print Prints a plot or saves it in a file using various printer specific for-
mats.
For example, print -deps <file name> saves the plot in the file
using encapsulated PostScript (so it can be plotted on a PostScript
laser printer).
53
4.1. Two-Dimensional Graphics
Two-Dimensional Graphics
54
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 defined 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 rect-
angular mesh (xi , yj ) i = 1, 2, . . . , m , j = 1, 2, . . . , n in the x–y plane. The function f can then be
evaluated at these mesh nodes. For example,
>> x = linspace(-3, 3, 61) 0 ;
>> y = linspace(-2, 2, 41) 0 ;
>> [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, filled-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 x–y 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 x–y plane toward the +z axis (so 0◦ is in the x–y 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 specific values by
>> contour(X, Y, F, v)
where v is a vector of the values. To obtain a filled contour plot enter
55
4.2. Three-Dimensional Graphics
>> 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
r + e2r sin 2θ
f (r, θ) = for r ≤ 1
1.2 − r cos 3θ
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 under-
stood 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) 0 ;
>> y = linspace(-2, 2, 41) 0 ;
>> z = linspace(0, 1, 11) 0 ;
>> [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 difference between the two functions is that
the order of the first two arguments is reversed. For example,
>> [X, Y] = meshgrid(1:3, 4:7)
returns
1 2 3 4 4 4
1 2 3 5 5 5
X= , Y=
1 2 3 6 6 6
1 2 3 7 7 7
while
>> [X, Y] = ndgrid(1:3, 4:7)
returns
1 1 1 1 4 5 6 7
X = 2 2 2 2 , Y = 4 5 6 7
3 3 3 3 4 5 6 7
56
4.3. Advanced Topic: Commands
Three-Dimensional Graphics
plot3(x, y, z) 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.
ezplot3(<fnc 1>, Generates an “easy” plot in 3-D.
<fnc 2>, <fnc 3>)
mesh(X, Y, Z) Plots a 3-D surface using a wire mesh.
ezmesh(<2D fnc>) Generates an “easy” 3-D surface using a wire mesh.
surf(X, Y, Z) Plots a 3-D filled-in surface.
ezsurf(<2D fnc>) Generates an “easy” 3-D filled-in surface.
view Changes the viewpoint of a 3-D surface plot by
view(<azimuth>, <elevation>) or view([x y z]).
meshgrid(x, y) Generates a 2-D grid given the x-coordinates and the y-coordinates of the
mesh lines.
ndgrid(x, y) Same as meshgrid except that the two arguments are reversed.
pol2cart(Th, R) convert polar to cartesian coordinates.
zlabel(<string>) Puts a label on the z-axis.
axis Controls the scaling and the appearance of the axes.
axis([xmin xmax ymin ymax zmin zmax]) changes the endpoints of the
axes.
contour(X, Y, Z) Plots a contour looking down the z axis.
contourf(X, Y, Z) Plots a filled contour.
ezcontour(<2D fnc>) Generates an “easy” contour looking down the z axis.
contour3(X, Y, Z) Plots a contour in 3-D.
ezcontour3(<2D fnc>) Generates an “easy” contour in 3-D.
clabel Label contour lines generated by contour or contour3.
subplot(m, n, p) Remember than subplot can also be called in 3-D to put a number of
plots in one graphics window.
57
4.3. Advanced Topic: Commands
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 fixed 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 different 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 exper-
imenting). Most of the “common” TEX commands can be used, including Greek letters; also, “ ” and
“ 2 ˆ
R α ” are used for superscripts and subscripts. For example, the x-axis can be labelled α and the y-axis
0
f (x) dx by
>> xlabel( 0 \alpha 2 0 )
ˆ
>> ylabel( 0 \int 0 \pi\betaf(x) dx 0 )
ˆ
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, other-
wise, have to be written down “somewhere” and connected to this specific 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 coefficients to obtain the most “pleasing” plot. Then you
probably should have the title include a definition of the function — and you should not have to modify
the title by hand every time you change the coefficients. This can be done by
>> t = [num2str(c1), 0 *sin 0 , num2str(p1), 0 (x) + 0 , num2str(c2), ...
0 ˆ
*cos 0 , num2str(p2), 0 (x) 0 ]
>> 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 isn’t a great example, but it’s better than nothing.)
You can also put plots in a new graphics window by entering
>> figure
where the figures are numbered consecutively starting with one (and appear at the top of the window). Or
enter
>> figure(n)
and the figure will have the specific 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)
58
4.3. Advanced Topic: Commands
where n is the number of the graphics window you want to make current. New plots will now appear in
this figure. In this way much more information can be generated and viewed on the computer terminal.
Occasionally, it is useful to clear a figure. For example, suppose you divide a window into a 2×2 ar-
ray of plotting regions and use subplot to put a plot into each region; you then save the figure into a
file. Next, you only want to put plots into two of these four regions. The difficulty is that the other two
regions will still contain the previous plots. You can avoid this difficulty by clearing the figure using
>> clf
which clears the current figure. You can clear a particular figure by clf(n) or clf(<handle>). In addi-
tion, you can clear the current figure by
>> close
or a particular figure by close(<handle>). You can clear a number of figures 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 defined 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 n×3
matrix, where each element is a real number between 0 and 1 inclusive. In each row the first 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 rep-
resenting 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 mini-
mum 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 n×3 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 0 gray 0 . 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 fill-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] 0 ;
>> ysquare = [-s -s s s] 0 ;
>> fill(cos(t), sin(t), 0 r 0 , xsquare, ysquare, 0 y 0 )
>> axis equal;
To obtain a more interesting pattern replace the above fill command by
>> colormap( 0 hsv 0 );
>> fill(cos(t), sin(t), [1:100], xsquare, ysquare, [100:10:130])
59
4.3. Advanced Topic: Commands
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 different 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 different solid color, input the matrices
0 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1
1 1 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 1
X= , Y= , Z= .
1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 1
0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1
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 filled 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] 0 ; % 7
C green = [color scale, ones(size(color scale)), color scale]; % 8
color scale = flipud(color scale(2:end)); % 9
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 defined 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 filled contour is calculated in line 13. However, the zero value of F does not cor-
respond 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 col-
ormap 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 first modified 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
(f mod − f min)(n − 1)
ic = fix +1.
f max − f min
MATLAB can also plot a two-dimensional image (i.e., a picture) which is represented by a matrix
X ∈ Rm×n . The (i, j)-th element of X specifies the color to use in the current color map. This color
60
4.4. Advanced Topic: Handles and Properties
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.)
caxis([v min, v max]) Change the scaling used in the color map so that the value of
v min corresponds to the first row of the colormap and v max to the
last row. Values outside this interval map to the closest endpoint.
clf Clear a figure (i.e., delete everything in the figure)
colorbar Adds a color bar showing the correspondence between the value and
the color.
colormap Determines the current color map or choose a new one.
demo Runs demonstrations of many of the capabilities of MATLAB.
figure Creates a new graphics window and makes it the current target.
figure(n) makes the n-th graphics window the current target.
fill(x, y, <color>) Fills one or more polygons with the color or colors specified by the
vector or string <color>.
fill3(x, y, z, <color>) Fills one or more 3D polygons with the color or colors specified by the
vector or string <color>.
image Plots a two-dimensional image.
In this subsection we briefly 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 im-
ages 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
61
4.4. Advanced Topic: Handles and Properties
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 prop-
erties, and a handle is the unique identifier which refers to a particular object. (Each handle is a unique
floating-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>, 0 <Prop 1> 0 , <Value 1>, 0 <Prop 2> 0 , <Value 2>, . . . )
or
>> h = text(xpt, ypt, <string>);
>> set(h, 0 <Prop 1> 0 , <Value 1>, 0 <Prop 2> 0 , <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 cus-
tomize 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, 0 Color 0 , 0 r 0 , 0 FontSize 0 , 16, 0 Rotation 0 , 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 on — (default) Any portion of the text that extends outside the axes rect-
angle is clipped
off — No clipping is done.
Color A three-element vector specifying a color in terms of its red, blue, and
green components, or a string of the predefined colors.
FontName The name of the font to use. (The default is Helvetica.)
FontSize The font point size. (The default is 10 point.)
HorizontalAlignment left — (default) Text is left-justified
center — Text is centered.
right — Text is right justified.
Rotation The text orientation. The property value is the angle in degrees.
VerticalAlignment 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 ex-
ample, to get the font which is presenting being used enter
>> s = get(h, 0 FontName 0 )
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 figure and
>> ha = gca
62
4.5. Advanced Topic: GUIs (Graphical User Interfaces)
returns the handle of the current axes in the current figure. 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, 0 XTick 0 , [0:pi/2:2*pi])
>> set(gca, 0 XTickLabel 0 , { 0 0 0 , 0 .5*pi 0 , 0 pi 0 , 0 1.5*pi 0 , 0 2*pi 0 })
>> set(gca, 0 XMinorTick 0 , 0 on 0 )
>> set(gca, 0 TickDir 0 , 0 out 0 )
where the third line puts major tick marks at multiples of π/2, the fourth line puts the labels shown
at each tick mark, the fifth 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 figure is printed, the graphical im-
ages do not fill 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( 0 PositionPaper 0 , [0 0 8.5 11])
or
>> figure(n)
>> set(gcf, 0 PositionPaper 0 , [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( 0 Position 0 , [0 0 1 0.95], 0 Visible 0 , 0 off 0 );
>> title handle = get(axes handle, 0 Title 0 );
>> set(title handle, 0 String 0 , <title>, 0 Visible 0 , 0 on 0 );
The first line specifies a rectangle for the axes in normalized units (so that
[left bottom width height] = [0 0 1 1] is the full size of the figure). 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.
get(<handle>, 0 <Prop> 0 ) Return the current value of the property of the object with this
handle. Note: Case is unimportant for property names.
set(<handle>, 0 <Prop 1> 0 , Set the property, or properties, of the object with this handle. Note:
<Value 1>, ...) Case is unimportant for property names.
gca The current axes handle.
gcf The current figure 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 deci-
sion whether or not to spend the time required to write a good GUI. Note that this not only includes the
63
4.5. Advanced Topic: GUIs (Graphical User Interfaces)
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 but-
tons. 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 figure, which is a graphical window
which is separate from the MATLAB window which arises when MATLAB is first 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 specifies how how
each event affects 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 rect-
angular 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 files, the fig file (i.e., the extension is fig) and the function file (i.e., the
extension is m). So far you have only created the first two elements of a GUI: the components and the fig-
ure. The third part, i.e., the callbacks, are your responsibility. Your program must be integrated into this
function file and you must also write the code to connect an event with its effect 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 figure, the components, and the callbacks. Since this can get quite compli-
cated, we only show two very simple examples. We will not write any GUIs from scratch. Instead, we will
show how to take a simple figure 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 first example consider the function
64
4.5. Advanced Topic: GUIs (Graphical User Interfaces)
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( 0 x 0 )
ylabel( 0 y 0 )
zlabel( 0 z 0 )
title(t)
drawnow
end
z = f (x, y, t; a, b) = sin [(a + 0.8t) + 0.1x + 0.2η(y)]x2 + (b + 0.4t)[sin 2η(y) + 0.2η(y)]η 2 (y)
where
η(y) = y + 0.25 sin 2(ex/2 − 1) .
It is “rippling” in time (and the time is shown at the top of the 3D surface). Suppose we would like to
stop the time evolution briefly to admire the surface. This is easily done by
function pause rippling
shg
uicontrol(gcf, ...
0
Style 0 , 0 PushButton 0 , ...
0
String 0 , 0 Pause 0 , ...
0
Units 0 , 0 Pixels 0 , ...
0
Position 0 , [0 0 80 20], ...
0
Callback 0 , @button);
rippling(0, 0) % the above function which generates the surface
end
%%%%% secondary function
function button(hObject, event)
str = get(hObject, 0 String 0 );
if strcmp(str, 0 Pause 0 )
set(hObject, 0 String 0 , 0 Continue 0 )
uiwait
else
uiresume
set(hObject, 0 String 0 , 0 Pause 0 )
end
end
The actual figure is shown below when the push button has been clicked.
65
4.5. Advanced Topic: GUIs (Graphical User Interfaces)
The discussion of this code follows. shg either raises the current already-existing figure, or creates a
new figure. The uicontrol command (user interface control) positions a component (check box, editable
text field, list box, pop-up menu, push button, radio button, slider, toggle buttons, or static text field) in
the figure. This component must be attached to something, which is called its parent. (uipanel can be
used to split the GUI into different regions; a uicontrol can then be attached to any of these panels or
the original figure.) The first argument to the uicontrol command in the code determines its parent. (It
is not actually needed because the default parent is the current figure, but it never hurts.) The remain-
ing arguments occur in pairs with the first 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 figure handle or a . . . ). The first 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 figure (using these units). The
button is to be positioned beginning at the lower left hand corner of the figure and extend 80 pixels to the
right and 20 pixels upward.† However, the push button still does not do anything. The last pair of argu-
ments 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.
66
4.5. Advanced Topic: GUIs (Graphical User Interfaces)
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 ex-
ecuted where the first 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 re-
places 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 but-
ton (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 com-
mand 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, 0 Style 0 , 0 PushButton 0 , 0 String 0 , 0 Start 0 , ...
0
Units 0 , 0 Pixels 0 , 0 Position 0 , [0 0 80 20], ...
0
Callback 0 , @button);
a = 0;
b = 0;
uicontrol(gcf, 0 Style 0 , 0 Text 0 , 0 String 0 , 0 a = 0 , 0 Position 0 , [90 0 30 20]);
uicontrol(gcf, 0 Style 0 , 0 Edit 0 , 0 String 0 , num2str(a, 0 %4.2f 0 ), ...
0
Position 0 , [120 0 60 20], 0 Callback 0 , @edit a);
uicontrol(gcf, 0 Style 0 , 0 Text 0 , 0 String 0 , 0 b = 0 , 0 Position 0 , [190 0 30 20]);
uicontrol(gcf, 0 Style 0 , 0 Edit 0 , 0 String 0 , num2str(a, 0 %4.2f 0 ), ...
0
Position 0 , [220 0 60 20], 0 Callback 0 , @edit b);
drawnow
uiwait
rippling(a, b)
%%%%% nested functions follow
function button(hObject, event)
str = get(hObject, 0 String 0 );
if strcmp(str, 0 Start 0 )
uiresume
set(hObject, 0 String 0 , 0 Pause 0 )
elseif strcmp(str, 0 Pause 0 )
set(hObject, 0 String 0 , 0 Continue 0 )
uiwait
else
uiresume
set(hObject, 0 String 0 , 0 Pause 0 )
end
end
function edit a(hObject, event)
a = str2num(get(hObject, 0 String 0 ));
end
function edit b(hObject, event)
b = str2num(get(hObject, 0 String 0 ));
end
end
This is shown below where both a and b have been modified and the push button has been clicked.
67
4.5. Advanced Topic: GUIs (Graphical User Interfaces)
Initially the label on the push button is Start and the function rippling does not begin running un-
til it is pushed. Afterwards, the label alternates between Pause and Continue. Next, comes the static
text field “a =”, followed by the editable text field 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, 0 %4.2f 0 ).† If
the number (actually the string) is modified, 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 modified in this function is also
modified 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 figure. The following command, i.e., uiwait, puts the GUI into a wait state. This state con-
tinues 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 second argument to num2str causes the number to appear as ± × . × ×.
‡
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.
68
4.6. Advanced Topic: Making Movies
GUI
guide Invoke the GUI design environment to design your own GUI.
uicontrol(<handle>, 0 <Prop 1> 0 , Create a user interface component. The various compo-
<Value 1>, ...) nents are: check boxes, editable text fields, list boxes, pop-up
menus push buttons, radio buttons, sliders, static text labels,
toggle buttons. The first argument (which is optional) is the
handle of the parent (default is gcf). Some of the proper-
ties are: BackgroundColor, Callback, FontSize, FontUnits,
ForegroundColor, Max (maximum value, but only used by
some components), Min (minimum value, but only used by
some components), Parent (instead of using the first argu-
ment), Position, SliderStep (only used by some components),
String, Style (which component), Units, UserData (user spec-
ified data), Value (current value of component, but only used
by some components), and Visible (whether the component
should be currently visible).
Note: Case is unimportant for property names.
uipanel(<handle>, 0 <Prop 1> 0 , Create a user interface panel. This is used to subdivide the
<Value 1>, ...) GUI if desired. It is useful if different parts of the GUI cor-
respond to different tasks and so components are attached to
panels which are then attached to the figure.
uiwait Block execution of the GUI.
uiresume Resume execution of the GUI.
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.
69
4.6. Advanced Topic: Making Movies
Linux and Mac is that the movie file 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.
70
4.6. Advanced Topic: Making Movies
71
4.6. Advanced Topic: Making Movies
72
5. Solving Linear Systems of Equations
Movies
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 157.
1. Plot ex and one of its Taylor series approximations.
(a) Begin by plotting ex for x ∈ [−1, +1].
(b) Then plot
x x2 x3
p3 (x) = 1 + + +
1! 2! 3!
on the same graph.
(c) Also plot the difference between ex and this cubic polynomial, i.e., ex − p3 (x) on the same graph.
(d) Next, generate a new graph containing all three curves by using only one plot command, force the
axes to be to the same scale, and let all three curves have different colors. Put labels on the x and y
axes and a silly title on the entire plot.
(e) The above plot is not very instructive because ex − p3 (x) is much smaller than either ex or p3 (x).
Instead, use two plots. The first plot contains ex and p3 (x) and the second plot, which is immediately
below the first, contains ex − p3 (x). These two plots should fill an entire sheet of paper.
2. Consider the function
f (x, y) = (x2 + 4y 2 ) sin(2πx) sin(2πy) .
73
5.1. Square Linear Systems
x1 x2 ··· xn = rhs
a11 a12 ... a1n b1
a
21 a22 ... a2n b2
... ... .. . ... .
. ..
am1 am2 ... amn 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 first column is the coefficients of
the x1 term, the second column is the coefficients of the x2 term, etc., and the last column is
the coefficients on the right-hand side. The vertical line between the last two columns repre-
sents 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 al-
lowed operations on linear equations — these operations are not allowed on matrices, but only on linear
74
5.1. Square Linear Systems
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 ,
x1 x2 x3 = rhs
1 2 3 −1
4 5 6 −1 .
7 8 10 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 different linear system
x1 + 2x2 + 3x3 = −1
4x1 + 5x2 + 6x3 = −1
7x1 + 6x2 + 9x3 = −1 ,
Since A is a singular matrix, the linear system has either no solutions or an infinite number of solutions.
The augmented matrix for this linear system is
1 2 3 −1
4 5 6 −1 .
7 8 9 0
Entering
>> rref([A b])
returns the augmented matrix
1 0 −1 1
0 1 2 −1 ,
0 0 0 0
75
5.1. Square Linear Systems
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 0 −1 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
0.95 0.03
C=
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] 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] 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.†
linsolve(A, b, <properties>) Solve the linear system of equations Ax = b where A has certain
properties.
rref Calculates the reduced row echelon form of a matrix or an aug-
mented matrix.
†
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.03 b1
−0.05 0.03 b2
is “small enough” that it should be set to 0. tol is (essentially) calculated by
tol = max(size(<augmented matrix>)) * eps * norm(<augmented matrix>, inf);
The maximum of the number of rows and columns of the augmented matrix, i.e., max(size(...)), is multiplied
by eps and this is multiplied by the “size” of the augmented matrix. ( norm in section 7.) Since b is the last
column of the augmented matrix, the “size” of this matrix depends on the size of the elements of b. Thus, the
determination whether a number “should” be set to 0 depends on the magnitude of the elements of b.
You can obtain the correct answer to the homogeneous equation by entering
>> rref([eye(size(C))-C [0 0] 0 ], eps)
which decreases the tolerance to eps.
76
5.2. Catastrophic Round-Off Errors
We have mentioned repeatedly that computers cannot add, subtract, multiply, or divide cor-
rectly! Up until now, the errors that have resulted have been very small. Now we present two examples
where the errors are very large.
In this first example, the reason for the large errors is easy to understand. Consider the matrix
1 2 3
A = 4 5 6 ,
7 8 9+
which is singular when = 0 and nonsingular otherwise. But how well does MATLAB do when 1?
Enter
>> eps = input( 0 eps = 0 ); A = [1 2 3; 4 5 6; 7 8 9+eps]; inv(A)*A - eye(size(A))
so that the final 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 MAT-
LAB 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 1/3 . . . 1/n
1/2 1/3 1/4 . . . 1/(n + 1)
1/3 1/4 1/5 . . . 1/(n + 2)
Hn =
.
,
. .. .. . . . ..
. . . .
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 calcu-
late b by b = Hx. Then solve Hx = b for x and compare the final 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 difference, i.e.,
>> x - xnum
77
5.3. Overdetermined and Underdetermined Linear Systems
The result is not very satisfactory: the maximum difference in the elements of the two vectors is usually
somewhere between 10−5 and 10−3 . That is, even though all the calculations have been done to approx-
imately 16 significant digits, the result is only accurate to three to ve significant 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-off errors; instead, Hilbert matrices are very “un-
stable” 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 find
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 floating 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 differ-
ent random numbers by simply rerunning this one line.
r = Ax − b
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 find 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 mini-
mizes the length of the vector Ax − b. If there are an infinite 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 infinite 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. To find all the solutions, you can use rref
to solve AT Ax = AT b. (If A is complex, solve AH Ax = AH b.)
Occasionally, if there are an infinite 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
78
6. File Input-Output
the pseudoinverse of A, denoted by A+ . Since A is not square, it cannot have an inverse. However, the
pseudoinverse is the unique n×m matrix which satisfies 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 A−1 . This pseudoinverse is calcu-
lated 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 infinite number of least-squares approximations, this returns the one with the smallest
length.
Next, suppose that A ∈ Cm×n with m < n. Ax = b is called an underdetermined system because there
are less equations than unknowns. In general, there are an infinite number of solutions to this equation.
We can find these solutions by entering
>> rref([A b])
and solving the result for x. We can find one particular solution by entering
>> A\b
This solution will have many of its elements being 0. We can also find 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 infinite number of solutions
(not least-squares approximations). It is also possible for an underdetermined system to have
no solutions. The way to check the number of solutions is to use the rref command.
One command which is occasionally useful is rats. If all the elements of A and b are rational num-
bers, then the solution and/or approximation obtained is usually a rational number, although stored as
a floating-point number. This command displays a “close” rational approximation to the floating-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).
A\b When Ax = b is an overdetermined system, i.e., m > n where A ∈ Cm×n , this is the
least-squares approximation; when it is an underdetermined solution, i.e., m < n, this is
a solution which has 0 in many of its elements.
pinv(A) The pseudoinverse of A.
6. File Input-Output
In section 4.1 we discussed the csvread and csvwrite commands which allow simple input from and
output to a file. The MATLAB commands fscanf and fprintf, which behave very similarly to their C
counterparts, allow much finer control over input and output. Before using them a file has to be opened
by
>> fid = fopen( 0 <file name> 0 , <permission string>)
79
6. File Input-Output
where the file identifier fid is a unique nonnegative integer attached to the file. (Three file identifiers al-
ways exist as in C: 0 is the standard input, 1 is the standard output, and 2 is the standard error.) The
permission string specifies how the file is to be accessed:
0 0
r read only from the file.
0 0
w write only to the file (anything previously contained in the file is overwritten). If necessary, the
file is created.
0 0
a append to the end of the file (everything previously contained in the file is retained).
0
r+ 0 read from and write to the file (anything previously contained in the file is overwritten).
0
w+ 0 read from and write to the file (anything previously contained in the file is overwritten). If neces-
sary, the file is created.
If the fopen command fails, −1 is returned in the file identifier. Enter
>> fclose(fid)
if a file needs to be closed.
To write formatted data to a file, enter
>> fprintf(fid, <format string>, <variable 1>, <variable 2>, ...)
The elements contained in the variables are written to the file specified in a previous fopen command ac-
cording to the format string. If fid is omitted, the output appears on the screen. The format string is
very similar to that of C, with the exception that the format string is cycled through until the end of the
file is reached or the number of elements specified by size is attained.
To briefly review some of the C format specifications, the conversion characters are:
d – The argument is converted to decimal notation.
c – The argument is a single character.
s – The argument is a string.
e – The argument is a floating-point number in “E” format.
f – The argument is a floating-point number in decimal notation.
g – The argument is a floating-point number in either “E” or decimal notation.
Each conversion character is preceded by “%”. The following may appear between the “%” and the con-
version character:
• A minus sign which specifies left adjustment rather than right adjustment.
• An integer which specifies a minimum field width.
• If the maximum field width is larger than the minimum field width, the minimum field width is pre-
ceded by an integer which specifies the maximum field width, and the two integers are separated by a
period.
fprintf can also be used to format data on the screen by omitting the fid at the beginning of the
argument list. Thus, it is possible to display a variable using as little or as much control as desired. For
example, if x contains −23.6 three different ways to display it are
>> x
>> disp([ 0 x = 0 , num2str(x)])
>> fprintf( 0 %12.6e\n 0 , x)
and the results are
x =
-23.6000
x = -23.6000
-2.360000e+01
Note: It is easy to print the matrix A in the MATLAB workspace as we just described. However, it is
a little more difficult to print it to a file. The following works and can be entered on one line, al-
though it is actually a number of statements.
>> Str = num2str(A); for i = [1:size(Str, 1)] fprintf(fid, 0 %s\n 0 , Str(i,:));
end
To read formatted data from a file, enter
80
7. Some Useful Linear Algebra Commands
Advanced Input-Output
fopen( 0 <file name> 0 , Opens the file with the permission string determining how the
<permission string>) file is to be accessed. The function returns the file identifier,
which is a unique nonnegative integer attached to the file.
fclose(fid) Closes the file with the given file identifier.
fscanf(fid, <format string>) Behaves very similarly to the C command in reading data from
a file using any desired format.
fprintf(fid, <format string>, Behaves very similarly to the C command in writing data to a
<variable 1>,...) file using any desired format.
fprintf(<format string>, Behaves very similarly to the C command in displaying data on
<variable 1>,...) the screen using any desired format.
chol
Let A ∈ Rn×n be symmetric and positive definite† . Then there exists an upper triangular matrix R
such that RT R = A. R is calculated by
>> R = chol(A)
If A is not positive definite, an error message is printed. (If A ∈ Cn×n then RH R = A.)
cond
Note: Read the discussion on norm below first.
The condition number of A ∈ Cn×n , which is denoted by cond(A), is a positive real number which is
always ≥ 1. It measures how “stable” A is: if cond(A) = ∞ the matrix is singular, while if cond(A) = 1
the matrix is as nice a matrix as you could hope for — in particular, cond(I) = 1. To estimate the num-
ber of digits of accuracy you might lose in solving the linear system Ax = b, enter
log10(cond(A))
In Section 5.2 we discussed the number of digits of accuracy you might lose in solving Hx = b where H
is the Hilbert matrix of order 10. In doing many calculations it was clear that the solution was only accu-
rate to 3 to 5 significant digits. Since cond(H) is 1.6×1013 , it is clear that you should lose about 13 of
the 16 digits of accuracy in this calculation. Thus, everything fits.
If A is nonsingular, the condition number is defined by
81
7. Some Useful Linear Algebra Commands
It is calculated in MATLAB by
>> cond(A, p)
where p is 1, 2, Inf, or 0 fro 0 . 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 find the “best” approximation to, Ax = b when A ∈ Cm×n 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
defining 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 first.
The calculation of the condition number of A ∈ Cn×n requires the calculation of its inverse. There are
two reasons this might be inadvisable.
• The calculation of A−1 requires approximately 2n3 flops, 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 A−1 .
The command condest calculates a lower bound to the condition number of a matrix in the 1-norm with-
out 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 ∈ Cn×n . The determinant of A is calculated by
>> det(A)
det(A) = 0 if and only if A is singular. However, due to round-off errors it is very unlikely that you will
obtain 0 numerically unless all the entries to A are integers. For example, consider the matrix
0.95 0.03
C= .
0.05 0.97
†
A matrix is tridiagonal if its only nonzero elements occur on the main diagonal or on the first diagonal above
or below the main diagonal
82
7. Some Useful Linear Algebra Commands
returns 2.2×10−53 , but the Hilbert matrix is not singular for any n. (The singular value decomposition,
which is described below, is a much better method for determining if a square matrix is singular.)
eig
Let A ∈ Cn×n . A scalar λ ∈ C is an eigenvalue of A if there exists a nonzero vector v ∈ Cn such that
Av = λv ;
v is called the eigenvector corresponding to λ. There are always n eigenvalues of A, although they need
not all be distinct. MATLAB will very happily calculate all the eigenvalues of A by
>> eig(A)
It will also calculate all the eigenvectors by
>> [V, D] = eig(A)
D ∈ Cn×n is a diagonal matrix containing the n eigenvalues on its diagonal and the corresponding eigen-
vectors are found in the same columns of the matrix V ∈ Cn×n . It can also calculate all the eigenvalues of
the generalized eigenvalue problem
Ax = λBx
by
>> eig(A, B)
A matrix is defective if it has less eigenvectors than eigenvalues. MATLAB normally cannot determine
when this occurs. For example, the matrix
1 1
B=
0 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 finds the two eigenvectors (1, 0)T and
T
(−1, 2.2×10−16 ) . 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 first.
Frequently, you do not need all the eigenvalues of a matrix. For example, you might only need the
largest ten in magnitude, or the five 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 documenta-
tion carefully.
Why not just use eig anyway? Calculating all the eigenvalues of a nonsymmetric A ∈ Rn×n requires
(very) approximately 10n3 flops, 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 flops. If A is a full matrix, it requires cn2
flops where c is of “reasonable” size; if A is a sparse matrix (see Section 9), it requires cn flops.
Note: If A is sparse, you cannot use eig — you will first 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, 0 LM 0 , op)
( op.disp is a structure, which was discussed in section 3.4.)
inv
To calculate the inverse of the square matrix A ∈ Cn×n enter
>> inv(A)
83
7. Some Useful Linear Algebra Commands
The inverse of A, denoted by A−1 , is a matrix such that AA−1 = A−1 A = I, where I ∈ Rn×n is the iden-
tity 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
1 2
A=
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.1)
7 8 9
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-off 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 ∈ Cn×n . 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 defined 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 first time we have had a function return more than one argument. We discuss this no-
tation 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 first 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 first 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 defined by
Xn 1/p
p
|x | if p ∈ [1, ∞)
i
kxkp = i=1
max |xi | if p = ∞ .
1≤i≤n
†
A unit lower triangular matrix is lower triangular and, in addition, all the elements on the main diagonal
are 1.
‡
P is a permutation matrix if its columns are a rearrangement of the columns of I.
84
7. Some Useful Linear Algebra Commands
kAxkp
kAkp = max for p ∈ [1, ∞]
x6=0 kxkp
null
Let A ∈ Cn×n . We can calculate an orthonormal basis for the null space of A by
>> null(A)
orth
Let A ∈ Cn×n . We can calculate an orthonormal basis for the columns of A by
>> orth(A)
qr
Let A ∈ Rm×n . Then there exists an orthogonal matrix Q ∈ Rm×m † and an upper triangular matrix
R ∈ Rm×n such that
A = QR .
(If A ∈ Cm×n then there exists an unitary matrix Q ∈ Cm×m and an upper triangular matrix R ∈ Cm×n
such that A = QR.) We calculate Q and R in MATLAB by entering
>> [Q, R] = qr(A)
It is frequently preferable to add the requirement that the diagonal elements of R be decreasing in magni-
tude, i.e., |ri+1,i+1 | ≤ |ri,k | for all i. In this case
AE = QR
rank
Let A ∈ Cm×n . The rank of A is the number of linearly independent columns of A and is calculated by
>> rank(A)
†
Q ∈ Rm×m is orthogonal if Q−1 = QT . ( Q ∈ Cm×m is unitary if Q−1 = QH .)
85
7. Some Useful Linear Algebra Commands
This number is calculated by using the singular value decomposition, which we discuss below.
svd
Let A ∈ Rm×n . A can be decomposed into
A = UΣVT
where U ∈ Rm×m and V ∈ Rn×n are orthogonal matrices and Σ ∈ Rm×n 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 ∈ Cm×n then U ∈ Cm×m and V ∈ Cn×n are unitary matrices and Σ ∈ Rm×n 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 ma-
trix, both AT A ∈ Rn×n and AAT ∈ Rm×m are square symmetric matrices. (If A is complex, AH A and
AAH are both square Hermitian matrices.) Thus, their eigenvalues are nonnegative.† Their nonzero eigen-
values 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 find that the singular values of A are 25.4368, 1.7226,
and 8.1079×10−16 . 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
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 m−n 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 off by three.
86
8.1. Flow Control and Logical Variables
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 finer 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, MATLAB’s programming language is so simple that it can be learned quite easily and quickly.
†
<expression> can be a matrix in which case each column vector is stored one at a time in i.
87
8.1. Flow Control and Logical Variables
where rop is one of the r elational operators shown below. Some examples of logical expressions are
i == 5
x(i) >= i
imag(A(i,i)) = 0
˜
sin(1) - 1 > x(1) + x(i) 3
ˆ
Warning: String variables cannot be easily compared by == or =.† Instead, if a and b are text vari-
ables, enter ˜
>> strcmp(a, b)
The result is true if the two character strings are identical and false otherwise.
†
Compare the results of
0
>> Yes 0 == 0 yes 0
and
0
>> Yes 0 == 0 no 0
88
8.1. Flow Control and Logical Variables
Relational Operators
89
8.1. Flow Control and Logical Variables
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”. Fre-
quently — 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 in-
stead of a logical variable. The preferred ways to set a logical variable are the following. The logical vari-
able 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 difference 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
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 exam-
ple, 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.
90
8.1. Flow Control and Logical Variables
Flow Control
true Generates a logical matrix with all elements having the logical value true.
Use true or true(n) or true(m, n).
false Generates a logical matrix with all elements having the logical value false.
Use false or false(n) or false(m, n).
91
8.2. Matrix Relational Operators and Logical Operators
Although MATLAB does have a quite powerful programming language, it is needed much less fre-
quently 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, MATLAB’s relational and logical operators can also be applied to vectors and matrices. In this
way, algorithms that would normally require flow control for coding in most programming languages can
be coded using simple MATLAB commands.
If A, B ∈ Rm×n then the relational equation
>> C = A rop B
is evaluated as cij = aij rop bij , where rop is one of the relational operators defined 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 defined 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 efficiently 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
n
cij =
0 otherwise.
Since the number of ones is the result we want, simply enter
>> sum( sum( F > 0.5 ) )
or
>> sum(sum(C))
or
>> sum(C(:))
And suppose we want to replace all the elements of F which are ≤ 0.5 by zero. This is easily done by
>> F = F.*(F > 0.5)
92
8.2. Matrix Relational Operators and Logical Operators
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 ma-
trix where some property is satisfied. 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 finds 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 ele-
ment 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)
first transforms A to a column vector (i.e., A(:) ) and then determines the locations of the nonzero ele-
ments. 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 find 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 find the elements of a vector or a matrix which satisfy a more general property than being
nonzero. For example, to find the locations of all the elements of x which are greater than 5 enter
>> find(x > 5)
and to find 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 find 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 different 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 el-
ements we want to zero out, whereas D is a matrix of ones and zeroes which explicitly shows which el-
ements 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
93
8.2. Matrix Relational Operators and Logical Operators
94
8.3. Function M-files
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 ex-
ample, 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 finite. To determine if the matrix A even exists, enter
exist( 0 A 0 )
See the table below for more details and more functions.
Logical Functions
all True if all the elements of a vector are true; operates on the columns of a
matrix.
any True if any of the elements of a vector are true; operates on the columns of a
matrix.
exist( 0 <name> 0 ) False if this name is not the name of a variable or a file. If it is, this function
returns:
1 if this is the name of a variable,
2 if this is the name of an m-file,
5 if this is the name of a built-in MATLAB function.
isequal Tests if two (or more) arrays have the same contents.
find The indices of a vector or matrix which are nonzero.
logical Converts a numeric variable to a logical one.
ischar True for a character variable or array.
isempty True if the matrix is empty, i.e., [].
isfinite Generates a matrix with 1 in all the elements which are finite (i.e., not Inf or
NaN ) and 0 otherwise.
isinf Generates a matrix with 1 in all the elements which are Inf and 0 otherwise.
islogical True for a logical variable or array.
isnan Generates a matrix with 1 in all the elements which are NaN and 0 otherwise.
95
8.3. Function M-files
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-files which have been executed. Each function m-file 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 flexibility 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 modified in the function without affecting 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-
mand that executes the function.
Comment lines should immediately follow. A comment line begins with the percent character, i.e., “%”.
All comment lines which immediately follow the function definition 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 file is printed out. In addition, the first line of documentation, i.e., the second line of the file,
can be searched for keywords by entering
>> lookfor <keyword>
Make sure this first comment line contains the name of the command and important keywords which de-
scribe its purpose.
Note: Comments can be placed anywhere in an m-file, including on a line following a MATLAB state-
ment. The initial comment lines in a script file and the comment lines in a function file which
immediately follow the first 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 be-
fore it trips you up: how does MATLAB find the m-files 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 file. (We discuss all these terms shortly.)
(3) It checks if the file <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 file <function name>.m exists in this subdirectory.
(5) It searches the directories in the search path for the file <function name>.m.
Note from (3) that MATLAB searches in the current directory for the function by searching for the m-
file with the same name. If the m-file is not in the current directory, the simplest way to enable MATLAB
to find 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 modified by the func-
tion. If an input variable is not modified, 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 benefit of “call by value”
without any unnecessary overhead. And how does MATLAB know if an input argument is modified? It can only
be modified if it appears on the left-hand side of an equal sign inside the function!
96
8.3. Function M-files
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 first directory searched (unless the search path has been modified).
Thus, you can put your m-files in this subdirectory and be sure that MATLAB will find them. You can
also add directories to the search path by
>> path( 0 new directory 0 , path)
or
>> path(path, 0 new directory 0 )
(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( 0 new directory #1 0 , 0 new directory #2 0 , ...)
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 file
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 first line of the documentation includes the
name of the function as well as a brief description that lookfor uses. The following lines of documenta-
tion 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 defining H to be an n×n matrix. Although not essential, this statement can greatly in-
crease 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 find
that
>> prealloc(100000, true);
runs over 1600 (that’s right, sixteen hundred) times as fast as
>> prealloc(100000, false);
√
Note that i and j are redefined from −1 since they appear as for loop indices. However, since i
and j are local to this function, this does not have any effect when this command is executed. Also, the
97
8.3. Function M-files
We can “spruce” this function up to have default values for ξ and a and also to calculate its derivative
with the following function file.
function [out1, out2] = spruce(x, xi, a)
% spruce: a silly function to make a point, f(x,b,a) = sin(x)*exp(-a*(x-b) 2)
% if only x is input, xi = 0 and a = 1
ˆ
% if only x and xi are input, a = 1
% if only one output argument, f(x,xi,a) is calculated
% if two output arguments, f(x,xi,a) and f’(x,xi,a) are calculated
if nargin == 1
xi = 0;
a = 1;
elseif nargin == 2
a = 1;
end
out1 = exp(-a.*(x-xi). 2).*sin(x);
if nargout == 2
ˆ
out2 = exp(-a.*(x-xi). 2).*(cos(x) - 2.*a.*(x-xi).*sin(x));
end
ˆ
If there is only one input argument then ξ is set to 0 and a is set to 1 (which are useful default val-
ues) while if there are only two input arguments then a is set to 1. If there is only one output argument
98
8.3. Function M-files
then only f (x) is calculated, while if there are two output arguments then both f (x) and f 0 (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 )e−a(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 vec-
tors, then the function is
2
f (xi , ξi , ai ) = sin(xi )e−ai (xi −ξi ) 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 cer-
tainly 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 proficient 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-file
you have a sequence of statements which normally end with semicolons so that you do not see the inter-
mediate calculations. What do you do if the result is incorrect? In other words, how do you debug your
m-file?
There are a number of simple techniques you can use and we discuss them in turn. In a script m-file
intermediate calculations are normally not printed out, but they are still available to look at. This can fre-
quently lead to an understanding of where the calculation first went wrong. However, this is not true of
function m-files since all the local variables in the function disappear when the function ends. Of course,
with any m-file 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 infinite loop). And it is usually impossible to read the out-
put 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-file 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 off 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( 0 Press Enter to continue 0 , 0 s 0 );
pauses the code and also reminds you that it has been paused.
The echo command is also useful for debugging script and function m-files, especially when if state-
ments are involved. Typing
>> echo on
turns on the echoing of statements in all script files (but not printing the results if the statements end
with semicolons), and echo off turns echoing off again. However, this does not affect function files. 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
99
8.3. Function M-files
The keyboard command is also very useful for debugging m-files. It stops execution of the m-file,
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 function’s workspace. If de-
sired, 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-file, enter
K>> return
To terminate both the “keyboard” session and the execution of the m-file, 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 ex-
ample, 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
Now we want to discuss the arguments in a MATLAB function, since they are are used somewhat differ-
ently 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 lo-
cal to the function and so can be modified without affecting 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,
100
8.3. Function M-files
101
8.3. Function M-files
102
8.3. Function M-files
fncz1 c(y) is evaluated as fncz1(y, alpha, beta, Gamma, omega). This discussion of saving parame-
ters 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 first 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 final — but very important — technical detail about function m-files concerns an important ele-
ment 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 off into a new func-
tion 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 different files so that each function and its file name agree;
otherwise, MATLAB cannot find the function. This can be annoying if a number of files have to be cre-
ated: for example, it can be difficult to remember the purpose of all these functions, and it can be difficult
to debug the primary function. MATLAB has a feature to handle this proliferation of files; function m-
files can contain more than one function. The first function in the file is called the primary function and
its name must agree with the name of the file. 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 definition line (i.e., the line which
begins with the keyword function ). It is possible to end the primary function and each subfunc-
tion 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 file. Thus, different m-files can contain subfunctions with the same name. Also,
the help, lookfor, and type commands can only access the primary file. It is crucial to understand
that variables in the primary function or in a subfunction are local to that function and unknown out-
side 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 sufficient — and they are much easier to describe. When they are not suffi-
cient, 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++.
103
8.3. Function M-files
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 sub-
function 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 func-
tion m-file. The scope of a variable is the context within which it is defined, i.e., where it can be set, mod-
ified, 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 7–15) and nest 2 (lines 16–23) have access to the variables p1, p2,
and p3 of the primary function (lines 1–26). 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
104
8.3. Function M-files
†
Since MATLAB contains thousands of functions, this means you do not have to worry about one of your sub-
functions 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-file) 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-file.
105
8.3. Function M-files
use the new function we are testing in the subdirectory “private”, rather than MATLAB’s 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 final topic we will briefly discuss involves recursion. It is possible — and sometimes useful — for a
function to call itself. As a simple example, consider the Fibonacci sequence
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 inefficient. We have provided it simply to show how recursion can
lead to a very compact code. The reason this code is very inefficient is because it uses an in-
credibly 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
106
8.4. Odds and Ends
107
8.5. Advanced Topic: Vectorizing Code
>> A = zeros(5,6)
>> A = feval( 0 zeros 0 , 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, 0 -- 0 , xx, y3, 0 : 0 )
...
There are two common ways to pass the function <type of plot> in the argument list:
(1) use a character string, e.g., feval( 0 loglog 0 , ...), 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( 0 zeros 0 , 5, 6) can always be replaced by
eval( 0 zeros(5,6) 0 ). However, there is a fundamental difference 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 efficient, especially if the string must
be evaluated many times inside a loop.
108
8.5. Advanced Topic: Vectorizing Code
As a simple example of method (0), consider the function hilb on page 97. 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 = J0 ; % 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 inter-
vals in y where yi > R. What is the average length of these intervals and what is their standard devia-
tion? Also, only include intervals which lie completely within y (i.e., ignore any intervals which begin or
end y ). It is not difficult to write such a code using flow 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.
109
9. Sparse Matrices
Finally, the question remains: is the time savings significant? 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 ele-
ments 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.
profile Profile 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 exam-
ple, if T ∈ Cn×n is a tridiagonal matrix, then the maximum number of nonzero elements is 3n−2. 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 sig-
nificantly 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
110
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
S−1 , which is generally a full matrix; instead, you can use condest which estimates the condition number
by using Gaussian elimination. You have two alternatives: first, 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 ∈ Cm×n 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
n −2
n−1 −4 0
n−2 −6
S= .. ..
. .
2 −2n + 2
0 1
i j si,j i j si,j
1 1 n 1 2 −2
2 2 n−1 2 3 −4
3 3 n−2 3 4 −6
.. .. .. .. .. ..
. . . . . .
n−1 n−1 2 n−2 n−1 −2n + 4
n n 1 n−1 n −2n + 2
111
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 difficulty 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
can be generated as a sparse matrix by
>> A = diag([1:4], -1) + diag([6:8], 2)
>> S1 = sparse(A)
or by
>> B = [ [1:4] 0; 0 0 [6:8] ] 0
>> S1 = spdiags(B, [-1 2], 5, 5)
In the latter case note that the columns of B have to be padded with zeroes so that each col-
umn has five elements, whereas in the former case the vector which becomes the particular
diagonal precisely fits into the diagonal. The element s1,3 of S1 contains the value 6. It ap-
pears in the 3-rd row of B because it occurs in the 3-rd column of S1. Note that the element
bn,2 is not used since it would go into the element sn,n+1 .
A slight variation of the above command is
>> T = spdiags(B, d, S)
where T is equated to S and then the columns of B are placed in the diagonals of T specified by d.
Thus, a third way to generate the matrix S given above is
>> S = spdiags([n:-1:1] 0 , [0], n, n)
>> S = spdiags([0:-2:-2*n+2] 0 , [1], S)
Just as with the diag command, we can also extract the diagonals of a sparse matrix by using
spdiags. For example, to extract the main diagonal of S, enter
>> B = spdiags(S, [0])
The number of nonzero elements in the sparse matrix S are calculated by
>> nnz(S)
(Note that this is not necessarily the number of elements stored in S because all these elements are
checked to see if they are nonzero.) The locations and values of the nonzero elements can be obtained
by
>> [iA, jA, valueA] = find(A)
The locations of the nonzero elements is shown in the graphics window by entering
>> spy(S)
These locations are returned as dots in a rectangular box representing the matrix which shows any struc-
ture in their positions.
All of MATLAB’s intrinsic arithmetic and logical operations can be applied to sparse matrices as well
as full ones. In addition, sparse and full matrices can be mixed together. The type of the resulting matrix
depends on the particular operation which is performed, although usually the result is a full matrix. In
addition, intrinsic MATLAB functions often preserve sparseness.
You can generate sparse random patrices by sprand and sparse, normally distributed random matri-
ces by sprandn. There are a number of different arguments for these functions. For example, you can
generate a random matrix with the same sparsity structure as S by
>> sprand(S)
or you can generate an m×n matrix with the number of nonzero random elements being approximately
ρmn by
>> sprand(m, n, rho)
112
10.1. Basic Commands
Finally, you can generate sparse random symmetric matrices by sprandsym; if desired, the ma-
trix will also be positive definite. (There is no equivalent command for non-sparse matrices so use
full(sprandsym(...))
Additionally, sparse matrices can be input from a data file with the spconvert command. Use
csvread or load to input the sparsity pattern from a data file into the matrix <sparsity matrix>.
This data file should contain three columns: the first 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 file
should be “ m n 0” where the desired size of S is m×n. (This element will not be used, since its value is
zero, but the size of the matrix will be adjusted.)
speye Generates a sparse identity matrix. The arguments are the same
as for eye.
sprand Sparse uniformly distributed random symmetric matrix; the ma-
trix can also be positive definite.
sprandn Sparse normally distributed random matrix.
sparse Generates a sparse matrix elementwise.
spdiags Generates a sparse matrix by diagonals or extracts some diagonals
of a sparse matrix.
full Converts a sparse matrix to a full matrix.
find Finds the indices of the nonzero elements of a matrix.
nnz Returns the number of nonzero elements in a matrix.
spfun( 0 <function name> 0 , A) Applies the function to the nonzero elements of A.
spy Plots the locations of the nonzero elements of a matrix.
spconvert Generates a sparse matrix given the nonzero elements and their
indices.
sprandsym Generates a sparse uniformly distributed symmetric random ma-
trix; the matrix can also be positive definite.
y 00 + αy 0 − y(1 − βy 2 ) = Γ cos ωt ,
113
10.1. Basic Commands
which is called Duffing’s equation. This ode has many different types of behavior depending on the values
of the parameters α, β, Γ, and ω.
As written, this is not in the form of a first-order system. To transform it we define y1 = y and
y2 = y10 = y 0 so that
y10 = y2
y20 = y100 = y 00 = y1 (1 − βy12 ) − αy2 + Γ cos ωt
or
0
y1 y2
= .
y2 y1 (1 − βy12 ) − αy2 + Γ cos ωt
Note: This same “trick” can be applied to an n-th order by defining y1 = y, y2 = y10 , y3 = y20 , . . . ,
0
yn = yn−1 .
Before discussing how to solve Duffing’s equation specifically, we discuss the commands which solve
time-evolution odes. To obtain a numerical solution to a time-evolution first-order ode system, enter
>> <ode solver>(<function handle>, tspan, y0)
or
>> [t, Y] = <ode solver>(<function handle>, tspan, y0)
or
>> sol = <ode solver>(<function handle>, tspan, y0)
First, we have to choose which of the ode solvers to use, which is discussed in detail shortly. It would be
possible for MATLAB itself to decide which numerical method to employ. However, there are good rea-
sons why the decision should be left in the hand of the user.
Warning: Make sure you understand how to enter the name of the function handle. This is discussed at
length in section 3.2, and we also briefly discuss it below.
All of the solvers use the same input and output arguments, which we now discuss. The input parame-
ters are:
function The name of the function handle that calculates f(t, y).
tspan The vector that specifies the time interval over which the solution is to be calculated. If this
vector contains two elements, these are the initial time and the final time; in this case the
ode solver determines the times at which the solution is output. If this vector contains more
than two elements, these are the only times at which the solution is output.
Note: the final time can be less than the initial time, in which case the trajectory is moving
backwards in time.
y0 The vector of the initial conditions for the ode.
If there are no output parameters, the individual elements of the solution, i.e., y1 (t), y2 (t), . . . , yn (t),
are plotted vs. t on a single plot. The circles on the trajectories show the actual times at which the solu-
tion is calculated.
If there are two output parameters, these are:
t The column vector of the times at which the solution is calculated.†
Y The matrix which contains the numerical solution at the times corresponding to t. The first
column of Y contains y1 , the second column y2 , etc.‡
If there is one output parameter, then it is a structure. The output is now
sol.x The column vector of the times at which the solution is calculated.
sol.y The matrix which contains the numerical solution at the times corresponding to t.
There are seven distinct ode solvers which can be used, as shown in the table below. All these ode
solvers use an adaptive step size to control the error in the numerical solution. Each time step is chosen
to try to keep the local error within the prescribed bounds as determined by the relative error and the
absolute error tolerances (although it does not always succeed). That is, ei , which is the error in yi , is
supposed to satisfy
ei ≤ max{ RelTol · |yi |, AbsTol(i) }
†
The t in [t, Y] is unrelated to the t argument in the function duffing.
‡
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.
114
10.1. Basic Commands
where the default value of RelTol is 10−3 and of the vector AbsTol is 10−6 for each element. (How-
ever, there is no guarantee that the error in the numerical calculation actually satisfies this bound.)
ODE Solvers
It is up to you to decide which ode solver to use. As a general rule, unless you believe that the ode is
stiff (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 stiff, or if these two non-stiff solvers fail, then try ode15s.
And what is a stiff ode? There is no precise definition. Instead, we say it is stiff if the time step re-
quired 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
with the initial conditions y(0) = η1 and y 0 (0) = η2 . The solution to this ode is
y(t) = c1 et + c2 e−1000t
where
1 1
c1 = (η1 − η2 ) and c2 = (1000η1 + η2 ) .
1001 1001
There are two time scales in this solution: there is a rapid decay due to the e−1000t 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
calculated accurately (i.e., ∆t 1/1000 ). However, soon it will be negligible and the time step should in-
crease so that it calculates the slow growth accurately (i.e., ∆t 1 ). However, if a non-stiff 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 stiff 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 00 + 1001y 0 + 1000y = 0
whose solution is
y(t) = c1 e−t + c2 e−1000t .
Initially, the time step will be “very small” so that the rapid decay is calculated accurately (i.e.,
∆t 1/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 00 − 1001y 0 + 1000y = 0
whose solution is
y(t) = c1 et + c2 e1000t .
115
10.1. Basic Commands
the time step must always be “very small” so that the rapidly growing mode e1000t is calculated accu-
rately (i.e., ∆t 1/1000 ). Thus, this is not a stiff ode.
The above examples are very simple. They are only designed to show that an ode is stiff if there is a
rapidly decaying mode and any growth in the solution occurs on a much slower time scale. (This fre-
quently 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 Pol’s equation, a
second-order ode which is either non-stiff or stiff 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 difficulty with a stiff ode solver is that you may well have to supply the Jacobian of the ode your-
self. The Jacobian of f(t, y) is the n×n matrix
∂fi
J(t, y) = (t, y) ,
∂yj
∂fi
.
∂yj
Any of the stiff methods can approximate this matrix numerically. However, if the ode is “bad” enough,
this may not be enough. You may have to calculate all these partial derivatives yourself and include them
in your function file. (We show an example of this later.)
The reason for this large choice of ode solvers is that some odes are very, very, very nasty. It is possible
that most of the ode solvers will fail and only one, or maybe two, will succeed. SAY MORE???
To conclude this subsection, we return to Duffing’s equation. Suppose we want to solve the ode for
t ∈ [0, 100] with initial conditions y = (2, 1)T and plot the results. Since this is a very well-behaved ode
for the parameters given, we can use ode45. The simplest approach is to use an anonymous function to
input the right-hand side.
>> alpha = 0.05;
>> beta = 1.0;
>> Gamma = 0.5;
>> omega = 1.0;
>> duffing a = @(t, y)[y(2) ; y(1)*(1-beta*y(1) 2)-alpha*y(2)+Gamma*cos(omega*t)];
>> ode45(duffing a, [0 100], [2 1]);
ˆ
(The “a” denotes the fact that duffing a is an anonymous function handle.) The solution will now be
plotted as y1 and y2 vs. t. (This plot is rather “cluttered” because, not only is the trajectory plotted,
but in addition markers are put at each of the points of the numerical solution.)
Warning: There are a number of parameters which are needed by the function and these must be de-
fined before the function is created. Also, the function handle duffing a will always use these
parameters, even if they are later changed.
Note: Since duffing a is already a function handle, we merely need to use its name as the first argument
to ode45.
To obtain complete control over what is plotted, you should let ode45 output the trajectory and do the
plots yourself. This is easily accomplished by changing the last line of the previous code to
>> [t, Y] = ode45(duffing a, [0 100], [2 1]);
>> figure(1)
>> subplot(2, 1, 1)
>> plot(t, Y(:,1))
>> subplot(2, 1, 2)
>> plot(t, Y(:,2))
>> figure(2)
>> plot(Y(:,1), Y(:,2))
This results in a plot of y vs. t and a separate plot of y 0 vs. t, so that both plots are visible even if
they have vastly different scales. There is also a separate plot of y 0 vs. y, which is called a phase plane.
116
10.1. Basic Commands
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 ap-
proach (of using a nested function) requires more coding that the first approach (of using an anonymous
function). However, the first approach only works if the right-hand side can be defined using one MAT-
LAB 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-file (i.e., a primary function) which
calculates the right hand side of this ode system.
function deriv = duffing p(t, y)
% duffing p: Duffing’s 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 de-
fined in the m-file so that it will have to be modified whenever we want to modify the parameters. This is
a very bad approach because this file will have to be repeatedly modified.
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 Duffing’s equation are determined in the function
itself. We should be able to “explore” the rich behavior of Duffing’s 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 file.
function deriv = duffing p2(t, y, alpha, beta, Gamma, omega)
% duffing p2: Duffing’s 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 file). 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.
117
10.2. Advanced Commands
To see a sampling of the different type of behavior in Duffing’s 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 set-
tles 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.) How-
ever, 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 find periodic motion with a period of 6π. This is
just a sampling of the behavior of Duffing’s equation in different parameter regions.
By the way, to separate the initial transient behavior from the long-time behavior, you can use the
script m-file
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))
118
10.2. Advanced Commands
odeset( 0 <Prop 1> 0 , Assigns values to properties; these are passed to the ode solver when it is
<Value 1>, ...) executed.
AbsTol 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: 10−6 .)
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 possi-
ble 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:
0
odeplot 0 which generates a plot of time versus all the components of the trajectory,
i.e., t vs. y1 , y2 , . . . , yn ;
0
odephas2 0 which generates a plot of y1 vs. y2 , i.e., Y(:,1) vs. Y(:,2);
0
odephas3 0 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 different components of y using OutputSel.
OutputSel A vector containing the components of Y which are to be passed to the function speci-
fied by the OutputFcn parameter.
Refine Refines 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: 10−3 ).
Stats Whether statistics about the run are output on the terminal (value: 0 on 0 ) after the
trajectory is calculated or they are not (value: 0 off 0 ). (Default value: 0 off 0 .)
For example, if you want to use ode45 with the relative error tolerance set to 10−6 for Duffing’s equa-
tion, enter
>> params = odeset( 0 RelTol 0 , 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( 0 RelTol 0 , 1.e-6, 0 Stats 0 , 0 on 0 );
>> [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 eval-
uated 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 satisfies a particular con-
dition: 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 Duffing’s equation passes
through y1 = ±0.5. That is, we define an “event” to be whenever the first component of y passes
119
10.2. Advanced Commands
through −0.5 or +0.5. This can be done by modifying the primary function duffing ode and replac-
ing the ode45 statement by
params = odeset( 0 RelTol 0 , 1.e-6, 0 Events 0 , @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 define the right-hand side of Duffing’s 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 earth’s orbit, the calculation is more complicated.
isterminal – A column vector determining whether the ode solver should terminate when this par-
ticular 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 final step is that the left-hand side of the calling statement must be modified 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)
(0) y1 + 0.5
e = (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 calcu-
lated and compared elementwise to e(0) . If the values have different 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
120
10.2. Advanced Commands
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 Pol’s equation
y 00 − µ(1 − y 2 )y 0 + y = 0
121
10.2. Advanced Commands
where g = 9.8 meters/second is the acceleration on the ball due to the earth’s gravity. The initial condi-
tions are
x(0) = 0 , x0 (0) = s cos α , z(0) = 0, and z 0 (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 ball’s flight: 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 val-
ues 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 ex-
ample of how to use many of the advanced features of MATLAB’s ode solvers. (If we would include the
effects of air resistance on the ball, then these odes would become nonlinear and would not be solvable
analytically.) We convert Newton’s laws to the first-order system
0
y1 y2
y2 0
=
y3 y4
y4 −g
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 final 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 10−6 . 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.
122
10.2. Advanced Commands
where P (t), Q(t), and R(t) are polynomials with no common factors. The singular points of this
ode are the values of t for which P (t) = 0. If t0 is a singular point, it is a regular singular point if
limt→t0 (t − t0 )Q(t)/P (t) and limt→t0 (t − t0 )2 R(t)/P (t). A “common” ode of this type is Bessel’s equa-
tion
t2 y 00 (t) + ty 0 (t) + (t2 − n2 )y(t) = 0 for t ≥ 0 (10.1)
123
11. Boundary-Value Ordinary Differential Equations
where n is a nonnegative integer and the initial condition is given at t = 0. The solution is denoted by
Jn (t) and, for specificity, 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 (0) and for this example we choose y 0 (0) = 1.
If we write Bessel’s equation as
n2
00 1 0
y (t) + y (t) + 1 − 2 y(t) = 0 (10.2)
t t
we clearly have a problem at t = 0 and for t ≈ 0. The ode solvers we discussed previously can han-
dle (10.2) for t ≥ 1 with the initial conditions that y(1) and y 0 (1) are given. However, a completely
different method of solution is required for t ≥ 0 and the form (10.1) is preferred to (10.2).
When we convert Bessel’s equation to the first order system we again let y1 (t) = y(t) and y2 (t) = y 0 (t)
and leave the t2 in the numerator to obtain
0
y1 y2
=
t2 y20 −ty2 − (t2 − 1)y1
Previously, we have always written the first-order system as y0 = f(t, y), but this form has a problem
when t = 0. Instead, we write it as g(t, y, y0 ) = 0 so that
y10 − y2
g(t, y, y0 ) = 2 0 .
t 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
y0 (0) = y10 (0), y20 (0) . It is easy to calculate y10 (0) = y2 (0), but y20 (0) ≡ y 00 (0) is more complicated.
Differentiate (10.1) with respect to t to obtain
t2 y 0000 (t) + 5ty 000 (t) + (t2 + 3)y 00 (t) + 4ty 0 (t) + 2y(t) = 0 .
Now set t = 0 to obtain y 00 (0) = 0. We can solve Bessel’s equation for t ∈ [0, 10] by
>> g = @(t, y, yp) [yp(1)-y(2);t 2 *yp(2)+t*y(2)+(t 2 -1)*y(1)];
>> tspan = [0 10]
ˆ ˆ
>> y0 = [0;1]
>> yp0 = [1;0]
>> [t,Y] = ode15i(g, tspan, y0, yp0)
>> plot(t, Y(:,1))
ode15i Stiff ode solver for the fully implicit ode f(t, y, y 0 ) = 0.
d
y = f(x, y) for x ∈ [a, b]
dx
124
11. Boundary-Value Ordinary Differential Equations
where y ∈ Rn but conditions are given at both ends of the interval. If the boundary conditions are sep-
arated, 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
differential equations
d2 y dy
(x) + 2 (x) + ey(x) = 0 (11.1a)
dx2 dx
and
d2 y dy
(x) + 2 (x) + ey(x) = 0 (11.1b)
dx2 dx
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 (0) = 4 and y 0 (1) = −7 by
y 0 (0) − 4
φ y(0), y(1) = =0. (11.3)
y 0 (1) + 7
Or we could use the mixed boundary conditions y(0) − y 0 (0) = 1 and y(1) + 2y 0 (1) = 3 by
y(0) − y 0 (0) − 1
φ y(0), y(1) = =0. (11.4)
y(1) + 2y 0 (1) − 3
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];
125
11. Boundary-Value Ordinary Differential Equations
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 maxi-
mum value A then y(x) = y1 (x) = 4Ax(1 − x) and y 0 (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 fieldnames of the struc-
ture solinit. However, it works for now.
We are finally ready to solve this ode by
%%%%% script m-file: nlode1 >> global which ode eps
>> global A
>> which ode = 1;
>> A = 1;
>> eps = 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,:), 0 r 0 )
Having done all this work, we now combine everything into the function m-file nlode all to show how
126
11. Boundary-Value Ordinary Differential Equations
much easier it is to use nested functions and to combine everything into one primary function.
function sol = nlode all(which ode, eps, A, nr points)
% nlode all: boundary-value solver using bvp4c
% which ode = 1 y’’ + 2 y’ + eps exp(y) = 0, y(0) = y(1) = 0
% = 2 eps 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,:), 0 r 0 )
%%%%% 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); -eps*exp(y(1))-2*y(2)];
else
yp = [y(2); -(exp(y(1))+2*y(2))/eps];
end
end
function bc = nlode bc(ya, yb)
bc = [ya(1); yb(1)];
end
end
This m-file 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 final point needs to be emphasized. Sometimes, any “halfway decent” initial choice of y will con-
verge to a solution. In fact, this is true for our example — but it is not true for many examples. Some-
times it takes a “good” initial choice to obtain convergence; a “bad” choice will never converge to the de-
sired 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 difficulty 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 (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 difficult to determine “good” initial guesses when 1 since the solu-
tion 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 (0) ≈ 130 and when = 0.001 we have y 0 (0) ≈ 1300. In conclusion, we want to remind you that for
127
12. Polynomials and Polynomial Functions
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 find an ode for which this is not true.
Boundary-Value Solver
is represented by the vector q = (c1 , c2 , . . . , cn )T . You can easily calculate the roots of a polynomial by
>> r = roots(q)
Conversely, given the roots of a polynomial you can recover the coefficients of the polynomial by
>> q = poly(r)
Warning: Note the order of the coefficients in the polynomial. c1 is the coefficient of the highest power of
x and cn is the coefficient of the lowest power, i.e., 0.
The polynomial can be evaluated at x by
>> y = polyval(q, x)
where x can be a scalar, a vector, or a matrix. If A is a square matrix, then
is calculated by
>> polyvalm(q, A)
(See section 15 for more details on this type of operation.)
A practical example which uses polynomials is to find the “best” fit to data by a polynomial of a partic-
ular degree. Suppose the data points are
(−3, −2), (−1.2, −1), (0, −0.5), (1, 1), (1.8, 2)
and
we want to find the “best” fit by a straight line. Defining the data points more abstractly as
(xi , yi ) i = 1, 2, . . . , n and the desired straight line by y = c1 x + c2 , the matrix equation for the
straight line is
x1 1 y1
x2 1 c1 y2
.
.. .. = .. .
. c2 .
xn 1 yn
128
12. Polynomials and Polynomial Functions
In general, there is no solution to this overdetermined linear system. Instead, we find 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, 0 o 0 )
We can find the “best” fit by a polynomial of degree m < n, i.e., y = c1 xm + c2 xm−1 + · · · + cm+1 , by
calculating the least-squares solution to
Vc = y
where xm
1 x1m−1 ··· x1 1
c1
xm
2 xm−1
2 ··· x2 1 c2
V=
.. .. .. .. ... .
and c =
. . . .
xm
n xm−1
n ··· xn 1 cn
The matrix V is called a Vandermonde matrix . The statement
>> V = vander(x);
generates the square Vandermonde matrix with m = n − 1. To generate the n×(m − 1) Vandermonde
matrix we want, enter
>> V = vander(x)
>> V(: , 1:m-1) = [];
This entire procedure can be carried out much more easily by entering
>> q = polyfit(x, y, m-1)
where the third argument is the order of the polynomial (i.e., the number of coefficients in the polyno-
mial).
Warning: The Vandermonde matrix is approximately as badly conditioned as the Hilbert matrix
which was discussed in section 5.2. For example, cond(vander([1 : 10])) = 2×1012 whereas
cond(hilb(10)) = 2×1013 .
You can also find a local maximum or minimum of the polynomial p(x) by finding the zeroes of p0 (x).
The coefficients of p0 (x) are calculated by
>> polyder(q)
where q is the vector of the coefficients
of p(x).
Given a set of data points (xi , yi ) there is sometimes a need to estimate values that lie within these
data points (this is called interpolation) or outside them (this is called extrapolation). This estimation is
generally done by fitting data which is “near” the desired value to a polynomial and then evaluating this
polynomial at the value.
There are a number of commands to interpolate data points in any number of dimensions. The simplest
command in one dimension to interpolate the points (xi , yi ) 1 ≤ i ≤ n is
>> yvalues = interp1(x, y, xvalues, <method>)
where xvalues is a vector of the values to be interpolated, yvalues is the vector of the interpolated
values, and <method> is an optional argument specifying the method to be used. One additional require-
ment for this command is that the elements of x are monotonic, i.e., either all in increasing order or in
decreasing order, to make it easy for the function to determine which data points are “near” the desired
value. Five of the interpolation methods which can be used are the following:
0
nearest 0 : The interpolated value is the value of the nearest data point.
0
linear 0 : Linear splines are used to connect the given data points. That is, straight lines connect
each pair of adjacent data points. (This is the default.)
0
spline 0 : 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 first and second derivatives at this point.
129
13. Numerical Operations on Functions
0
pchip 0 : 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 par-
ticular, 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.
0
cubic 0 : 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 first 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 fifth argument:
• If the fifth argument is a number, this value is returned whenever the value lies outside the interval.
• If the fifth argument is 0 extrap 0 , 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.
Polynomial Functions
interp1(x, y, xvalues, <method>) Interpolates any number of values using the given data
points and the given method.
interp2 Interpolates in two dimensions.
interp3 Interpolates in three dimensions.
interpn Interpolates in n dimensions.
pchip Cubic Hermite interpolation.
poly(<roots>) Calculates the coefficients of a polynomials given its roots.
polyder(q) Calculates the derivative of a polynomial given the vector of
the coefficients of the polynomial.
polyfit(x, y, <order>) Calculates the coefficients of the least-squares
polynomial
of
a given order which is fitted to the data (xi , yi ) .
polyval(q, x) Evaluates the polynomial p(x).
polyvalm(q, A) Evaluates the polynomial p(A) where A is a square matrix.
ppval evaluates the piecewise polynomial calculated by pchip or
spline.
roots(q) Numerically calculates all the zeroes of a polynomial given
the vector of the coefficients of the polynomial.
spline Cubic spline interpolation.
vander Generates the Vandermonde matrix.
130
13. Numerical Operations on Functions
Then we can use closure, as already discussed in section 10.1, so that the parameters can be set outside of
fzero. This is easily done by entering
>> a = ???;
>> b = ???;
>> fcos c = @(x) fcos p(x, a, b);
>> yzero = fzero(fcos p, xstart);
The parameters a and b are determined when the function fcos c is generated and so are passed indi-
rectly into fzero
MATLAB can also find a local minimum of a function of a single variable in an interval by
>> fminbnd(<function handle>, xmin, xmax)
As with fzero, the full argument list is
>> fminbnd(<function handle>, xmin, xmax, options)
MATLAB can also find a local minimum of a function of several variables by
131
13. Numerical Operations on Functions
Instead, we can find a minimum of g(x) = f12 (x) + f22 (x). If the minimum value is 0, we have found
a zero of f — if it is not zero, we have not found a zero of f. For example, if f is defined an an anony-
mous function the result of
>> xmin = fminsearch(f, [0 0])
is xmin = (−.1324 . . . , 1.0627 . . .). We are not done since we still have to calculate g(xmin ). This is
≈ 2.4×10−9 which is small — but is it small enough? We can decrease the termination tolerance by
>> opt = optimset( 0 TolX 0 , 1.e-8, 0 TolFun 0 , 1.e-8)
>> xmin = fminsearch(f, [0 0], opt)
Since g(xmin ) = 2.3×10−17 we can assume that we have found a zero of f.
MATLAB can also calculate definite integrals using three commands. The first is quad which uses
Rb
adaptive Simpson’s method. To evaluate a f (x) dx by Simpson’s method enter
>> quad(<function handle>, a, b)
The full argument list is
>> quad(<function handle>, a, b, tol, trace)
where tol sets the relative tolerance for the convergence test and information about each iterate is
printed if trace is non-zero.
The second is quadl which uses adaptive Gauss-Lobatto quadrature, which is a variant of Gauss
quadrature.
quadl uses the more accurate formula and so should require many fewer function evaluations. For ex-
ample, quad calculates the exact integral (up to round-off errors) for polynomials of degree five whereas
quadl calculates the exact integral (up to round-off errors) for polynomials of degree nine.
The third is quadgk which uses adaptive Gauss-Kronrod quadrature. This command is more general
than the previous two because it is much more general:
• The interval can be half-infinite (i.e., a = −∞ or b = +∞ ) or fully infinute ( a = −∞ and
b = +∞ ).
• In addition the integrand can have an integrable singularity.
For example, the error in
>> f = @(x) 1./(1 + x. 2);
>> quadgk(f, 0, inf)
ˆ
is 8.8818×10−16 (the actual value is 2π ) and the error in
>> g = @(x) exp(sqrt(x))/sqrt(x);
>> quadgk(g, 0, 1)
132
14. Discrete Fourier Transform
by
>> dblquad(<function handle>, xmin, xmax, ymin, ymax)
It can also calculate the triple integral
Z xmax Z ymax Z zmax
f (x, y, z) dxdy dz
xmin ymin zmin
by
>> triplequad(<function handle>, xmin, xmax, ymin, ymax, zmin, zmax)
133
14. Discrete Fourier Transform
where Z T
1
a0 = f (t) dt
T 0
Z T
2
ak = f (t) cos kt dt
T 0
Z T
for k ∈ N[1, ∞) .
2
bk = f (t) sin kt dt
T 0
The coefficients a0 , a1 , a2 , . . . and b1 , b2 , . . . are called the real Fourier coefficients of f , and ak and bk
are the coefficients of the k-th mode. The power of the function f (t) is†
Z T
1 f (t) 2 dt
P =
T 0
so that
∞
1X
P = |a0 |2 + |ak |2 + |bk |2 .
2
k=1
|a0 |2 if k = 0
Pk = 1 2 2
2 |ak | + |bk | if k > 0
and the frequency of the k-th mode is k/T cycles per unit time.
Since
eiαt + e−iαt eiαt − e−iαt
cos αt = and sin αt = ,
2 2i
we can rewrite the real Fourier series as the complex Fourier series
∞
X
1
− ibk )e2πikt/T + 12 (ak + ibk )e−2πikt/T
f (t) = a0 + 2 (ak
k=1
so that
∞
X
f (t) = ck e2πikt/T for all t ∈ [0, T ] (14.2)
k=−∞
where
†
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.
To understand the physical significance of power, we begin with the definition of work. Consider a particle
which is under the influence 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
~ q~v where ~v = ~r/t.
done per unit time, i.e., F
Next, consider a charge q which is moving between two terminals having a potential difference 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 =
P = .
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
1 T
Z
2
f (t) dt .
T 0
134
14. Discrete Fourier Transform
c0 = a 0
)
ck = 12 (ak − ibk ) (14.3)
for k > 0 .
c−k = 21 (ak + ibk )
The coefficients . . . , c−2 , c−1 , c0 , c1 , c2 , . . . are called the complex Fourier coefficients of f , and ck and
c−k are the coefficients of the k-th mode. (Note that these Fourier coefficients are generally complex.) We
can also calculate ck directly from f by
Z T
1
ck = f (t)e−2πikt/T dt for k = . . . , −2, −1, 0, 1, 2, . . .
T 0
Note that if f is real, then c−k = c∗k (by replacing k by −k in the above equation). The power of f (t)
is
∞
X
P = |c0 |2 + |ck |2 + |c−k |2
k=1
We can only calculate a finite number of Fourier coefficients numerically and so we truncate the infinite
series at the M -th mode. We should choose M large enough that
M
X
f (t) ≈ ck e2πikt/T for all t ∈ [0, T ] .
k=−M
M
X
f (tj ) = γk e2πiktj /T for j = 0, 1, 2, . . . , N − 1
k=−M
or, written as a first-order system,
M
X
fj = γk e2πijk/N for j = 0, 1, 2, . . . , N − 1 (14.4)
k=−M
N −1
1 X
γk = fj e−2πijk/N for k = −M, −M + 1, . . . , M . (14.5)
N j=0
The reason we have replaced the coefficients c−M , c−M +1 , . . . , cM −1 , cM by γ−M , γ−M +1 , . . . , γM −1 , γM
is that the c’s are the coefficients in the continuous complex Fourier series, eq. (14.2), and are calculated
by (14.3). The γ’s are the coefficients in the discrete complex Fourier series, eq. (14.4), and are calcu-
lated by (14.5).
†
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.
135
14. Discrete Fourier Transform
Note: To repeat: the discrete Fourier coefficient γk is a function of M , i.e., γk (M ), and is generally not
equal to the continuous Fourier coefficient ck . However, as M → ∞ we have γk (M ) → ck . For a
fixed M we generally only have γk (M ) ≈ ck as long as |k| is “much less than” M . Of course, it
takes practice and experimentation to determine what “much less than” means.
We define the discrete Fourier series by
M
X
fFS (t) = γk e2πikt/T for all t ∈ [0, 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 coefficients are calculated in MATLAB by
>> fc = fft(f)/N
where the coefficients of the discrete Fourier transform are contained in fc in the order
T
γ0 , γ1 , . . . , γM −1 , γM , γ−M , γ−M +1 , . . . , γ−2 , γ−1 .
136
14. Discrete Fourier Transform
Also, notice that fftshift correctly shifts the coefficients, whereas ifftshift does not — but
ifftshift correctly shifts the coefficients back. That is, ifftshift is the inverse of fftshift so
ifftshift(fftshift(c s)) = c s.
Warning: One of the most common mistakes in using fft is forgetting that the input is in the order
f0 , f1 , f2 , . . . , fN −1
not
γ−M , γ−M +1 , . . . , γ−2 , γ−1 γ0 , γ1 , . . . , γM −1 , γM .
There is only one difficulty 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 coefficients 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 figure below shows the cputime needed to calculate fft(f) as a function of N . Since the verti-
cal axis is logarithmic, it is clear that there is a huge difference in the time required as we vary N .The
dashed lines show the minimum and maximum asymptotic times as cn log2 n.
−4
10
cpu time (seconds)
−5
10
−6
10
dashed lines are c*n*log n; c = 2.7e−09, 2.0e−08
2
−7
10
0 200 400 600 800 1000 1200 1400 1600 1800 2000
n
137
14. Discrete Fourier Transform
For N to be even, we have to drop one coefficient, and the one we drop is γM . Now
N = 2M
M
X −1
fFS (t) = γk e2πikt/T for all t ∈ [0, T ]
k=−M
N −1
1 X
γk = fj e−2πijk/N for k = −M, −M + 1, . . . , M − 2, M − 1 .
N j=0
138
14. Discrete Fourier Transform
We now look at the Fourier spectrum of y0 by plotting the power at each frequency in
%%%%% script m-file: fft ex2
fc0 = fft(y0)/N; % Fourier spectrum of unperturbed signal
figure(2)
fc0(N/2 +1) = []; % delete k = N/2 +1 mode
power0(1) = abs(fc0(1)). 2;
ˆ
power0(2:N/2) = abs(fc0(2:N/2)). 2 + abs(fc0(N-1:-1:N/2 +1)). 2;
freq = [1:N] 0 /time;
ˆ
% the frequency of each mode
ˆ
plot(freq(1:N/2), power0, 0 r 0 ), axis([0 freq(N/2) 0 .5])
fcpert = fft(ypert)/N; % Fourier spectrum of perturbed signal
hold on
powerpert(1) = abs(fcpert(1)). 2;
ˆ
powerpert(2:N/2) = abs(fcpert(2:N/2)). 2 + abs(fcpert(N-1:-1:N/2 +1)). 2;
pause(1)
ˆ ˆ
plot(freq(1:N/2), powerpert, 0 g 0 )
(which is contained in the accompanying zip file). First, we plot the unperturbed power, power0, and
then the perturbed power, powerpert, vs. the frequency at each mode, freq. The two spikes in the plot
of the unperturbed power are precisely at 50 and 120 hertz, the signature of the two sine functions in y0.
(For simplicity in the discussion, we have deleted the power in the M -th mode by fc(N/2 +1) = [] so
that power0(k) is the power in the k−1-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 five 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 0’s
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, 0 b 0 )
figure(3)
plot(t, y0, 0 r 0 , t, ychop, 0 b 0 )
(which is contained in the accompanying zip file). ( ychop is the real part of N*ifft(fcchop) because,
due to round-off errors, the inverse Fourier transform returns a “slightly” complex result.) The result is
remarkably good considering the size of the perturbation.
139
15. Mathematical Functions Applied to Matrices
Thus,
ea11
e a22
. . 0
eA = . .
ean−1,n−1
0 eann
The MATLAB command
>> expm(A)
calculates eA if A is a square matrix. (Otherwise, it generates an error message.)
A simple example where eA occurs is in the solution of first-order ode systems with constant coeffi-
cients. Recall that the solution of
dy
(t) = ay(t) for t ≥ 0 with y(0) = yic
dt
is
y(t) = yic eat .
Similarly, the solution of
···
y (t) y (t)
1 a11 a12 a1n 1
d y2 (t) a21 a22 ··· a2n y2 (t)
.. = .. .. .. .. . for t ≥ 0 with y(0) = yic
dt
.
. . . . ..
yn (t) an1 an2 ··· ann yn (t)
140
15. Mathematical Functions Applied to Matrices
Matrix Functions
141
15. Mathematical Functions Applied to Matrices
142
Appendix: Reference Tables
These tables summarize the functions and operations described in this tutorial. The number (or num-
bers) shown give the page number of the table where this entry is discussed.
Arithmetical Operators
Special Characters
143
Appendix: Reference Tables
Getting Help
demo Runs demonstrations of many of the capabilities of MATLAB. (p. 16, 61)
doc On-line reference manual. (p. 16)
help On-line help. (p. 16)
helpdesk Loads the main page of the on-line reference manual. (p. 16)
load Loads back all of the variables which have been saved previously. (p. 16)
lookfor Searches all MATLAB commands for a keyword. (p. 16)
profile Profile 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.
(p. 110)
save Saves all of your variables. (p. 16)
type Displays the actual MATLAB code. (p. 14, 16)
who Lists all the current variables. (p. 16)
whos Lists all the current variables in more detail than who. (p. 16)
C Abort the command which is currently executing (i.e., hold down the control key
ˆ and type “c”). (p. 16)
Predefined Variables
ans The default variable name when one has not been specified. (p. 9)
pi π. (p. 9)
eps Approximately the smallest positive real number on the computer such that
1 + eps 6= 1. (p. 9)
Inf ∞ (as in 1/0 ). (p. 9)
NaN Not-a-Number
√ (as in 0/0 ). (p. 9)
i √ −1 . (p. 9)
j −1 . (p. 9)
realmin The smallest “usable” positive real number on the computer. (p. 9)
realmax The largest “usable” positive real number on the computer. (p. 9)
Format Options
144
Appendix: Reference Tables
abs Absolute value (p. 12, 13) coth Hyperbolic cotangent. (p. 12)
acos Inverse cosine. (p. 12) csc Cosecant. (p. 12)
acosd Inverse cosine (result in degrees). cscd Cosecant (argument in degrees).
(p. 12) (p. 12)
acosh Inverse hyperbolic cosine. (p. 12) csch Hyperbolic cosecant. (p. 12)
acot Inverse cotangent. (p. 12) exp Exponential function. (p. 12)
acotd Inverse cotangent (result in de- factorial Factorial function. (p. 12)
grees). (p. 12) fix Round toward zero to the nearest
acoth Inverse hyperbolic cosine. (p. 12) integer. (p. 12)
acsc Inverse cosecant. (p. 12) floor Round downward to the nearest
acscd Inverse cosecant (result in degrees). integer. (p. 12)
(p. 12) heaviside The Heaviside step function. (p. 12)
acsch Inverse hyperbolic cosecant. (p. 12) imag The imaginary part of a complex
angle Phase angle of a complex number. number. (p. 13)
(p. 13) log The natural logarithm, i.e., to the
asec Inverse secant. (p. 12) base e. (p. 12)
asecd Inverse secant (result in degrees). log10 The common logarithm, i.e., to the
(p. 12) base 10. (p. 12)
asech Inverse hyperbolic secant. (p. 12) mod The modulus after division. (p. 12)
asin Inverse sine. (p. 12) real The real part of a complex number.
asind Inverse sine (result in degrees). (p. 13)
(p. 12) rem The remainder after division.
asinh Inverse hyperbolic sine. (p. 12) (p. 12)
atan Inverse tangent. (p. 12) round Round to the closest integer. (p. 12)
atand Inverse tangent (result in degrees). sec Secant. (p. 12)
(p. 12) secd Secant (argument in degrees).
atan2 Inverse tangent using two argu- (p. 12)
ments. (p. 12) sech Hyperbolic secant. (p. 12)
atanh Inverse hyperbolic tangent. (p. 12) sign The sign of the real number. (p. 12)
ceil Round upward to the nearest inte- sin Sine. (p. 12)
ger. (p. 12) sind Sine (argument in degrees). (p. 12)
conj Complex conjugation. (p. 13) sinh Hyperbolic sine. (p. 12)
cos Cosine. (p. 12) sqrt Square root. (p. 12)
cosd Cosine (argument in degrees). tan Tangent. (p. 12)
(p. 12) tand Tangent (argument in degrees).
cosh Hyperbolic cosine. (p. 12) (p. 12)
cot Cotangent. (p. 12) tanh Hyperbolic tangent. (p. 12)
cotd Cotangent (argument in degrees).
(p. 12)
145
Appendix: Reference Tables
Input-Output Functions
csvread Reads data into MATLAB from the named file, one row per line of input. (p. 53)
csvwrite Writes out the elements of a matrix to the named file using the same format as
csvread. (p. 53)
diary Saves your input to MATLAB and most of the output from MATLAB to disk.
(p. 7)
fopen Opens the file with the permission string determining how the file is to be accessed.
(p. 81)
fclose Closes the file. (p. 81)
fscanf Behaves very similarly to the C command in reading data from a file using any
desired format. (p. 81)
fprintf Behaves very similarly to the C command in writing data to a file using any de-
sired format.
It can also be used to display data on the screen. (p. 81)
input Displays the prompt on the screen and waits for you to enter whatever is desired.
(p. 10)
load Reads data into MATLAB from the named file, one row per line of input. (p. 53)
print Prints a plot or saves it in a file using various printer specific formats. (p. 53)
A+B Matrix addition. (p. 7, 29) A.*B Elementwise multiplication. (p. 29)
A-B Matrix subtraction. (p. 7, 29) A. p Elementwise exponentiation. (p. 29)
A*B Matrix multiplication. (p. 7, 29)
ˆ
p. A
A n Matrix exponentiation. (p. 7, 29)
ˆ
A. B
ˆ
A\b The solution to Ax = b by Gaussian
ˆ
A./B Elementwise division. (p. 29)
elimination when A is a square non- B.\A Elementwise left division, i.e., B.\A is
singular matrix. (p. 29, 79) exactly the same as A./B. (p. 29)
A\B The solution to AX = B by Gaussian
elimination. (p. 29)
b/A The solution to xA = b where x and
b are row vectors. (p. 7, 29)
B/A The solution to XA = B. (p. 29)
146
Appendix: Reference Tables
Elementary Matrices
Specialized Matrices
147
Appendix: Reference Tables
Manipulating Matrices
cat Concatenates arrays; this is useful for putting arrays into a higher-dimensional
array. (p. 35)
clear Deletes a variable or all the variables. This is a very dangerous command.
(p. 9)
diag Extracts or creates diagonals of a matrix. (p. 25)
fliplr Flips a matrix left to right. (p. 25)
flipud Flips a matrix up and down. (p. 25)
ipermute The inverse of permute. (p. 35)
permute Reorders the dimensions of a multidimensional array. (p. 35)
spdiags Generates a sparse matrix by diagonals. (p. 113)
repmat Tiles a matrix with copies of another matrix. (p. 25)
bsxfun Performs an operation on a matrix and a vector. (p. 25)
reshape Reshapes the elements of a matrix. (p. 25)
rot90 Rotates a matrix a multiple of 90◦ . (p. 25)
squeeze Removes (i.e., squeezes out) dimensions which only have one element. (p. 35)
triu Extracts the upper triangular part of a matrix. (p. 25)
tril Extracts the lower triangular part of a matrix. (p. 25)
[] The null matrix. This is also useful for deleting elements of a vector and rows or
columns of a matrix. (p. 25)
148
Appendix: Reference Tables
Two-Dimensional Graphics
Three-Dimensional Graphics
149
Appendix: Reference Tables
150
Appendix: Reference Tables
errorbar Plots a curve through data points and also the error bar at each data point.
(p. 54)
hist Plots a histogram of the elements of a vector. (p. 54)
max The maximum element of a vector. (p. 34)
min The minimum element of a vector. (p. 34)
mean The mean, or average, of the elements of a vector. (p. 34)
norm The norm of a vector or a matrix. (p. 34)
prod The product of the elements of a vector. (p. 34)
sort Sorts the elements of a vector in increasing order. (p. 34)
std The standard deviation of the elements of a vector. (p. 34)
sum The sum of the elements of a vector. (p. 34)
& Logical AND. (p. 90) < Less than. (p. 89)
| Logical OR. (p. 90) <= Less than or equal to. (p. 89)
Logical NOT. (p. 90) == Equal. (p. 89)
˜xor Logical EXCLUSIVE OR. (p. 90) > Greater than. (p. 89)
&& A short-circuiting logical AND. (p. 90) >= Greater than or equal to. (p. 89)
|| A short-circuiting logical OR. (p. 90) = Not equal to. (p. 89)
˜
strcmp Comparing strings. (p. 89)
151
Appendix: Reference Tables
Flow Control
Logical Functions
all True if all the elements of a vector are true; operates on the columns of a matrix.
(p. 95)
any True if any of the elements of a vector are true; operates on the columns of a ma-
trix. (p. 95)
exist False if this name is not the name of a variable or a file. (p. 95)
isequal Tests if two (or more) arrays have the same contents. (p. 95)
find The indices of a vector or matrix which are nonzero. (p. 95)
ischar True if a vector or array contains character elements. (p. 95)
isempty True if the matrix is empty, i.e., []. (p. 95)
isfinite Generates a matrix with 1 in all the elements which are finite (i.e., not Inf or
NaN ) and 0 otherwise. (p. 95)
isinf Generates a matrix with 1 in all the elements which are Inf and 0 otherwise.
(p. 95)
islogical True for a logical variable or array. (p. 95)
isnan Generates a matrix with 1 in all the elements which are NaN and 0 otherwise.
(p. 95)
logical Converts a numeric variable to a logical one. (p. 95)
152
Appendix: Reference Tables
Debugging Commands
153
Appendix: Reference Tables
ode45 Non-stiff ode solver; fourth-order, one-step method for the ode y0 = f(t, y).
(p. 115)
ode23 Non-stiff ode solver; second-order, one-step method. (p. 115)
ode113 Non-stiff ode solver; variable-order, multi-step method. (p. 115)
ode15s Stiff ode solver; variable-order, multi-step method. (p. 115)
ode23s Stiff ode solver; second-order, one-step method. (p. 115)
ode23t Stiff ode solver; trapezoidal method. (p. 115)
ode23tb Stiff ode solver; second-order, one-step method. (p. 115)
ode15i Stiff ode solver; variable-order, multi-step method for the fully implicit ode
f(t, y, y0 ) = 0. (p. 124)
odeset Assigns values to properties of the ode solver. (p. 119)
Boundary-Value Solver
bvp4c Numerically solves y0 (x) = f(x, y) for x ∈ [a, b] with given boundary conditions
and an initial guess for y. (p. 128)
bvpinit Calculates the initial guess either by giving y directly or by using a function
y = initial guess function(x). (p. 128)
deval Interpolate to determine the solution desired points. (p. 128)
154
Appendix: Reference Tables
Matrix Functions
155
Appendix: Reference Tables
156
Solutions To Exercises
These are the solutions to the exercises given in subsections 1.9, 2.10, 3.6, and 4.7.
157
Solutions To Exercises
158
Solutions To Exercises
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 P and vertical
n
axes in two dimensions. We define 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.
159
Solutions To Exercises
160
ASCII Table
ASCII Table
Control Control
Octal Decimal Sequence Description Octal Decimal Sequence Description
000 0 @ Null character 100 64 @ AT symbol
001 1
ˆ A Start of header 101 65 A
002 2
ˆ B Start of text 102 66 B
003 3
ˆ C End of text 103 67 C
004 4
ˆ D End of transmission 104 68 D
005 5
ˆ E Enquiry 105 69 E
006 6
ˆ F Acknowledgment 106 70 F
007 7
ˆ G Bell 107 71 G
010 8
ˆ H Backspace 110 72 H
011 9
ˆ I Horizontal tab 111 73 I
012 10
ˆ J Line feed 112 74 J
013 11
ˆ K Vertical tab 113 75 K
014 12
ˆ L Form feed 114 76 L
015 13
ˆ M Carriage return 115 77 M
ˆ
016
017
14
15
ˆ
ˆ
N
O
Shift out
Shift in
116
117
78
79 ˜
N
O
020 16 P Data link escape 120 80 P
021 17
ˆ Q Device control 1 (often XON) 121 81 Q
022 18
ˆ R Device control 2 122 82 R
023 19
ˆ S Device control 3 (often XOFF) 123 83 S
024 20
ˆ T Device control 4 124 84 T
025 21
ˆ U Negative acknowledgement 125 85 U
026 22
ˆ V Synchronous idle 126 86 V
027 23
ˆ W End of transmissions block 127 87 W
030 24
ˆ X Cancel 130 88 X
031 25
ˆ Y End of medium 131 89 Y
032 26
ˆ Z Substitute 132 90 Z
033 27
ˆ [ Escape 133 91 [ Left bracket
034 28
ˆ \ File separator 134 92 \ Back slash
035 29
ˆ ] Group separator 135 93 ] Right bracket
036 30
ˆ Record separator 136 94 Caret
037 31
ˆˆ Unit separator 137 95
ˆ Underscore
040 32
ˆ Space 140 96 ‘ Opening single quote
041 33 ! 141 97 a
042 34 ” Double quote 142 98 b
043 35 # Numer sign 143 99 c
044 36 $ Dollar sign 144 100 d
045 37 % Percent 145 101 e
046 38 & Ampersand 146 102 f
047 39 ’ Closing single quote (apostrophe) 147 103 g
050 40 ( Left parenthesis 150 104 h
051 41 ) Right parenthesis 151 105 i
052 42 * Asterisk 152 106 j
053 43 + Plus sign 153 107 k
054 44 , Comma 154 108 l
055 45 - Minus sign or dash 155 109 m
056 46 . Dot 156 110 n
057 47 / Forward slash 157 111 o
060 48 0 160 112 p
061 49 1 161 113 q
062 50 2 162 114 r
063 51 3 163 115 s
064 52 4 164 116 t
065 53 5 165 117 u
066 54 6 166 118 v
067 55 7 167 119 w
070 56 8 170 120 x
071 57 9 171 121 y
072 58 : Colon 172 122 z
073 59 ; Semicolon 173 123 { Left brace
074 60 < Less than sign 174 124 | Vertical bar
075 61 = Equal sign 175 125 } Right brace
076 62 > Greather than sign 176 126 Tilde
077 63 ? Question mark 177 127
ˆ? Delete
American Standard Code for Information Interchange (ASCII) specifies a correspondence between bit pat-
terns and character symbols. The octal and decimal representations of the bit patterns are shown along
161
ASCII Table
with a description of the character symbol. The first 32 codes (numbers 0–31 decimal) as well as the last
(number 127 decimal) are non-printing characters which were initially intended to control devices or pro-
vide 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.
ˆ
162
Index
In this index MATLAB commands come first, followed by symbols, and then followed by the function m-files and
named script files which are coded in this tutorial and contained in the corresponding zip file. Only then does the
index begin with the letter “A”.
Note: All words shown in typewriter font are MATLAB commands or predefined variables unless it is specifically
stated that they are defined 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.
163
doc, 4, 15, 16, 144 guide, 64, 69, 150
double, 43 heaviside, 12, 145
drawnow, 48, 54, 149 help, 4, 14, 16, 96, 103, 144
echo, 99, 106, 153 helpdesk, 15, 144
edit, 15 hilb, 30, 31, 82, 109, 147
eig, 30, 83, 87, 98, 151 hist, 50, 54, 149, 151
eigs, 83, 87, 151 hold, 47, 54, 149
else, 89, 91, 152 if, 22, 88, 91, 152
elseif, 89, 91, 152 ifft, 136, 140, 153
end, 22, 87, 88, 90, 91, 103, 106, 152, 153 ifftshift, 136, 138, 140, 153
error, 98, 106, 152, 153 imag, 13, 145
errorbar, 51, 54, 149, 151 image, 61, 150
eval, 107, 108, 153 inline, 38
events, 44 input, 10, 99, 146
exist, 95, 152 int8, 43
exp, 12, 13, 145 int16, 43
expm, 140, 141, 155 int32, 43
eye, 19, 20, 147 int64, 43
ezcontour, 56, 57, 149 interp1, 130, 155
ezcontour3, 56, 57, 149 interp2, 130, 155
ezmesh, 56, 57, 149 interp3, 130, 155
ezplot, 49, 54, 149 interpn, 130, 155
ezplot3, 55, 57, 149 inv, 26, 83, 87, 151
ezpolar, 50, 54, 149 ipermute, 35, 148
ezsurf, 56, 57, 149 isa, 44, 150
factorial, 11, 12, 145 ischar, 95, 152
false, 90, 91, 147 isempty, 95, 102, 152
fclose, 80, 81, 146 isequal, 94, 95, 152
feval, 107, 108, 110, 153 isfield, 42, 150
fft, 136, 140, 153 isfinite, 95, 152
fftshift, 136, 138, 140, 153 isinf, 95, 152
fieldnames, 42, 150 islogical, 94, 95, 152
figure, 58, 61, 150 isnan, 95, 152
fill, 59, 60, 61, 149 keyboard, 100, 153
fill3, 59, 60, 61, 149 lasterr, 107, 108, 110, 153
find, 93, 95, 112, 113, 152, 154 legend, 58, 61, 150
fix, 12, 145 length (number of elements in), 19, 20, 33, 93, 147
fliplr, 23, 25, 148 linsolve, 74, 76, 151
flipud, 24, 25, 148 linspace, 46, 51, 54, 149
floor, 12, 145 load, 15, 16, 51, 53, 61, 144, 146
fminbnd, 131, 133, 154 be careful, 52
fminsearch, 132, 133, 154 log, 12, 145
fopen, 79, 80, 81, 146 log10, 12, 145
for, 22, 87, 91, 152 logical, 43, 94, 95, 152
format, 10, 11, Subsect. 2.6 (30), 144 loglog, 49, 54, 149
fplot, 38, 49, 61, 150 logm, 141, 155
fprintf, 8, 39, 51, 79, 81, 146 lookfor, 14, 16, 96, 103, 144
fscanf, 51, 79, 81, 146 lu, 84, 87, 151
full, 111, 113, 154 max, 32, 34, 151
function, 95, 103, 106, 153 mean, 33, 34, 151
function handle, 43 mesh, 55, 57, 59, 149
funm, 141, 155 meshgrid, 55, 56, 57, 149
fzero, 130, 131, 133, 154 methods, 44
gca, 63, 150 min, 34, 151
gcf, 63, 150 mod, 12, 145
get, 62, 63, 150 movie, 73, 150
getfield, 42, 150 movie2avi, 73, 150
getframe, 73, 150 nargin, 98, 106, 153
ginput, 57, 61, 150 nargout, 98, 106, 153
global, 101, 106, 153 ndgrid, 56, 57, 149
gtext, 58, 59, 61, 62, 150 nnz, 112, 113, 154
164
norm, 33, 34, 84, 87, 98, 151 semilogx, 49, 54, 149
null, 85, 87, 151 semilogy, 49, 54, 149
num2str, 39, 40, 52, 80, 150 set, 62, 63, 150
ode15i, 123, 124, 154 using set rather than plot, 71, 72
ode15s, 115, 154 setfield, 42, 150
ode23, 115, 154 shg, 47, 54, 149, 150
ode23s, 115, 154 sign, 12, 145
ode23t, 115, 154 sin, 12, 145
ode23tb, 115, 154 sind, 12, 145
ode45, 115, 154 single, 43
ode113, 115, 154 sinh, 12, 145
odeset, 118, 119, 123, 154 size, 19, 20, 147
ones, 19, 20, 147 sort, 33, 34, 151
optimset, 131, 133, 154 sparse, 111, 112, 113, 154
orderfields, 42, 150 spconvert, 113, 154
orth, 85, 87, 151 spdiags, 111, 113, 154
otherwise, 91, 152 differences from diag, 112
path, 96, 107, 148 speye, 113, 147, 154
pause, 48, 99, 106, 148 spfun, 113, 154
pchip, 130, 155 spline, 130, 155
permute, 35, 148 sprand, 112, 113, 147, 154
persistent, 101, 106, 153 sprandn, 112, 113, 147, 154
pinv, 79, 151 sprandsym, 113, 147
plot, 45, 47, 49, 54, 129, 149 sprintf, 39, 40, 150
plot3, 55, 57, 149 spy, 113, 154
pol2cart, 56, 57, 149 sqrt, 12, 32, 145
polar, 50, 54, 149 sqrtm, 26, 141, 155
poly, 128, 130, 155 squeeze, 35, 148
polyder, 129, 130, 155 sscanf, 40, 150
polyfit, 129, 130 std, 33, 34, 151
polyval, 128, 129, 130, 155 str2num, 40, 150
polyvalm, 128, 130, 155 strcmp, 88, 89, 150, 151
ppval, 130, 155 struct, 41, 42, 43, 150
print, 52, 53, 146 subplot, 48, 54, 57, 149
prod, 34, 151 sum, 34, 92, 151
profile, 108, 110, 144 surf, 55, 57, 59, 149
properties, 44 svd, 86, 87, 151
qr, 85, 87, 151 switch, 22, 90, 91, 152
quad, 132, 133, 154 different than in C, 91
quadgk, 132, 133, 154 tan, 12, 145
quadl, 132, 133, 154 tand, 12, 145
rand, 19, 20, 50, 77, 78, 147 tanh, 12, 145
randn, 19, 20, 50, 147 text, 58, 59, 61, 62, 150
randperm, 19, 20, 147 tic, 28, 29, 146, 148
rank, 85, 87, 151 title, 50, 54, 62, 149
rats, 79, 148 toc, 28, 29, 146, 148
real, 13, 145 tril, 23, 25, 148
rem, 12, 145 triplequad, 133
repmat, 24, 25, 148 triu, 23, 25, 148
reshape, 22, 24, 25, 148 true, 90, 91, 147
return, 98, 100, 106, 153 type, 14, 15, 16, 96, 103, 144
rmfield, 42, 150 uicontrol, 66, 69, 150
roots, 128, 130, 155 uint8, 43
rot90, 25, 148 uint16, 43
round, 12, 145 uint32, 43
rref, Sect. 5 (73), 76, 105, 151 uint64, 43
save, 15, 16, 144 uipanel, 66, 69, 150
saveas, 73, 150 uiresume, 69, 150
sec, 12, 145 uiwait, 69, 150
secd, 12, 145 vander, 129, 130, 147
sech, 12, 145 varargin, 103, 106, 153
165
varargout, 103, 106, 153 get intervals fast (vector operations example), 110
vectorize, 38 get intervals slowly (non-vector operations
view, 55, 57, 149 example), 109
while, 22, 90, 91, 152 gravity ode (force of gravity example), 123
who, 15, 16, 144 hilb local (calculating Hilbert matrix), 97
whos, 15, 16, 144 hilb2 (calculating Hilbert matrix), 109
xlabel, 50, 54, 58, 62, 149 nested ex (example of nested functions), 104
xor, 89, 90, 92, 151 nlode (boundary value ode), 125
ylabel, 50, 54, 58, 62, 149 nlode1 (boundary value ode), 126
zeros, 19, 20, 147 nlode2 (boundary value ode), 126
zlabel, 55, 57, 62, 149 nlode all (boundary value ode), 127
nlode bc (boundary conditions for nlode), 125
Symbols nlode bc2 (boundary conditions for nlode), 125
nlode y ic (initial conditions for nlode), 126
+, 7, 26, 29, 143, 146 pause rippling (GUI example), 65
exception to, 27 pause rippling2 (GUI example), 67
-, 7, 26, 29, 143, 146 prealloc (example of preallocating arrays), 97
*, 7, 26, 29, 143, 146 rippling (plot surface in time), 65
.*, 27, 29, 143, 146 running gaussians (plot Gaussians in time), 48
/, 7, 26, 29, 143, 146 sample movie (example making movie), 71
warning about matrix division, 26 spruce (example using optional arguments), 98
./, 27, 29, 143, 146 vdp ode (van der Pol’s ode), 121
\, 7, 29, 74, 75, 78, 79, 143, 146
.\, 27, 29, 146 A
, 6, 7, 26, 29, 143, 146
ˆ
. , 27, 29, 146 AH , See Conjugate transpose
0ˆ, 7, 18, 20, 147 AT , See Transpose
. 0 , 18, 20, 147 A+ , See Matrix, pseudoinverse of
..., 14, 143 Abort statement, 14
%, 14, 143 abs, 12, 13, 145
,, 7, 9, 17, 25, 143 Accuracy, 10
;, 7, 9, 17, 25, 143 principle, 11
:, 18, Subsect. 2.2 (21), Subsect. 2.3 (21), 25, 143 acos, 12, 145
<, 89, 151 acosd, 12, 145
<=, 89, 151 acosh, 12, 145
>, 89, 151 acot, 12, 145
>=, 89, 151 acotd, 12, 145
==, 89, 151 acoth, 12, 145
=, 89, 151 acsc, 12, 145
˜
&, 89, 90, 92, 151 acscd, 12, 145
&&, 90, 151 acsch, 12, 145
|, 89, 90, 92, 151 addframe, 73, 150
||, 90, 151 addpath, 97, 107, 148
, 89, 90, 92, 151 all, 94, 95, 152
˜
!, See factorial AND (logical operator), 89, 90, 92, 151
[], 24, 25, 31, 148 angle, 13, 145
@, 37 Anonymous functions, See Function
↑ up-arrow key, 6, 7, 143 ans, 8, 9, 144
any, 94, 95, 152
Local M-files Arithmetic progression, 21
Arithmetical operations, Subsect. 1.1 (6), Subsect. 2.4
colormap example (modifying the colormap), 60 (26), 143
duffing closure (Duffing’s ode), 117 +, 7, 26, 29, 143, 146
duffing ode (Duffing’s ode), 117 exception to, 27
duffing p2 (Duffing’s ode), 117 -, 7, 26, 29, 143, 146
fft ex1 (Fourier transform example), 138 /, 7, 26, 29, 143, 146
fft ex2 (Fourier transform example), 139 warning about matrix division, 26
fft ex3 (Fourier transform example), 139 ./, 27, 29, 143, 146
fibonacci (recursive code for Fibonacci series), 106 *, 7, 26, 29, 143, 146
fzero example (Calling fzero using a nested function), .*, 27, 29, 143, 146
131 \, 7, 29, 74, 75, 78, 79, 143, 146
166
Arithmetical operations (cont.) celldisp, 41, 42, 150
.\, 27, 29, 146 char, 43
, 7, 26, 29, 143, 146 Character string, 7, 8, Subsect. 3.3 (39), 150
ˆ
. , 27, 29, 146 appending to, 39
ˆ
elementwise, 27 comparing strings, 88
Array, Sect. 2 (16) concatenating, 39
See also Matrix and Multidimensional arrays and converting to, 39
Vector and Cell array executing, 107
equal (are two arrays), 94 multiline, 39
ASCII character representation, 39, 57, 161 TEX commands in, 58, 63
asec, 145 chol, 81, 87, 151
asecd, 145 Cholesky decomposition, 81
asech, 145 clabel, 55, 57, 149
asin, 12, 145 class, 44, 150
asind, 12, 145 Class, Subsect. 3.5 (43)
asinh, 12, 145 callback, 44
atan, 12, 145 event, 44
atan2, 12, 145 fundamental, 43
atand, 12, 145 fundamental (table), 43
atanh, 12, 145 handle, 44
Augmented matrix form, 73–76 listener, 44
See also Matrix subclass, 44
Average value, 33 user-defined, 44
avifile, 73, 150 value, 44
axis, 48, 54, 57, 61, 149 classdef, 44
Axis clear, 8, 9, 12, 31, 148
changing numbers on, 63 danger in using, 8
tick marks outside plot, 63 Clear (a figure), 59
See also clf and close
B clf, 59, 61, 150
close, 59, 73, 150
Ball, 121–123 Closure, 102, 117, 131
ballode, 119 Clown, 61
Bessel’s equation, See Initial-value ordinary differential Colon operator, 18, Subsect. 2.2 (21), Subsect. 2.3 (21),
equations 25, 143
Binary format, 15, 52 possible floating-point errors in, 21, 46
Boundary-value ordinary differential equations, Sect. 11 See also linspace
(124), 128, 154 Color map, 59
continuation method, 127 colorbar, 59, 61, 149
break, 90, 91, 152 colormap, 59, 61, 149
bsxfun, 24, 25, 148 Colors, See RGB components
bvp4c, 125, 126, 128, 154 Command, 3
bvpinit, 126, 128, 154 See also Function
Comment character, 14, 143
C Complex conjugate, 13
Complex numbers, 6, Subsect. 1.6 (13)
14, 16, 144 Conchoid of Nicodemes
ˆCC,(programming language), 7, 21, 37, 40, 41, 42, 51, 61, cond, 77, 81, 87, 151
79, 80, 81, 90, 91, 101, 146, 150 condest, 82, 87, 151
C++ (programming language), 41, 107 Condition number, See Matrix
Calculator, Subsect. 1.1 (6) conj, 13, 145
case, 91, 152 Conjugate transpose, 18
different than in C, 91 See also Transpose
Case sensitive, 9 Continuation (of a line), 14, 143
cat, 34, 35, 148 Continuation method, 127
Catching errors, 107 continue, 90, 91, 152
caxis, 60, 61, 150 contour, 55, 57, 149
ceil, 12, 145 Contour plot, 55
cell, 41, 42, 43, 150 contour3, 55, 57, 149
Cell array, 37, Subsect. 3.4 (40), 50 contourf, 56, 57, 60, 149
equal (are two cell arrays), 94 Control flow, See Programming language
167
cos, 12, 145 Documentation (MATLAB), 15
cos z, 13 Dot product, 28
cosd, 12, 145 double, 43
cosh, 12, 145 drawnow, 48, 54, 149
cot, 12, 145 Duffing’s equation, See Initial-value ordinary
cotd, 12, 145 differential equations
coth, 12, 145
CPU, 28 E
cputime, 28, 29, 146, 148
csc, 12, 145 ez , 13
cscd, 12, 145 Earth, 61
csch, 12, 145 echo, 99, 106, 153
csvread, 51, 53, 79, 146 edit, 15
csvwrite, 51, 53, 79, 146 eig, 30, 83, 87, 98, 151
Cubic splines, See Interpolation Eigenvalues, 30, 81, 83, 86, 98
cumsum, 33, 34 definition of, 83
Cursor Eigenvectors, 83, 86, 98
entering current position, 57 eigs, 83, 87, 151
else, 89, 91, 152
D elseif, 89, 91, 152
end, 22, 87, 88, 90, 91, 103, 106, 152, 153
Data eps, 9, 10, 90, 144
best polynomial fit to, 128 See also Machine epsilon
closing files, 80 Erase (a figure), 59
manipulation, Subsect. 2.8 (32), 151 See also clf
opening files, 79, 80 error, 98, 106, 152, 153
reading into MATLAB, 51, 53, 79, 113, 146 Error bars, 50, 51
writing from MATLAB, 51, 53, 79, 146 errorbar, 51, 54, 149, 151
Data types, 37, Subsect. 3.5 (43) Euclidean length, See Length of a vector
fundamental eval, 107, 108, 153
fundamental (table), 43 events, 44
dbclear, 100, 153 EXCLUSIVE OR (logical operator), 90, 92, 151
dbcont, 100, 153 exist, 95, 152
dbdown, 100, 153 exp, 12, 13, 145
dblquad, 133, 154 expm, 140, 141, 155
dbquit, 100, 153 Exponentiation, 6, 7, 26
dbstack, 100, 153 Extrapolation, 129
dbstatus, 100, 153 See also Interpolation
dbstep, 100, 153 eye, 19, 20, 147
dbstop, 100, 153 ezcontour, 56, 57, 149
dbtype, 100, 153 ezcontour3, 56, 57, 149
dbup, 100, 153 ezmesh, 56, 57, 149
Debugging m-files, See Function m-file and Script m-file ezplot, 49, 54, 149
demo, 3, 15, 16, 45, 57, 61, 144, 150 ezplot3, 55, 57, 149
Demonstration program, 3, 15, 57, 61 ezpolar, 50, 54, 149
det, 82, 87, 151 ezsurf, 56, 57, 149
Determinant, 82
deval, 126, 128, 154 F
diag, 22, 25, 148
Diagonals, See Matrix factorial, 11, 12, 145
diary, 6, 7, 146 Factorial function, 11
diff, 33, 34 false, 90, 91, 147
Digits of accuracy, 10 FALSE (result of logical expression), 89
disp, 8, 9, 40, 80 Fast Fourier transform, See Fourier transform
Display fclose, 80, 81, 146
formatting the, Subsect. 1.4 (10) feval, 107, 108, 110, 153
misinterpreting, Subsect. 2.6 (30) fft, 136, 140, 153
suppressing, 7, 9, 17, 25, 143 fftshift, 136, 138, 140, 153
variable, 8, 9, 80 Fibonacci sequence, 106
See also disp and fprintf Field, See Structure
doc, 4, 15, 16, 144 fieldnames, 42, 150
168
figure, 58, 61, 150 Function (cont.)
fill, 59, 60, 61, 149 nested, 96, 103
fill3, 59, 60, 61, 149 order in which MATLAB searches for functions, 96,
find, 93, 95, 112, 113, 152, 154 105
Finite differences, 33 passing arguments indirectly, See Closure
fix, 12, 145 passing function name in argument list, Subsect. 3.2
fliplr, 23, 25, 148 (38), 107, 108
flipud, 24, 25, 148 primary, 103
Floating-point numbers, 9, 21 private, 105
Floating-point operations, See Flops return, 98, 100, 106, 153
floor, 12, 145 saving parameters in, 101–103
Flops (fl oating-point operations), 28 subfunctions in, 96, 103
Flow control, See Programming language Function handle, 37, 42
fminbnd, 131, 133, 154 function handle, 43
fminsearch, 132, 133, 154 Function m-file, Subsect. 8.3 (95)
fopen, 79, 80, 81, 146 debugging, 99, 100
for, 22, 87, 91, 152 names of, 95
format, 10, 11, Subsect. 2.6 (30), 144 passing name into, 38
Format options (in format command), 10, 11, 144 recursive, 106
Format specifications (in fprintf, fscanf, sprintf, and Functions (mathematical)
sscanf), 80 See also Polynomials
Fourier series, Sect. 14 (133) common mathematical, Subsect. 1.5 (11)
complex, 134 definite integrals of, 132, 133
real, 133 “hijacked”, 105
Fourier transform, Sect. 14 (133) local minimum of, 131
discrete, Sect. 14 (133), 140, 153 numerical operations on, 130, 133, 154
fast (FFT), 137 zeroes of, 130, 132
fplot, 38, 49, 61, 150 funm, 141, 155
fprintf, 8, 39, 51, 79, 81, 146 fzero, 130, 131, 133, 154
printing a matrix, 80
specifications (format), 80 G
Frequency, See Power
fscanf, 51, 79, 81, 146 Gauss-Kronrod quadrature (for numerical integration),
specifications (format), 80 132
full, 111, 113, 154 Gauss-Lobatto quadrature (for numerical integration),
function, 95, 103, 106, 153 132
Function, 22, Subsect. 8.3 (95) Gaussian elimination, 74, 78
anonymous, Subsect. 3.1 (37), 42 gca, 63, 150
warning, 38 gcf, 63, 150
built-in, 11, 14, 15 Generalized eigenvalue problem, 83
commands in, 100, 106, 153 get, 62, 63, 150
comments in, 96 getfield, 42, 150
conflict between function and variable name, 11 getframe, 73, 150
debugging, 99, 100 ginput, 57, 61, 150
definition line, 95 global, 101, 106, 153
differences from command, 3 Graphics, Sect. 4 (45)
end statement, 103 advanced techniques, Subsect. 4.3 (57), 150
ending, 103 changing endpoints, 48
error, 98, 106, 152, 153 customizing lines and markers, 47
example using multiple input and output arguments, demonstration, 45
98 handle, Subsect. 4.4 (61)
function (required word), 95, 103, 106, 153 holding the current plot, 47
inline, 38 labelling, 57–61
warning, 38 text properties, 62
input and output arguments, 95, 100–101 using TEX commands, 58, 63
“grouping” together, 103 multiple plots, 48
pass by reference, 96 multiple windows, 58
pass by value, 96 object, 62
variable number of, 98 handle for an, 62
name of, 13 printing, 52, 53, 146
warning about user-defined m-files, 14 properties, Subsect. 4.4 (61)
169
Graphics (cont.)
saving to a file, 52, 53, 146 Initial-value ordinary dierential equations, solvers
three-dimensional, Subsect. 4.2 (55) (cont.)
two-dimensional, Subsect. 4.1 (45), 149 passing parameters to, 117
window, 45 properties of, 119
Gravity, 122 relative error, 114
gtext, 58, 59, 61, 62, 150 statistics for, 119
GUI (Graphical User Interface), Subsect. 4.5 (63) stiff, 115, 121
guide, 64, 69, 150 Van der Pol’s equation, 121
inline, 38
H Inline functions, See Function, inline
Inner product, 28
H input, 10, 99, 146
, See Conjugate transpose
Handle, See Function handle int8, 43
Handle graphics, See Graphics int16, 43
heaviside, 12, 145 int32, 43
Helix, 55 int64, 43
help, 4, 14, 16, 96, 103, 144 Integration, numerical, 132
Help facility, Subsect. 1.8 (14) interp1, 130, 155
getting help, 16, 144 interp2, 130, 155
keyword, 14 interp3, 130, 155
helpdesk, 15, 144 interpn, 130, 155
Hermite polynomials, See Interpolation Interpolation, 129, 130
hilb, 30, 31, 82, 109, 147 cubic, 130
Hilbert matrix, 30, 31, 77, 78, 83, 86, 97, 129 cubic splines, 129, 130
function file for, 97, 108 Hermite cubic interpolation, 130
hist, 50, 54, 149, 151 how to do extrapolation, 130
Histogram, 50 linear splines, 129
hold, 47, 54, 149 inv, 26, 83, 87, 151
ipermute, 35, 148
I isa, 44, 150
ischar, 95, 152
I, See Identity matrix isempty, 95, 102, 152
i, 6, 9, 144 isequal, 94, 95, 152
Identity matrix, 19 isfield, 42, 150
See also eye isfinite, 95, 152
if, 22, 88, 91, 152 isinf, 95, 152
ifft, 136, 140, 153 islogical, 94, 95, 152
ifftshift, 136, 138, 140, 153 isnan, 95, 152
imag, 13, 145
image, 61, 150 J
Imaginary numbers, 6, 9, 144
Inf, 9, 49, 144 j, 6, 9, 144
Initial-value ordinary differential equations, Sect. 10 Java (programming language), 107
(113)
Bessel’s equation, 123 K
Duffing’s equation, 113–121
first-order system, 114 keyboard, 100, 153
with constant coefficients, 140 Keyword, 14
solvers, 114, 115, 154
absolute error, 114 L
adaptive step size, 114
events, 120 lasterr, 107, 108, 110, 153
ode15i, 123, 124, 154 Left division, See \
ode15s, 115, 154 legend, 58, 61, 150
ode23, 115, 154 Lemniscate of Bernoulli, 49
ode23s, 115, 154 length (number of elements in), 19, 20, 33, 93, 147
ode23t, 115, 154 Length of a vector (i.e., Euclidean length), 33
ode23tb, 115, 154 See also norm
ode45, 115, 154 Life (Conway’s game of), 69
ode113, 115, 154 Linear splines, See Interpolation
170
Linear system of equations, Sect. 5 (73), Subsect. 5.3 Matrix (cont.)
(78) generating, Subsect. 2.1 (17), Subsect. 2.3 (21)
least-squares solution, 78, 129 by submatrices, 20
overdetermined, Subsect. 5.3 (78), 129 individual elements, 19
solving by \, 26, 74, 78 Hermitian, 18
solving by linsolve, 74 Hilbert, See Hilbert matrix
solving by rref, Sect. 5 (73) identity, 19
underdetermined, Subsect. 5.3 (78) inverse of, 83
linsolve, 74, 76, 151 Jacobian, 116, 121
linspace, 46, 51, 54, 149 lower triangular part of, 23, 84
load, 15, 16, 51, 53, 61, 144, 146 unit, 84
be careful, 52 LU decomposition, 84
log, 12, 145 manipulation, Subsect. 2.3 (21), 148
log10, 12, 145 “masking” elements of, 94
logical, 43, 92, 94, 95, 152 maximum value, 32
Logical (data type), 92 minimum value, 32
LOGICAL AND (short circuiting logical operator), 90, multidimensional, Subsect. 2.9 (34)
151 null, 24, 25, 31, 148
LOGICAL OR (short circuiting logical operator), 90, orthogonal, 85
151 positive definite, 113
Logical expression, 88 preallocation of, 19, 41, 97
result of, 89 pseudoinverse of, 79
Logical functions, 95, 152 QR decomposition, 85
Logical operators, 90, 151 replicating, 24
AND (&), 89, 90, 92, 151 reshaping, 22, 24
AND (short-circuit) (&&), 90, 151 singular, 75, 76, 77, 81, 82
applied to matrices, Subsect. 8.2 (92) warning of, 84
result of, 92 singular value decomposition, 86
EXCLUSIVE OR (xor), 89, 90, 92, 151 sparse, Sect. 9 (110), 154
NOT ( ), 89, 90, 92, 151 specialized, 147
˜
OR (|), 89, 90, 92, 151 sum of elements, 33
OR (short-circuit) (||), 90, 151 SVD, See singular value decomposition (above)
loglog, 49, 54, 149 symmetric, 18, 113
logm, 141, 155 tridiagonal, 82, 110
lookfor, 14, 16, 96, 103, 144 unitary, 85
lu, 84, 87, 151 upper triangular part of, 23
LU decomposition, 84 Vandermonde, See Vandermonde matrix
max, 32, 34, 151
M Maximum value, 32
mean, 33, 34, 151
M-files, 95 Mean value, 33
See also Function m-file and Script m-file Memory (of variables), 31
Machine epsilon (eps), 9, 144 mesh, 55, 57, 59, 149
calculation of, 90 meshgrid, 55, 56, 57, 149
Mathematical functions, Subsect. 1.5 (11), 13, Subsect. methods, 44
2.7 (32), 145 min, 34, 151
Matrix Minimum value, 32
augmented, 73–76 mod, 12, 145
is not a matrix, 74 Monotonicity, test for, 33
Cholesky decomposition, 81 Monty Python, 39
condition number, 81 Moore-Penrose conditions, 79
approximation to, 82 Mouse location, See ginput
defective, 83 movie, 73, 150
deleting rows or columns, 24 movie2avi, 73, 150
determinant of, See Determinant Multidimensional arrays, Subsect. 2.9 (34)
diagonals of, 22, 111, 112 generate grid, 56
elementary, 20, 147 permute order, 35
elementary operations, 147
empty, See null (below) N
extracting submatrices, 21
full, 110 NaN, 9, 144
171
nargin, 98, 106, 153 plot3, 55, 57, 149
nargout, 98, 106, 153 Plotting
ndgrid, 56, 57, 149 a curve, 45, 55
Newton’s laws, 121 a function, 49
nnz, 112, 113, 154 a parametric function, 49
norm, 33, 34, 84, 87, 98, 151 an implicit function, 49
Norm in polar coordinates, 50
matrix, 84 phase plane, 116
Frobenius, 85 pol2cart, 56, 57, 149
p -norm, 85 polar, 50, 54, 149
vector, 84 Polar coordinates, 50
NOT (logical operator), 89, 90, 92, 151 poly, 128, 130, 155
Notation (for vectors and matrices), 5 polyder, 129, 130, 155
null, 85, 87, 151 polyfit, 129, 130
Null matrix, 24, 25, 148 Polynomials, Sect. 12 (128), 155
Null space, 85 differentiating, 129
num2str, 39, 40, 52, 80, 150 evaluating, 128
finding minimum and maximum of, 129
O order of, 129
representing by vector, 128
Ode, See Initial-value ordinary differential equations roots of, 128
ode15i, 123, 124, 154 polyval, 128, 129, 130, 155
ode15s, 115, 154 polyvalm, 128, 130, 155
ode23, 115, 154 Positive definite matrix, See Matrix
ode23s, 115, 154 Power, 134, 135
ode23t, 115, 154 average, 134
ode23tb, 115, 154 definition of, 134
ode45, 115, 154 frequency of, 134
ode113, 115, 154 in each mode, 134, 135
odeset, 118, 119, 123, 154 instantaneous, 134
ones, 19, 20, 147 spectrum, 134
Operator precedence, Subsect. 2.5 (29) ppval, 130, 155
optimset, 131, 133, 154 Precedence, See Operator precedence
OR (logical operator), 89, 90, 92, 151 Predefined variables, See Variables
orderfields, 42, 150 Principles about computer arithmetic, 9, 11
Ordinary differential equations, See Initial-value print, 52, 53, 146
ordinary differential equations and Boundary-value Printing, See Display
ordinary differential equations prod, 34, 151
orth, 85, 87, 151 Product
Orthonormal basis, 85 dot, See Dot product
otherwise, 91, 152 inner, See Inner product
Outer product, 28 outer, See Outer product
Overdetermined system, See Linear system of equations profile, 108, 110, 144
Programming language (MATLAB), Sect. 8 (87)
P flow control, Subsect. 8.1 (87), 91, 152
break out of, 90
Parentheses, 9 continue loop, 90
path, 96, 107, 148 for loops, 87
Path, See Search path if statement, 88
pause, 48, 99, 106, 148 switch statement, 22, 90, 91, 152
pchip, 130, 155 different than in C, 91
permute, 35, 148 while loops, 90
persistent, 101, 106, 153 needed less frequently, 92
uses of, 102 properties, 44
Phase plane, See Plotting Pseudoinverse, See Matrix
pi, 8, 9, 144 Pseudorandom numbers, See Random numbers
Piecewise polynomials, See Interpolation Pythagorean theorem, 11
pinv, 79, 151
plot, 45, 47, 49, 54, 129, 149 Q
using set rather than plot, 71, 72
Plot, generating a, See Graphics qr, 85, 87, 151
172
QR decomposition, 85 saveas, 73, 150
quad, 132, 133, 154 Scientific notation, 6
quadgk, 132, 133, 154 Scope, See Variables
quadl, 132, 133, 154 Script m-file, 13, 96, 99
Quadratic polynomial, roots of, 13 debugging, 99, 100
Quote mark, 7 names of, 13
Search path, 96, 105
R sec, 12, 145
secd, 12, 145
rand, 19, 20, 50, 77, 78, 147 sech, 12, 145
randn, 19, 20, 50, 147 semilogx, 49, 54, 149
Random matrix, 19, 23, 77, 78, 113, 154 semilogy, 49, 54, 149
Random numbers, 19 set, 62, 63, 150
Gaussian distribution, 19, 50 setfield, 42, 150
normal distribution, 19 shg, 47, 54, 149, 150
pseudorandom numbers, 19 sign, 12, 145
seed, 19 Simpson’s method (of numerical integration), 132
state, 19 sin, 12, 145
uniform distribution, 19, 50 sin z, 13
randperm, 19, 20, 147 sind, 12, 145
rank, 85, 87, 151 single, 43
Rank of matrix, 85 Singular value decomposition, 86
Rational approximation to floating-point number, 79, sinh, 12, 145
148 size, 19, 20, 147
rats, 79, 148 sort, 33, 34, 151
RCOND, 77, 82, 84 Sort numbers, 33
real, 13, 145 sparse, 111, 112, 113, 154
realmax, 9, 144 spconvert, 113, 154
realmin, 9, 10, 144 spdiags, 111, 113, 154
Recursion, 106 differences from diag, 112
Reduced row echelon form, 74 speye, 113, 147, 154
round-off errors in, 76 spfun, 113, 154
Relational operators, 89, 151 spline, 130, 155
<, 89, 151 Splines, See Interpolation
<=, 89, 151 sprand, 112, 113, 147, 154
>, 89, 151 sprandn, 112, 113, 147, 154
>=, 89, 151 sprandsym, 113, 147
==, 89, 151 sprintf, 39, 40, 150
=, 89, 151 specifications (format), 80
˜matrix, Subsect. 8.2 (92) spy, 113, 154
result of, 92 sqrt, 12, 32, 145
rem, 12, 145 sqrtm, 26, 141, 155
Remainder, 12, 145 squeeze, 35, 148
repmat, 24, 25, 148 sscanf, 40, 150
Request input, 10 specifications (format), 80
reshape, 22, 24, 25, 148 Standard deviation, 33
return, 98, 100, 106, 153 Statements
RGB components (of a color), 59 executing in text variables, 107
rmfield, 42, 150 rerunning previous, 10
roots, 128, 130, 155 separating on a line, 7, 9, 17, 25, 143
rot90, 25, 148 std, 33, 34, 151
round, 12, 145 Stiff ode, 115, 121
Round-off errors, Subsect. 1.3 (9), 11, 21, 23, 26, 31, 46, str2num, 40, 150
76, Subsect. 5.2 (77), 78, 84 strcmp, 88, 89, 150, 151
rref, Sect. 5 (73), 76, 105, 151 String, See Character string
struct, 41, 42, 43, 150
S Structure, 37, 41, 131
equal (are two structures), 94
save, 15, 16, 144 field, 41
Save terminal commands, 6 Subfunctions, See Function m-file
Save work, 6 subplot, 48, 54, 57, 149
173
subplot (cont.) varargout, 103, 106, 153
warning, 48 Variables, Subsect. 1.2 (7)
sum, 34, 92, 151 about, 9
surf, 55, 57, 59, 149 case sensitive, 9
Surface plot, 55 conflict between variable and function name, 11
changing view, 55 defined, 95
filled-in, 55 deleting, 9
wire-frame, 55 global, 101
svd, 86, 87, 151 inputting, 10
SVD, See Singular value decomposition list of, 15
switch, 22, 90, 91, 152 loading, 15
local, 95, 100, 101
T logical, 94
modifying, 101
T
, See Transpose overwriting, 7
tan, 12, 145 persistent, 101
tand, 12, 145 predefined, 8, 9, 144
tanh, 12, 145 ans, 8, 9, 144
Taylor series expansion, 140 eps, 9, 10, 90, 144
TEX, See Character string i, 6, 9, 144
text, 58, 59, 61, 62, 150 Inf, 9, 49, 144
Text properties, 62 j, 6, 9, 144
Text window, 45 NaN, 9, 144
tic, 28, 29, 146, 148 overwriting, 8, 88
Time, See cputime and tic and toc pi, 8, 9, 144
title, 50, 54, 62, 149 realmax, 9, 144
multiline, See Character string, multiline realmin, 9, 10, 144
Title saving, 15
for entire figure, 63 saving local variables in functions, 101
toc, 28, 29, 146, 148 scope of, 104
Transpose, 18, 20, 147 special cases of vectors or matrices, 7
conjugate, 18, 20, 147 static, 101
Trigonometric functions, Subsect. 1.5 (11), Subsect. 2.7 string, 7, Subsect. 3.3 (39)
(32) See also Character string
tril, 23, 25, 148 typeless, 8, 101
triplequad, 133 Vector
triu, 23, 25, 148 average value of elements, 33
true, 90, 91, 147 column vs. row, 17
TRUE (result of logical expression), 89 deleting elements, 24
type, 14, 15, 16, 96, 103, 144 equal (are two vectors), 94
generating, Subsect. 2.1 (17)
U individual elements, 19
“masking” elements of, 94
uicontrol, 66, 69, 150 maximum value, 32
uint8, 43 mean value of elements, 33
uint16, 43 minimum value, 32
uint32, 43 preallocation of, 19, 41, 97
uint64, 43 repeated elements, testing for, 33
uipanel, 66, 69, 150 sort elements, 33
uiresume, 69, 150 standard deviation of elements, 33
uiwait, 69, 150 sum of elements, 32
Underdetermined system, See Linear system of vectorize, 38
equations Vectorizing code, Subsect. 8.5 (108)
profile execution time, 108
V view, 55, 57, 149
174
Workspace, 6, 100
175
Index
176