%***************************************************************
%*
%* tutor.m: Tutorial for beginning MATLAB users.
%*
%* Written by: Kyle D. Dippery
%* 473 Anderson Hall
%* (606) 257-3893
%* kdip@engr.uky.edu
%*
%* Last updated May 20, 1997
%*
%* Copyright 1997 by Kyle D. Dippery
%*
%* Reproduction of this document is permitted for
%* noncommercial use only, provided the entire document,
%* including this copyright notice, remains intact.
%*
%***************************************************************
clc
echo on
%
% WELCOME TO MATLAB!
%
%
% The purpose of this tutorial is to familiarize the
% user (that's you) with the basics of MATLAB.
%
% In the screens to follow, lines preceded by a percent
% sign ('%') are comment lines, and are ignored by the
% MATLAB interpreter. All other lines are actual MATLAB
% commands, which will be executed before your very eyes.
%
% Press a key to continue...
pause
clc
% Probably the first useful thing you need to know is
% how to enter data from the keyboard. You can do this
% by assigning values directly to variables. For example,
% to assign the value 5 to the variable 'a', we enter:
a=5
% That first line ("a=5") is what we entered. MATLAB
% then shows us that it understood what we said, by
% echoing the value of a (5).
% Press another key...
pause
clc
% MATLAB doesn't particularly care whether the value
% we enter is a scalar, vector, or matrix. The syntax
% for the assignment is mostly the same, regardless.
% The only difference for vectors or matrices is that
% we need square brackets ([]) to tell MATLAB that the
% input is an array. So, to enter a row vector, let's
% call it 'b', we type:
b=[1 3 4 5 8 9]
% Here we've separated the elements of the array by
% spaces. Commas would have worked just as well, but
% we tend to think commas make the line look a bit more
% cluttered than it really needs to.
pause
clc
% Column vectors, like 'bc', are entered as:
bc=[1; 4; 3; 5; 3; 5];
% Notice the dual use of the semicolon in the last
% example. First, it separates the rows of column
% vectors (or other multi-row arrays). (Spaces after
% the semicolons aren't necessary, but we think they
% help make the line more readable.)
%
% Second, when a semicolon ends a command it tells
% MATLAB not to echo the results of the command to
% the screen.
% Another key to continue...
pause
clc
% If we want to look at a variable after it is assigned,
% we can use the 'disp' command.
disp(bc)
pause
clc
% Colons have special uses in MATLAB, too - they can
% be used to build vectors of evenly-spaced numbers:
a2=1:0.5:3.4
% Notice that the last element of the vector is 3.0, not
% 3.4. This is because the next element of the specified
% sequence is 3.5, which is greater than the upper limit
% (3.4) we assigned.
%
% Notice also that, in this case, we didn't need the
% square brackets. That's because MATLAB expects a
% vector input when the colon notation is used. Still,
% the brackets can be used if there's any doubt; there's
% nothing wrong with a little redundancy.
pause
clc
% If the increment (the second number in that last
% assignment statement) is omitted, it defaults to 1:
a3=0:5
pause
clc
% Matrices can be entered as a sequence of row vectors,
% separated by semicolons.
A=[1 3 5 7; 2:2:8; 1 2 4 9]
pause
clc
% Or as a sequence of column vectors, separated by commas
% or spaces:
B=[bc,2*bc 3*bc]
pause
clc
% Complex numbers also receive no special treatment:
C=ones(3,3) + i * A(:,1:3)
pause
clc
% Some notes about this last command:
%
% C=ones(3,3) + i * A(:,1:3)
%
% 1. 'i' is implicitly recognized as sqrt(-1).
% So is 'j'.
%
% 2. 'ones(m,n)', where m and n are positive integers,
% generates an mxn array of 1's, in this case used for
% the real part of C. Some other 'special' matrices can
% be generated by 'zeros', 'eye', 'rand', 'randn', or
% 'magic'.
%
% 3. Submatrices can be extracted from matrices by
% using indices. In this case, the imaginary part of
% C is a submatrix of A, consisting of the first three
% columns of A (the same matrix A we used before, still
% in memory for us to use.)
pause
clc
% A bit more about:
%
% C=ones(3,3) + i * A(:,1:3)
%
% The first index into an array always indicates the rows
% to be used, the second index indicates the columns.
% Indices may be scalars or vectors. A colon, by itself,
% means "use 'em all". Hence, A(:,1:3), A(1:3,1:3), and
% A([1 2 3],[1 2 3]) would all give the same result (since
% A, in this particular case, has only three rows).
%
% 4. Multiplication of a matrix by a scalar is
% accomplished by the '*'. Matrices, scalars, and
% vectors are all added by '+'.
pause
clc
% Addition and subtraction act the same for scalars,
% vectors, and matrices. a+b, where a and b are scalars
% adds a and b together.
%
% If a and b are vectors,
a=1:5, b=10:-2:2
pause
clc
% or matrices, with the same dimensions, then a+b adds each
% element of a to its corresponding element in b:
a+b
% Notice that, if an operation is not assigned to a
% specific variable, it is assigned to the temporary
% variable, 'ans'.
pause
clc
% Scalars can be added to (or subtracted from) anything:
ans-3
rand(3,3)+ans(4)
% See if you can follow what just happened, there...
pause
clc
% Order of operation is pretty standard - exponents are
% evaluated first, multiplication and division next,
% addition and subtraction last; operations are evaluated
% left to right, except when parentheses are used to group
% things together. The usual stuff...
pause
clc
% Multiplication and division are slightly different:
% they are assumed to be matrix operations:
A=magic(3)
B=[8 2 1; 2 2 1; 5 3 7]
pause
clc
Mprod=A*B
pause
clc
% If what we want is an array whose elements are the
% elements of A times the elements of B, we need to
% use a 'dot-multiply', or '.*':
Aprod=A.*B
pause
clc
% This is called 'array multiplication', to distinguish
% it from 'matrix multiplication'.
%
% Let's look again at our matrix product, for comparison:
Mprod, Aprod
pause
clc
% Division with matrices is similar to multiplying
% one matrix by the inverse of the other:
%
% A/B is almost A*inv(B) (where inv(B) is the MATLAB
% command which finds the inverse of B).
%
% A\B is almost inv(A)*B.
%
% (The reason it's "similar to" and not "the same as" is
% that A and B don't have to be square matrices for the /
% or \ operations, but do for the inv() operation.)
%
% For more precise definitions of / and \, try
% 'help /' or 'help slash'.
pause
clc
% Array division is accomplished by the 'dot-divide'
% operations, './' and '.\'.
%
% A./B yields an array whose elements are the elements of
% A divided BY the elements of B.
%
% A.\B yields an array whose elements are the elements of
% A divided INTO the elements of B (or, the elements of B
% divided BY the elements of A).
%
% Note that A.\B is the same as B./A, but A\B is NOT the
% same as B/A.
pause
clc
% Matrices may be multiplied by scalars without using the
% '.*', but division requires a bit of care.
%
% For instance, 2*A and A*2 will both yield
disp(A*2)
% A/2 gives us an array whose elements are the elements of
% A divided by 2, but 2/A does _not_ give us an array whose
% elements are 2 divided by each element of A (unless A
% happens to be a scalar).
pause
clc
% Exponents are kinda ugly. Usually, what you'll probably
% want is every element of a vector raised to a certain
% power, or a certain base raised to the power of every
% element in a vector. These would be accomplished by the
% '.^' operator:
disp(a)
disp(a.^3)
disp(3.^a)
% The '^' operator by itself has more to do with matrix
% powers, and either the matrix or the exponent, but not
% both, must be a square matrix. 'help arith' will give
% more information on this.
pause
clc
% The '.' means something a bit different when dealing
% with transposes.
%
% Normally, a transpose is denoted by a single quote, '.
% When the matrix is complex, this is actually a complex
% conjugate ("Hermitian") transpose operator. A
% "straight" transpose is denoted by a dot-transpose, .'.
%
% Note: for real-valued matrices, there is no difference
% between a transpose (') and a dot-transpose (.').
pause
clc
% Some examples, using our matrix C
disp(C)
disp(C')
disp(C.')
pause
clc
% For an example of why we like array multiplication,
% let's try to draw a spiral.
t=0:720; % angle, in degrees, twice around
x=t.*sin(pi/180*t); % x coordinate
y=t.*cos(pi/180*t); % y coordinate
% Notice that mathematical functions can operate on
% arrays. sin(pi/180*t) takes the sine of every element of
% the vector, pi/180*t. (pi is 3.1415etc., implicitly defined.)
%
% t*sin(pi/180*t) would try to multiply a 1x721 matrix by
% another 1x721 matrix, which doesn't work. Instead,
% t.*sin(pi/180*t) multiplies the ith element of t by the
% ith element of sin(pi/180*t), which is what we really
% want.
%
% Notice also that the input to the sin and cos functions
% is converted from degrees to radians. Trig functions
% in MATLAB always operate on radians.
pause
clc
% Notice also how the array operations neatly reduce
% the need for 'for' loops.
%
% x=t.*sin(pi/180*t);
%
% gives the same result as:
%
% for ii=1:721,
% x(ii)=t(ii)*sin(pi/180*t(ii);
% end
%
% (We like to use 'ii' and 'jj' instead of 'i' and 'j'
% for loop counters, because 'i' and 'j' already mean
% sqrt(-1) to MATLAB, and we'd hate to try to build a
% complex array out of something, only to find out that
% i=17.2 or j=150 suddenly, because we used them for
% something else beforehand...)
pause
clc
% Now let's look at our spiral.
plot(x,y)
% This is the simplest method of obtaining a graph. We
% can label this graph,
xlabel('X Coordinate')
ylabel('Y Coordinate')
title('Wow, It Worked!')
% Input to the 'xlabel', 'ylabel', and 'title' commands
% must be a string argument. Strings in MATLAB are
% delimited by single quotation marks (').
%
% Strings are concatenated (stuffed together) with square
% brackets. ['Hi' ' there!'], for instance, yields the
% string 'Hi there!' (see 'puzzle(2)' for another example).
% Functions exist for turning numbers into strings, which
% can then be used in figure titles or labels:
text(0,max(y),['Max y value = ' num2str(max(y))]);
pause
clc
% If, for some reason, we don't like yellow lines,
% we could ask for the plot in some other color (we
% like green, ourselves):
plot(x,y,'g')
% Notice that all of our nice labels are gone.
% Successive 'plot' statements generally erase
% anything that was set by earlier ones. (This
% can be changed by playing with the 'hold'
% function.)
pause
clc
% Or we could ask it to plot the data as red plusses:
plot(x,y,'r+')
% For a list of possible linestyles and colors,
% enter 'help plot' from the command prompt (when
% you get it back, that is).
pause
clc
% Multiple plots can be placed in a single window by
% using 'subplot'.
subplot(211), plot(t,x,'c:')
ylabel('X')
title('A Spiral?')
subplot(212), plot(t,y,'Color',[1 0.5 0],'linestyle','-.')
ylabel('Y')
title('It Doesn''t Look Like a Spiral...')
xlabel('Angle, Degrees')
% Look carefully at the second 'title' command, above, and
% compare it to the actual title. Look again. There is a
% difference - where the apostrophe appears in the title,
% there are two in the command. This is how you get
% single apostrophes to appear in MATLAB strings, since
% one by itself would mean the end of the string.
%
% Alternate methods of specifying line colors and styles
% are also illustrated above.
pause
clc
% Did you notice how nothing happened in the figure window
% until all the commands for building all of the plots had
% been executed? MATLAB doesn't like to update figures
% until it absolutely has to (who does?), or when it runs
% out of commands to execute, or when it runs into a
% 'pause' statement (as it did, here). The 'drawnow'
% command will force MATLAB to display graphs before it
% reaches the end of the command stack:
pause
clf
subplot(211), plot(t,x,'c:')
ylabel('X')
title('A Spiral?')
drawnow % just like this
subplot(212), plot(t,y,'Color',[1 0.5 0],'Marker','.')
ylabel('Y')
title('It Doesn''t Look Like a Spiral...')
xlabel('Angle, Degrees')
pause
clc
% Or we could look at multiple plots on a single set
% of axes:
clf
plot(x,y,'g',x,t.*cos(2*pi/180*t),'r--')
title('There''s Something Fishy Here...')
xlabel('X'), ylabel('Y')
pause
clc
% We can add gridlines:
grid
pause
% Or turn just some of them on or off:
set(gca,'ygrid','off')
pause
% Or even zoom in some,
set(gca,'xlim',[340 460])
% but that's getting a bit fancier than we generally
% need. Still, if you want to play with lots of figure
% or axes properties, you can look into the 'set' and
% 'get' commands, later. There's lots of fun to be had,
% in there...
pause
clc
% Figures can be cleared by 'clf'. Empty figure windows
% can be opened by entering 'figure'. Figure windows
% can be closed by entering 'close(n)', where n is the
% number of the window to close. (The figure number is
% usually displayed in the window's title bar.)
%
% 'close all' closes all figure windows.
clf
pause
close(1)
pause
clc
% Hardcopies of plots are obtained through the 'print'
% command. 'print -deps filename' would print the
% current figure to filename.eps, in encapsulated
% PostScript format. The file could then be printed
% on a laser printer, or imported into documents, or
% whatever. 'print', by itself, sends the plot to the
% default printer. You may want to be careful of this, if
% your printer has a page quota, or if you're just trying
% not to be wasteful, or some such...
%
% MATLAB also supports formats besides Encapsulated
% PostScript. Enter 'help print' to find out about
% these.
pause
clc
% We've played with quite a few arrays, so far: a, b,
% bc, A, B, t, x, y, and maybe one or two more we don't
% remember. Right now, they're all still sitting in
% memory. What if we've lost track of what we've done?
% Is there a way to find out what we have in memory?
%
% Maybe.... Try entering 'who':
who
% This shows all the variables currently residing in
% memory.
pause
clc
more on
% Or we could type 'whos'. This shows all the variables
% in memory, along with their sizes and some other neat
% things about them. Let's first introduce the 'more'
% function, though: this forces screen display to pause
% each time the screen fills up. 'more on' and 'more off'
% are used to control this paging routine.
%
% When 'more' is 'on', the spacebar pages ahead one full
% screen, 'q' quits the pager (it probably would not be a
% good idea to press 'q' just now, however... it likely
% would also quit the tutorial at this point) and just
% about any other key moves forward one line.
whos
more off
pause
clc
% Let's get rid of some of this baggage:
clear Aprod Mprod a a2 a3 ans b bc t x y
% 'clear', by itself, or 'clear all', would get rid of
% everything. But I wanted to keep some things...
who
pause
clc
% What if we only want to know the size of one array?
BSize=size(B)
% 'size' returns a two-element vector, containing the
% number of rows (1st element) and the number of columns
% (2nd element) of an array. 'size(ans,1)' will return
% just the number of rows. 'size(ans,2)' will return
% just the number of columns.
% 'length' returns the maximum element of the 'size'
% vector (useful for dealing with vectors)
pause
clc
% We could use the 'tic' and 'toc' commands to find
% out how much time it takes to calculate that inverse.
tic;
inv(C)
toc
% The 'elapsed_time' is shown in seconds.
pause
clc
% If we just wanted to know what time it is, we could
% look at the 'clock' (since some of us don't wear watches):
clock
% This tells us, in order, the current year, month, day,
% hour, minute and second (just multiply that '1.0e+03'
% factor through each element to get the right values).
%
% (And no, we don't know what's going to happen at the end
% of the millenium...)
pause
clc
% Hardcopy of any MATLAB session can be obtained by
% using the 'diary' function. If 'diary' is on ('diary
% on' is the command), then anything that prints on the
% screen also prints to a file called 'diary'.
%
% 'diary filename' sends all output to the specified file.
%
% 'diary off' turns the diary function off.
pause
clc
% That's it for this tutorial. If you want to look
% at it again, without pressing all those carriage
% returns, set 'more on', then 'type tutor'.
%
% To quit MATLAB when you're done (or ready for lunch),
% type either 'exit' or 'quit'.
%
% Enjoy!
echo off