From 5bf3efe1652144648c4b8c0d3557180545d04cfa Mon Sep 17 00:00:00 2001 From: James Scott-Brown Date: Sun, 15 Sep 2013 01:41:27 +0100 Subject: Matlab: more plotting functions, anonymous functions, matrix factorisations, and other features. Fix some typos. --- matlab.html.markdown | 117 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 97 insertions(+), 20 deletions(-) diff --git a/matlab.html.markdown b/matlab.html.markdown index e72a95ea..1e48618d 100644 --- a/matlab.html.markdown +++ b/matlab.html.markdown @@ -20,10 +20,17 @@ something like this %} +% commands can span multiple lines, using '...': + a = 1 + 2 + ... + + 4 + +% commands can be passed to the operating system +!ping google.com + who % Displays all variables in memory whos % Displays all variables in memory, with their types clear % Erases all your variables from memory -clear('A') % Erases a aprticualr variable +clear('A') % Erases a particular variable openvar('A') % Open variable in variable editor clc % Erases the writing on your Command Window @@ -43,6 +50,7 @@ lookfor command % Searches for a given command % Output formatting format short % 4 decimals in a floating number format long % 15 decimals +format bank % only two digits after decimal point - for financial calculations fprintf % Variables & Expressions @@ -63,7 +71,7 @@ c = exp(a)*sin(pi/2) % c = 7.3891 3 > 1 || 4 > 1 % OR -> ans = 1 ~1 % NOT -> ans = 0 -% Logicals can be applied to matricies: +% Logicals can be applied to matrices: A > 5 % for each element, if condition is true, that element is 1 in returned matrix A[ A > 5 ] @@ -169,9 +177,18 @@ transpose(A) % Transpose the matrix, without taking complex conjugate % Element by Element Arithmetic vs. Matrix Arithmetic +% On their own, the arithmetic operators act on whole matrices. When preceded +% by a period, they act on each element instead. For example: A * B % Matrix multiplication A .* B % Multiple each element in A by its corresponding element in B +% There are several pairs of functions, where one acts on each element, and +% the other (whose name ends in m) acts on the whole matrix. +exp(A) % exponentiate each element +expm(A) % calculate the matrix exponential +sqrt(A) % take the square root of each element +sqrtm(A) % find the matrix whose square is A + % Plotting x = 0:.10:2*pi; % Creates a vector that starts at 0 and ends at 2*pi with increments of .1 @@ -181,9 +198,24 @@ xlabel('x axis') ylabel('y axis') title('Plot of y = sin(x)') axis([0 2*pi -1 1]) % x range from 0 to 2*pi, y range from -1 to 1 + plot(x,y1,'-',x,y2,'--',x,y3,':'') % For multiple functions on one plot -grid on % Show grid; turn off with 'grid off' +legend('Line 1 label', 'Line 2 label') % Label curves with a legend +% Alternative method to plot multiple functions in one plot. +% while 'hold' is on, commands add to existing graph rather than replacing it +plot(x, y) +hold on +plot(x, z) +hold off + +loglog(x, y) % A log-log plot +semilogx(x, y) % A plot with logarithmic x-axis +semilogy(x, y) % A plot with logarithmic y-axis + +fplot (@(x) x^2, [2,5]) % plot the function x^2 from x=2 to x=5 + +grid on % Show grid; turn off with 'grid off' axis square % Makes the current axes region square axis equal % Set aspect ratio so data units are the same in every direction @@ -197,11 +229,19 @@ pcolor(A) % Heat-map of matrix: plot as grid of rectangles, coloured by value contour(A) % Contour plot of matrix mesh(A) % Plot as a mesh surface -h = figure %C reate new figure object, with handle f -figure(h) %M akes the figure corresponding to handle h the current figure +h = figure % Create new figure object, with handle f +figure(h) % Makes the figure corresponding to handle h the current figure +close(h) % close figure with handle h +close all % close all open figure windows +close % close current figure window + +shg % bring an existing graphics window forward, or create new one if needed +clf clear % clear current figure window, and reset most figure properties -% Properties can be set and changed through a figure handle -h = plot(x, y); +% Properties can be set and changed through a figure handle. +% You can save a handle to a figure when you create it. +% The function gcf returns a handle to the current figure +h = plot(x, y); % you can save a handle to a figure when you create it set(h, 'Color', 'r') % 'y' yellow; 'm' magenta, 'c' cyan, 'r' red, 'g' green, 'b' blue, 'w' white, 'k' black set(h, 'LineStyle', '--') @@ -209,22 +249,38 @@ set(h, 'LineStyle', '--') get(h, 'LineStyle') +% The function gcs returns a handle to the axes for the current figure +set(gca, 'XDir', 'reverse'); % reverse the direction of the x-axis + +% To creatw a figure that contains several axes in tiled positions, use subplot +subplot(2,3,1); % select the first position in a 2-by-3 grid of subplots +plot(x1); title('First Plot') % plot something in this position +subplot(2,3,2); % select second position in the grid +plot(x2); title('Second Plot') % plot something there + + +% To use functions or scripts, they must be on your path or current directory +path % display current path +addpath /path/to/dir % add to path +rmpath /path/to/dir % remove from path +cd /path/to/move/into % change directory + + % Variables can be saved to .mat files save('myFileName.mat') % Save the variables in your Workspace load('myFileName.mat') % Load saved variables into Workspace - % M-file Scripts % A script file is an external file that contains a sequence of statements. % They let you avoid repeatedly typing the same code in the Command Window % Have .m extensions - % M-file Functions % Like scripts, and have the same .m extension % But can accept input arguments and return an output -% Also, they have their own workspace (ie. different variable scope) -% double_input.m - .m file name must be same as function name in file +% Also, they have their own workspace (ie. different variable scope). +% Function name should match file name (so save this example as double_input.m). +% 'help double_input.m' returns the comments under line beginning function function output = double_input(x) %double_input(x) returns twice the value of x output = 2*x; @@ -234,14 +290,26 @@ double_input(6) % ans = 12 % You can also have subfunctions and nested functions. % Subfunctions are in the same file as the primary function, and can only be -% called from within that function. Nested functions are defined within another +% called by functions in the file. Nested functions are defined within another % functions, and have access to both its workspace and their own workspace. +% If you want to create a function without creating a new file you can use an +% anonymous function. Useful when quickly defining a function to pass to +% another function (eg. plot with fplot, evaluate an indefinite integral +% with quad, find roots with fzero, or find minimum with fminsearch). +% Example that returns the square of it's input, assigned to to the handle sqr: +sqr = @(x) x.^2; +sqr(10) % ans = 100 +doc function_handle % find out more % User input a = input('Enter the value: ') -% Reading in data +% Stops execution of file and gives control to the keyboard: user can examine +% or change variables. Type 'return' to continue execution, or 'dbquit' to exit +keyboard + +% Reading in data (also xlsread/importdata/imread for excel/CSV/image files) fopen(filename) % Output @@ -249,10 +317,10 @@ disp(a) % Print out the value of variable a disp('Hello World') % Print out a string fprintf % Print to Command Window with more control -% Conditional statements -if a > 15 +% Conditional statements (the parentheses are optional, but good style) +if (a > 15) disp('Greater than 15') -elseif a == 23 +elseif (a == 23) disp('a is 23') else disp('neither condition met') @@ -316,14 +384,18 @@ NaN inf % Solving matrix equations (if no solution, returns a least squares solution) -x=A\b % Solves Ax=b -x=B/a % Solves xa=B +x=A\b % Solves Ax=b. Faster and more numerically accurate than using inv(A)*b. +x=b/A % Solves xA=b +inv(A) % calculate the inverse matrix +pinv(A) % calculate the pseudo-inverse % Common matrix functions zeros(m,n) % m x n matrix of 0's ones(m,n) % m x n matrix of 1's -diag(A) % Extracts the diagonal elements of a matrix +diag(A) % Extracts the diagonal elements of a matrix A +diag(x) % Construct a matrix with diagonal elements listed in x, and zeroes elsewhere eye(m,n) % Indentity matrix +linspace(x1, x2, n) % Return n equally spaced points, with min x1 and max x2 inv(A) % Inverse of matrix A det(A) % Determinant of A eig(A) % Eigenvalues and eigenvectors of A @@ -340,13 +412,18 @@ dot(A,B) % Returns scalar product of two vectors (must have the same length) transpose(A) % Returns the transpose of A flipl(A) % Flip matrix left to right +% Alternative forms for matrices +[L, U, P] = lu(A) % LU decomposition: PA = LU +[P, D] = eig(A) % eigen-decomposition: AP = PD, P's columns are eigenvectors and D's diagonals are eigenvalues +[U,S,V] = svd(X) % SVD: XV = US, U and V are unitary matrices, S has non-negative diagonal elements in decreasing order + % Common vector functions max % largest component min % smallest component length % length of a vector sort % sort in ascending order sum % sum of elements -prod % product of elements +prod % product of elements mode % modal value median % median value mean % mean value -- cgit v1.2.3 From 372e79a3fb3c6db8d350defae65d30f0a7f48663 Mon Sep 17 00:00:00 2001 From: James Scott-Brown Date: Sun, 15 Sep 2013 01:42:13 +0100 Subject: Relabel a section to 'Matrix Factorisations --- matlab.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab.html.markdown b/matlab.html.markdown index 1e48618d..eaf50e8e 100644 --- a/matlab.html.markdown +++ b/matlab.html.markdown @@ -412,7 +412,7 @@ dot(A,B) % Returns scalar product of two vectors (must have the same length) transpose(A) % Returns the transpose of A flipl(A) % Flip matrix left to right -% Alternative forms for matrices +% Matrix Factorisations [L, U, P] = lu(A) % LU decomposition: PA = LU [P, D] = eig(A) % eigen-decomposition: AP = PD, P's columns are eigenvectors and D's diagonals are eigenvalues [U,S,V] = svd(X) % SVD: XV = US, U and V are unitary matrices, S has non-negative diagonal elements in decreasing order -- cgit v1.2.3 From e0f9a4dab392c13df8c909eb4a58a81950c30e1a Mon Sep 17 00:00:00 2001 From: James Scott-Brown Date: Sun, 15 Sep 2013 01:48:02 +0100 Subject: Comment explaining LU decomposition --- matlab.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab.html.markdown b/matlab.html.markdown index eaf50e8e..98d085da 100644 --- a/matlab.html.markdown +++ b/matlab.html.markdown @@ -413,7 +413,7 @@ transpose(A) % Returns the transpose of A flipl(A) % Flip matrix left to right % Matrix Factorisations -[L, U, P] = lu(A) % LU decomposition: PA = LU +[L, U, P] = lu(A) % LU decomposition: PA = LU,L is lower triangular, U is upper triangular, P is permutation matrix [P, D] = eig(A) % eigen-decomposition: AP = PD, P's columns are eigenvectors and D's diagonals are eigenvalues [U,S,V] = svd(X) % SVD: XV = US, U and V are unitary matrices, S has non-negative diagonal elements in decreasing order -- cgit v1.2.3 From 28f0e163e2d4d5d8e55f484fef93190dda4e7593 Mon Sep 17 00:00:00 2001 From: James Scott-Brown Date: Sun, 15 Sep 2013 02:53:32 +0100 Subject: Typos --- matlab.html.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/matlab.html.markdown b/matlab.html.markdown index 98d085da..e9874f21 100644 --- a/matlab.html.markdown +++ b/matlab.html.markdown @@ -249,10 +249,10 @@ set(h, 'LineStyle', '--') get(h, 'LineStyle') -% The function gcs returns a handle to the axes for the current figure +% The function gca returns a handle to the axes for the current figure set(gca, 'XDir', 'reverse'); % reverse the direction of the x-axis -% To creatw a figure that contains several axes in tiled positions, use subplot +% To create a figure that contains several axes in tiled positions, use subplot subplot(2,3,1); % select the first position in a 2-by-3 grid of subplots plot(x1); title('First Plot') % plot something in this position subplot(2,3,2); % select second position in the grid @@ -394,7 +394,7 @@ zeros(m,n) % m x n matrix of 0's ones(m,n) % m x n matrix of 1's diag(A) % Extracts the diagonal elements of a matrix A diag(x) % Construct a matrix with diagonal elements listed in x, and zeroes elsewhere -eye(m,n) % Indentity matrix +eye(m,n) % Identity matrix linspace(x1, x2, n) % Return n equally spaced points, with min x1 and max x2 inv(A) % Inverse of matrix A det(A) % Determinant of A -- cgit v1.2.3 From 3eb4dbab9a4a6d9082f424289f982e8489138033 Mon Sep 17 00:00:00 2001 From: James Scott-Brown Date: Sun, 15 Sep 2013 16:06:26 +0100 Subject: Typos --- matlab.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/matlab.html.markdown b/matlab.html.markdown index e9874f21..27b00eba 100644 --- a/matlab.html.markdown +++ b/matlab.html.markdown @@ -199,7 +199,7 @@ ylabel('y axis') title('Plot of y = sin(x)') axis([0 2*pi -1 1]) % x range from 0 to 2*pi, y range from -1 to 1 -plot(x,y1,'-',x,y2,'--',x,y3,':'') % For multiple functions on one plot +plot(x,y1,'-',x,y2,'--',x,y3,':') % For multiple functions on one plot legend('Line 1 label', 'Line 2 label') % Label curves with a legend % Alternative method to plot multiple functions in one plot. @@ -403,7 +403,7 @@ trace(A) % Trace of matrix - equivalent to sum(diag(A)) isempty(A) % Tests if array is empty all(A) % Tests if all elements are nonzero or true any(A) % Tests if any elements are nonzero or true -isequal(A, B) %Tests equality of two arrays +isequal(A, B) % Tests equality of two arrays numel(A) % Number of elements in matrix triu(x) % Returns the upper triangular part of x tril(x) % Returns the lower triangular part of x -- cgit v1.2.3 From 4ddcd660f8d08196c8628156d3e1bc0f1c785d97 Mon Sep 17 00:00:00 2001 From: James Scott-Brown Date: Wed, 18 Sep 2013 18:05:29 +0100 Subject: Explain difference between command and function syntax --- matlab.html.markdown | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/matlab.html.markdown b/matlab.html.markdown index 27b00eba..b8e552e2 100644 --- a/matlab.html.markdown +++ b/matlab.html.markdown @@ -37,8 +37,8 @@ clc % Erases the writing on your Command Window diary % Toggle writing Command Window text to file ctrl-c % Abort current computation -edit('myfunction.m') % Open function in editor -type('myfunction.m') % Print the source of function to Command Window +edit('myfunction.m') % Open function/script in editor +type('myfunction.m') % Print the source of function/script to Command Window profile viewer % Open profiler @@ -62,6 +62,17 @@ myVariable = 4; % Semi colon suppresses output to the Command Window a = 2; b = 3; c = exp(a)*sin(pi/2) % c = 7.3891 +% Calling functions can be done in either of two ways: +% Standard function syntax: +load('myFile.mat', 'y') +% Command syntax: +load myFile.mat y % no parentheses, and spaces instead of commas +% Note the lack of quote marks in command form: inputs are always passed as +% literal text - cannot pass variable values. Also, can't reveive output: +[V,D] = eig(A) % this has no equivalent in command form + + + % Logicals 1 > 5 % ans = 0 10 >= 10 % ans = 1 @@ -384,8 +395,10 @@ NaN inf % Solving matrix equations (if no solution, returns a least squares solution) +% The \ and / operators are equivalent to the functions mldivide and mrdivide x=A\b % Solves Ax=b. Faster and more numerically accurate than using inv(A)*b. x=b/A % Solves xA=b + inv(A) % calculate the inverse matrix pinv(A) % calculate the pseudo-inverse -- cgit v1.2.3 From c3fcedf70f1b607166be3e8ba64d0da25ccfddb0 Mon Sep 17 00:00:00 2001 From: James Scott-Brown Date: Wed, 18 Sep 2013 18:08:31 +0100 Subject: Fix typo - misspelt 'receive' --- matlab.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab.html.markdown b/matlab.html.markdown index b8e552e2..15ff2303 100644 --- a/matlab.html.markdown +++ b/matlab.html.markdown @@ -68,7 +68,7 @@ load('myFile.mat', 'y') % Command syntax: load myFile.mat y % no parentheses, and spaces instead of commas % Note the lack of quote marks in command form: inputs are always passed as -% literal text - cannot pass variable values. Also, can't reveive output: +% literal text - cannot pass variable values. Also, can't receive output: [V,D] = eig(A) % this has no equivalent in command form -- cgit v1.2.3