Introduction to Programming
in MATLAB®
Lecture 2: Visualization and Programming
Instructor : Bahman Moraffah
Outline
(1) Plotting Continued
(2) Scripts
(3) Functions
(4) Flow Control
Cartesian Plots
• We have already seen the plot function
» x=-pi:pi/100:pi;
» y=cos(4*x).*sin(10*x).*exp(-abs(x));
» plot(x,y,'k-');
• The same syntax applies for semilog and loglog plots
» semilogx(x,y,'k'); 1050
» semilogy(y,'r.-'); 1040
» loglog(x,y);
1030
• For example: 1020
» x=0:100; 1010
» semilogy(x,exp(x),'k.-');
100
0
10 20 30 40 50
60 70 80 90 100
Playing with the Plot
to select lines
and delete or
change to see all plot
properties tools at once
to slide the plot
to zoom in/out around
Courtesy of The MathWorks, Inc. Used with permission.
Line and Marker Options
• Everything on a line can be customized
» plot(x,y,'--rs','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10)
• See doc line for a full list of 0.8
properties that can be specified 0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-4 -3 -2 -1 0 1 2 3 4
Labels
• Last time we saw how to add titles and labels using the GUI. Can
also do it command-line:
» title('Stress-Strain');
» xlabel('Force (N)');
• For multiple lines, add a legend entry for each line
» legend('Steel','Aluminum','Tungsten');
• Can specify font and size for the text
» ylabel('Distance (m)','FontSize',14,...
'FontName','Helvetica');
¾ use ... to break long commands across multiple lines
• To put parameter values into labels, need to use num2str and
concatenate:
» str = [‘Strength of ' num2str(d) 'cm diameter rod'];
» title(str)
Axis
• A grid makes it easier to read values
» grid on
• xlim sets only the x axis limits
» xlim([-pi pi]);
• ylim sets only the y axis limits
» ylim([-1 1]);
• To specify both at once, use axis:
» axis([-pi pi -1 1]);
¾ sets the x axis limits between -pi and pi and the y axis limits
between -1 and 1
• Can specify tickmarks
» set(gca,'XTick', linspace(-pi,pi,3))
¾ see doc axes for a list of properties you can set this way
¾ more on advanced figure customization in lecture 4
Axis Modes
• Built-in axis modes
» axis square
¾ makes the current axis look like a box
» axis tight
¾ fits axes to data
» axis equal
¾ makes x and y scales the same
» axis xy
¾ puts the origin in the bottom left corner (default)
» axis ij
¾ puts the origin in the top left corner (for viewing matrices)
Multiple Plots in one Figure
• Use the figure command to open a new figure
» figure
• or activate an open figure
» figure(1)
• To have multiple axes in one figure
» subplot(2,3,1) or subplot(231)
¾ makes a figure with 2 rows and three columns of axes, and
activates the first axis for plotting
¾ each axis can have labels, a legend, and a title
» subplot(2,3,4:6)
¾ activating a range of axes fuses them into one
• To close existing figures
» close([1 3])
¾ closes figures 1 and 3
» close all
¾ closes all figures (useful in scripts/functions)
Copy/Paste Figures
• Figures can be pasted into other apps (word, ppt, etc)
• EditÆ copy optionsÆ figure copy template
¾ Change font sizes, line properties; presets for word and ppt
• EditÆ
copy figure to copy figure
• Paste into document of interest
Courtesy of The MathWorks, Inc. Used with permission.
Saving Figures
• Figures can be saved in many formats. The common ones
are:
.fig preserves all
information
.bmp uncompressed
image
.eps high-quality
scaleable format
.pdf compressed
image
Courtesy of The MathWorks, Inc.
Used with permission.
Figures: Exercise
• Open a figure and plot a sine wave over two periods with
data points at 0, pi/8, 2pi/8… . Use black squares as
markers and a dashed red line of thickness 2 as the line
» figure
» plot(0:pi/4:4*pi,sin(0:pi/4:4*pi),'rs--',...
'LineWidth',2,'MarkerFaceColor','k');
• Save the figure as a pdf
• View with pdf viewer.
Visualizing matrices
• Any matrix can be visualized as an image
» mat=reshape(1:10000,100,100);
» imagesc(mat);
» colorbar
• imagesc automatically scales the values to span the entire
colormap
• Can set limits for the color axis (analogous to xlim, ylim)
» caxis([3000 7000])
Colormaps
• You can change the
colormap:
» imagesc(mat)
¾ default map is jet
» colormap(gray)
» colormap(cool)
» colormap(hot(256))
• See help hot for a list
• Can define custom colormap
» map=zeros(256,3);
» map(:,2)=(0:255)/255;
» colormap(map);
Images: Exercise
• Construct a Discrete Fourier Transform Matrix of size 128
using dftmtx
• Display the phase of this matrix as an image using a hot
colormap with 256 colors
» dMat=dftmtx(128);
» phase=angle(dMat);
» imagesc(phase);
» colormap(hot(256));
3D Line Plots
• We can plot in 3 dimensions just as easily as in 2
» time=0:0.001:4*pi;
» x=sin(time);
» y=cos(time);
» z=time;
plot3(x,y,z,'k','LineWidth',2);
»
» zlabel('Time');
10
• Use tools on figure to rotate it 5
• Can set limits on all 3 axes 0
-5
» xlim, ylim, zlim
-10
1
0.5 1
0.5
0
0
-0.5 -0.5
-1 -1
Surface Plots
• It is more common to visualize surfaces in 3D
• Example: f(x,y)=sin(x)cos(y)
x∈[−π ,π];y∈[−π ,π]
• surf puts vertices at specified points in space x,y,z, and
connects all the vertices to make a surface
• The vertices can be denoted by matrices X,Y,Z
• How can we make these matrices
¾ loop (DUMB)
¾ built-in function: meshgrid
surf
• Make the x and y vectors
» x=-pi:0.1:pi;
» y=-pi:0.1:pi;
• Use meshgrid to make matrices (this is the same as loop)
» [X,Y]=meshgrid(x,y);
• To get function values,
evaluate the matrices
» Z =sin(X).*cos(Y);
• Plot the surface
» surf(X,Y,Z)
» surf(x,y,Z);
surf Options
• See help surf for more options
• There are three types of surface shading
» shading faceted
» shading flat
» shading interp
• You
can change colormaps
» colormap(gray)
contour
• You can make surfaces two-dimensional by using contour
» contour(X,Y,Z,'LineWidth',2)
¾ takes same arguments as surf
¾ color indicates height
¾ can modify linestyle properties
¾ can set colormap
» hold
on
» mesh(X,Y,Z)
Exercise: 3-D Plots
• Plot exp(-.1(x^2+y^2))*sin(xy) for x,y in [-2*pi,2*pi]
with interpolated shading and a hot colormap:
» x=-2*pi:0.1:2*pi;
» y=-2*pi:0.1:2*pi;
» [X,Y]=meshgrid(x,y);
» Z =exp(-.1*(X.^2+Y.^2)).*sin(X.*Y);
» surf(X,Y,Z);
»
shading interp
» colormap hot
Specialized Plotting Functions
• MATLAB has a lot of specialized plotting functions
• polar-to make polar plots
» polar(0:0.01:2*pi,cos((0:0.01:2*pi)*2))
• bar
-to make bar graphs
» bar(1:10,rand(1,10));
• quiver -to add velocity vectors to a plot
» [X,Y]=meshgrid(1:10,1:10);
» quiver(X,Y,rand(10),rand(10));
• stairs-plot piecewise constant functions
» stairs(1:10,rand(1,10));
• fill-draws and fills a polygon with specified vertices
» fill([0 1 0.5],[0 0 1],'r');
• see help on these functions for syntax
• doc specgraph - for a complete list
Outline
(1) Plotting Continued
(2) Scripts
(3) Functions
(4) Flow Control
Scripts: Overview
• Scripts are
¾ written in the MATLAB editor
¾ saved as MATLAB files (.m extension)
¾ evaluated line by line
• To create an MATLAB file from command-line
» edit myScript.m
• or click
Courtesy of The MathWorks, Inc. Used with permission.
Scripts: the Editor
* Means that it's not saved
Line numbers
MATLAB
file path Debugging tools
Help file
Comments
Courtesy of The MathWorks, Inc. Used with permission.
Possible breakpoints
Scripts: Good Practice
• Take advantage of "smart indent" option
• Keep code clean
¾ Use built-in functions
¾ Vectorize, vectorize, vectorize
¾ When making large matrices, allocate space first
- Use nan or zeros to make a matrix of the desired size
• Keep constants at the top of the MATLAB file
• COMMENT!
¾ Anything following a % is seen as a comment
¾ The first contiguous comment becomes the script's help file
¾ Comment thoroughly to avoid wasting time later
Hello World
• Here are several flavors of Hello World to introduce MATLAB
• MATLAB will display strings automatically
» ‘Hello 6.094’
• To remove “ans =“, use disp()
» disp('Hello 6.094')
• sprintf() allows you to mix strings with variables
» class=6.094;
» disp(sprintf('Hello %g', class))
¾ The format is C-syntax
Exercise: Scripts
• A student has taken three exams. The performance on the
exams is random (uniform between 0 and 100)
• The first exam is worth 20%, the second is worth 30%, and
the final is worth 50% of the grade
• Calculate the student's overall score
• Save script as practiceScript.m and run a few times
» scores=rand(1,3)*100;
» weights=[0.2 0.3 0.5];
» overall=scores*weights’
Outline
(1) Plotting Continued
(2) Scripts
(3) Functions
(4) Flow Control
User-defined Functions
• Functions look exactly like scripts, but for ONE difference
¾ Functions must have a function declaration
Help file
Function declaration
Outputs Inputs
Courtesy of The MathWorks, Inc. Used with permission.
User-defined Functions
• Some comments about the function declaration
Inputs must be specified
function [x, y, z] = funName(in1, in2)
Must have the reserved Function name should
word: function match MATLAB file
name
If more than one output,
must be in brackets
• No need for return: MATLAB returns the variables whose
names match those in the function declaration
• Variable scope: Any variables created within the function
but not returned disappear after the function stops running
• Can
have variable input arguments (see help varargin)
Functions: Exercise
• Take the script we wrote to calculate the student's overall
score and make it into a function
• The inputs should be
¾ the scores row vector
¾ the weight row vector, with the same length as scores
• The output should be
¾ A scalar: the overall score
• Assume the user knows the input constraints (no need to
check if the inputs are in the correct format\size)
• Name the function overallScore.m
Functions: Exercise
Courtesy of The MathWorks, Inc. Used with permission.
Functions
• We're familiar with
» zeros
» size
» length
» sum
• Look at the help file for size by typing
» help size
• The help file describes several ways to invoke the function
¾ D = SIZE(X)
¾ [M,N] = SIZE(X)
¾ [M1,M2,M3,...,MN] = SIZE(X)
¾ M = SIZE(X,DIM)
Functions
• MATLAB functions are generally overloaded
¾ Can take a variable number of inputs
¾ Can return a variable number of outputs
• What would the following commands return:
» a=zeros(2,4,8);
» D=size(a)
» [m,n]=size(a)
» [x,y,z]=size(a)
» m2=size(a,2)
• Take advantage of overloaded methods to make your code
cleaner!
Outline
(1) Plotting Continued
(2) Scripts
(3) Functions
(4) Flow Control
Relational Operators
• MATLAB uses mostly standard relational operators
¾ equal ==
¾ not equal ~=
¾ greater than >
¾ less than <
¾ greater or equal >=
¾ less or equal <=
• Logical operators normal bitwise
¾ And & &&
¾ Or | ||
¾ Not ~
¾ Xor xor
¾ All true all
¾ Any true any
• Boolean values: zero is false, nonzero is true
• See help . for a detailed list of operators
if/else/elseif
• Basic flow-control, common to all languages
• MATLAB syntax is somewhat unique
IF ELSE ELSEIF
if cond if cond if cond1
commands commands1
commands1
end else elseif cond2
commands2
commands2
end else
Conditional statement:
evaluates to true or false commands3
end
• No need for parentheses: command blocks are between
reserved words
for
• for loops: use for a definite number of iterations
• MATLAB syntax:
Loop variable
for n=1:100
commands
end
Command block
• The loop variable
¾ Is defined as a vector
¾ Is a scalar within the command block
¾ Does not have to have consecutive values
• The command block
¾ Anything between the for line and the end
while
• The while is like a more general for loop:
¾ Don't need to know number of iterations
WHILE
while cond
commands
end
• The command block will execute while the conditional
expression is true
• Beware of infinite loops!
Exercise: Control-Flow
• Write a function to calculate the factorial of an integer N using a
loop (you can use a for or while loop). If the input is less than 0,
return NaN. Test it using some values.
» function a = factorial(N)
» if N<0,
» a=nan,
» else
» a = 1;
» for k=1:N
» a = a*k;
» end
» end
• But note that factorial() is already implemented! You should see if
there are built-in functions before implementing something
yourself.
» which factorial
find
• find is a very important function
¾ Returns indices of nonzero values
¾ Can simplify code and help avoid loops
• Basic syntax: index=find(cond)
» x=rand(1,100);
» inds = find(x>0.4 & x<0.6);
• inds will contain the indices at which x has values between
0.4 and 0.6. This is what happens:
¾ x>0.4 returns a vector with 1 where true and 0 where false
¾ x<0.6 returns a similar vector
¾ The & combines the two vectors using an and
¾ The find returns the indices of the 1's
Exercise: Flow Control
• Given x= sin(linspace(0,10*pi,100)), how many of the
entries are positive?
Using a loop and if/else Being more clever
count=0; count=length(find(x>0));
for n=1:length(x)
length(x) Loop time Find time
if x(n)>0
100 0.01 0
count=count+1;
10,000 0.1 0
end
100,000 0.22 0
end
1,000,000 1.5 0.04
• Avoid loops like the plague!
• Built-in functions will make it faster to write and execute
Efficient Code
• Avoid loops whenever possible
¾ This is referred to as vectorization
• Vectorized
code is more efficient for MATLAB
• Use indexing and matrix operations to avoid loops
• For example:
» a=rand(1,100); » a=rand(1,100);
» b=zeros(1,100); » b=[0 a(1:end-1)]+a;
» for n=1:100
¾ Efficient and clean
» if n==1
» b(n)=a(n);
» else
» b(n)=a(n-1)+a(n);
» end
» end
¾ Slow and complicated
Exercise: Vectorization
• Alter your factorial program to work WITHOUT a loop. Use
prod
» function a=factorial(N)
» a=prod(1:N);
• You can tic/toc to see how much faster this is than the
loop!
• BUT…Don’t ALWAYS avoid loops
¾ Over-vectorizing code can obfuscate it, i.e. you won’t be
able to understand or debug it later
¾ Sometime a loop is the right thing to do, it is clearer and
simple
End of Lecture 2
(1) Plotting Continued
(2) Scripts
(3) Functions
(4) Flow Control
Vectorization makes
coding fun!