~~SLIDESHOW~~ ====== Introduction to MATLAB ====== Mithat Konar\\ 2019-04-26 ===== What is it? ===== * A //high-level//, //interpreted// language and environment targeting scientific computing. * A freaking huge, feature filled graphing calculator * Comprehensive * Expensive ===== Alternatives ===== * [[https://www.gnu.org/software/octave/|GNU Octave]] * FOSS (GPL) * Mostly syntax compatible * 3rd party [[http://octave-online.net/|SaaS]] available * [[http://www.scilab.org/|Scilab]] * FOSS (GPL compatible CeCILL license) * Similar idea, not as compatible * [[https://www.scipy.org/|SciPy]] * FOSS (MIT-like) * Python based, very different * Increasingly popular * [[https://github.com/spyder-ide/spyder|Spyder IDE]] ===== Two Modes ===== * Interactive * Interact using a command line interface. * Scripted * Run scripts stored in files. * Same syntax in both ===== Variables ===== * Numbers are double precision floats by default. * Strings exist too. * Use single quotes. * For a literal single quote in a string, use two single quotes. * Lots of [[https://www.mathworks.com/help/matlab/data-types_data-types.html|other types]]. * Ending with a semicolon suppresses output to console. a = 3.14159 b = a + 5 c = sin(a); foo = 'How''s it?' ===== Comments ===== * Use the percent sign. % a single line comment a = 99; % this works too %{ foo = 'multiple line comments'; baz = 'use curly brackets inside'; qux = 'a pair of percent signs.'; %} ===== Row vectors ===== * One dimensional horizontal array. a = [5 4 2 1] b = 1 : 10 % [1, 2, ... , 10] t = 0 : 0.1 : 1 % 0 to 1 in 0.1 steps x = 0 : 0.1 : 2*pi % 0 to 2π in 0.1 steps ===== Vector functions ===== % x is a row vector x = 0 : 0.1 : 2*pi % compute sin(x) from 0 to 2π y = sin(x) % how big is a variable? size(y) % many, many more ... ===== 2D Plotting ===== % plot row vector (index is abscissa) plot(y) % plot y vs. x (lengths must match) plot(x, y) * x, y variable names are not special. * //Indexing starts at 1!// ===== Complex numbers ===== x = 0.3 + 0.4i; ===== Higher dimensions ===== % separate matrix rows with ';' a = [1 2 3; 4 5 6; 7 8 9]; b = [9 8 7; 6 5 4; 3 2 1]; ===== Matrix operations ===== r = 1.25 * a; % scalar multiplication r = a * b; % matrix multiplication r = a .* b; % elementwise multiplication r = a ./ b; % elementwise division ===== Matrix inverse and transpose ===== r = inv(a); % inverse r = a'; % transpose ===== Indexing ===== * Starts at one. % individual element (row, col) a(3, 2); % submatrix (row range, col range) bigMatrix(1:3, 10:end); % set values of submatrix, all cols bigMatrix(1:3, :) = -1; ===== 3D plots ===== t = 0 : 0.1 : 1; data = sin(2*pi*t); z = data' * data; % create a surface plot surf(z); ===== What variables? ===== % display info about variables in current workspace: whos ===== Clearing ===== % clear the screen: clc % clear (delete) variables: clear varname1 varname2 % clear all variables: clear ===== Help! ===== help what-you-want-help-with ===== Some useful functions ===== * ''sqrt(x)'': square root * ''mod(a, b)'': modulus after division * ''ones(m, n)'', ''zeros(m, n)'': matrix of all ones or zeros * ''rand(m, n)'': matrix of random numbers * ''linspace(x1, x2, n)'': n linear points between x1 and x2 * n defaults to 100 * [[https://www.mathworks.com/help/matlab/functionlist.html|Heaps more]]: don't reinvent the wheel! ===== MATLAB scripts ===== * Scripts containing MATLAB code can be stored as ''//filename//.m''. * Run by invoking ''//filename//''. % Plot sin(x)/x for x = -4*pi to 4*pi. x = linspace(-4*pi, 4*pi, 1000); y = sin(x) ./ x; plot(x, y); % will skip NaN points ===== Console output ===== * With ''disp()''. a = 'hello'; disp(a); disp([a ' world']); % [] is one way to concatenate strings c = 42; disp(c); disp(['The answer: ' num2str(c)]); % conversion required ===== Console input ===== * With ''input()'' prompt = 'What is the frequency? '; x = input(prompt); % evaluates input ans = input(prompt, 's'); % doesn't evaluate, % can get string. ===== Control structures ===== ===== if, if/else ===== if x > y disp('Ponies!'); elseif x == y disp('Skittles!'); disp('... don''t eat them all at once.'); else disp('Rainbows!'); end * Use commas to do everything on one line. * Commas not needed for statements ending with a semicolon: if x > y, disp('Ponies!'); else disp('Rainbows!'); end ===== switch ===== switch switch_expr case case_expr, statement, ..., statement case {case_expr1, case_expr2, case_expr3,...} statement, ..., statement ... otherwise, statement, ..., statement end * ''switch_expr'' doesn't need to be a number * ''case'' can match multiple values * No "break" is needed. ===== while ===== while n < 10 y = y * n; n = n + 1; end On one line: while n < 10, y = y * n; n = n + 1; end ===== for ===== for n = 0 : 0.5 : 2 disp(n); end On one line: for n = 0 : 0.5 : 2, disp(n); end ===== Nesting control structures ===== * No problem. ===== Relational operators ===== * ''a < b'', ''lt(a, b)'' * ''a > b'', ''gt(a, b)'' * ''%%a <= b%%'', ''le(a, b)'' * ''%%a >= b%%'', ''ge(a, b)'' * ''a == b'', ''eq(a, b)'' * ''a ~= b'', ''ne(a, b)'' ===== Logical operators ===== * ''a && b'': short-circuit logical AND (scalars only) * ''a || b'': short-circuit logical OR (scalars only) * ''a & b'', ''and(a, b)'': element-wise logical AND (scalars or vectors) * ''a | b'', ''or(a, b)'': element-wise logical OR (scalars or vectors) * ''~a '', ''not(a)'': logical NOT * ''xor(a, b)'': logical EXCLUSIVE OR ===== More logical operators ===== * ''any(a)'': true if any element of vector is nonzero * ''all(a)'': true if all elements of vector are nonzero ===== User functions ===== * Functions can be defined in a ''.m'' file with a ''main'' function. * Several functions in one file. * Functions aren't shared. * Functions can be defined in files that also end in ''.m'' * One function per file. * File name must match function name. * Functions can be called by any other ''.m'' file or interactively. ===== With "main" function ===== * Minimum syntax: function main() area1 = traparea(1, 2, 3); disp(area1); end function area = traparea(a, b, h) area = 0.5 * (a + b) * h; end ===== Stand alone function ===== * Minimum syntax:((Recktenwald, Gerald. "MATLAB Functions -- Basic Features." MATLAB Functions -- Basic Features. Accessed April 30, 2016. http://web.cecs.pdx.edu/~gerry/MATLAB/programming/basics.html.\\ All examples in in the "User functions" section are from Recktenwald.)) function area = traparea(a, b, h) area = 0.5 * (a + b) * h; end % Uses traparea function defined in traparea.m area1 = traparea(1, 2, 3); disp(area1); ===== Documenting functions ===== * First comment block after first line is used to [[https://www.mathworks.com/help/matlab/matlab_prog/add-help-for-your-program.html|document functions]]. * What user sees when they type ''help //function-name//''. * Only with single-function m-files. function area = traparea(a, b, h) % traparea(a, b, h) Computes the area of a trapezoid given % the dimensions a, b and h, where a and b % are the lengths of the parallel sides and % h is the distance between these sides. area = 0.5 * (a + b) * h; end ===== Which path? ===== * ''userpath'': list the directories where MATLAB looks for m-files. * ''addpath'': add additional directories where MATLAB looks for m-files. * ''savepath'': make changes permanent. * ''pathtool'': launch a GUI to manage paths. ===== MATLAB's IDE ===== * We've only covered syntax here. * MATLAB's [[https://www.mathworks.com/videos/working-in-the-development-environment-69021.html|"Working the the Development Environment"]] concisely covers the use and features of the IDE.