0% found this document useful (0 votes)
109 views46 pages

Lecture 2, Bahman Moraffah

This document discusses visualization and programming in MATLAB. It covers topics like plotting different types of graphs, customizing plots, working with figures, saving figures, visualizing matrices as images, 3D line and surface plots. Programming concepts like scripts, functions and flow control are also introduced.

Uploaded by

Elham
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
109 views46 pages

Lecture 2, Bahman Moraffah

This document discusses visualization and programming in MATLAB. It covers topics like plotting different types of graphs, customizing plots, working with figures, saving figures, visualizing matrices as images, 3D line and surface plots. Programming concepts like scripts, functions and flow control are also introduced.

Uploaded by

Elham
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 46

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!
 

You might also like