Date Tags MATLAB

Here we give an introductory tutorial to get you started with MATLAB. For further training, you can find more tutorials online. In particular, Mathworks, the company that owns MATLAB, has an extensive suite of tutorials on their website (you need to sign up for a free account to access them). There is also a good MATLAB tutorial at Software Carpentry.

Command Window

Open MATLAB. We will be mostly working in the Command Window and the Editor panels. The Command Window is similar to a Unix shell and to the iPhython shell. It is where you enter MATLAB commands interactively and where MATLAB displays text output. Some unix commands such as `pwd` `cd` `ls` `cp` `mv` etc work in the command window.

Enter commands to the right of the prompt symbol `>>`. You can use MATLAB like a calculator. For example, type in an expression and then hit enter

```>> 1 + 2.2
ans =
3.2000
```

By default, MATLAB returns the value of this addition in the variable ans. You can instead assign it to a variable

```>> a = 1 + 2.2
a =
3.2000
```

You can suppress the answer being printed out by terminating the expression with a semicolon

```>> a = 1 + 2.2;
```

There are lots of ways to create expressions and assign the answer to a new variable, for example

```>> a = 1;
>> b = 2;
>> c = a + b;
```
```>> a = 1;
>> b = 2;
>> c = 3;
>> d = (a+b)*c
d =
9
```

The various arithmetic, relational and logical operators in MATLAB can be found by typing `help ops` in the command Window

```>> help ops

Operators and special characters.

Arithmetic operators.
plus       - Plus                               +
uplus      - Unary plus                         +
minus      - Minus                              -
uminus     - Unary minus                        -
mtimes     - Matrix multiply                    *
times      - Array multiply                    .*
mpower     - Matrix power                       ^
power      - Array power                       .^
mldivide   - Backslash or left matrix divide    \
mrdivide   - Slash or right matrix divide       /
ldivide    - Left array divide                 .\
rdivide    - Right array divide                ./
idivide    - Integer division with rounding option.
kron       - Kronecker tensor product

Relational operators.
eq         - Equal                             ==
ne         - Not equal                         ~=
lt         - Less than                          <
gt         - Greater than                       >
le         - Less than or equal                <=
ge         - Greater than or equal             >=

Logical operators.
relop      - Short-circuit logical AND         &&
relop      - Short-circuit logical OR          ||
and        - Element-wise logical AND           &
or         - Element-wise logical OR            |
not        - Logical NOT                        ~
punct      - Ignore function argument or output ~
xor        - Logical EXCLUSIVE OR
any        - True if any element of vector is nonzero
all        - True if all elements of vector are nonzero
```

To see what variables are in the workspace, you can either view the Workspace Panel or simply type in `whos` in the Command Window.

```>> whos
Name      Size            Bytes  Class     Attributes

a         1x1                 8  double
b         1x1                 8  double
c         1x1                 8  double
d         1x1                 8  double
```

To clear a variable from the workspace, you can `clear` it

```>> clear b
```

To clear all the variables from the workspace, use

```>> clear all
```

This will clear all the variables and release the memory they were holding, which can be useful when you have been working with large vectors or matrices.

Matrices and vectors

MATLAB was designed originally for easy matrix and vector computations and linear algebra. Vectors and matrices can de defined using square brackets

Create a row vector:

```>> a = [1 2 3 4];
```

Create a column vector be separating the rows with semicolons.

```>> b = [5; 6; 7; 8];
```

You can compute a vector dot product using the `*` Operators

```>> a*b
ans =
70
```

However, this will only work if the vectors are compatible for linear algebra. One needs to be a row vector and the other a column vector and they have to have the same number of Element-wise

```>>   length(a)
ans =
4
>>   length(b)
ans =
4
```

While `length` returns the number of elements in a vector, the `size` command is more general and gives the number of rows and columns.

```>> size(a)
ans =
1     4
```

This command is more useful when you assign the output to some variables

```>> [nrows, ncols] = size(a)
nrows =
1
ncols =
4
```

A key sticking point for new MATLAB uses is to remember that `*` does vector (and also matrix) multiplication. To instead do array multiplication, use the `.*` operator. The vectors or matrices to be multiplied should have the same size (same number of rows and columns).

```>> c = [9 10 11 12];
>> a.*c
ans =
9    20    33    48
```

Similarly, you can raise the elements of an array to a power using the `.^` Operators

```>> a.^2
ans =
1     4     9    16
```

Matrices are like vectors. Define them by rows, separating the columns using semicolons:

```>> m = [ 1 2 3 4; 5 6 7 8]
m =
1     2     3     4
5     6     7     8
```

You can take the transpose of a matrix using the `'` operator or using the `transpose` function

```>> m'
ans =
1     5
2     6
3     7
4     8
>> transpose(m)
ans =
1     5
2     6
3     7
4     8
```

You can add matrices

```>> n = [9 10 11 12; 13 14 15 16]
n =
9    10    11    12
13    14    15    16
>> m+n
ans =
10    12    14    16
18    20    22    24
```

You can create arrays of numbers using index notation

```>> series = 1:10
series =
1     2     3     4     5     6     7     8     9    10
```

To change the spacing, using the notation `start:spacing:stop`

```>>  series = 1:2:20
series =
1     3     5     7     9    11    13    15    17    19
```

Slicing vectors and matrices You can use indices to extract a slice from a matrix or vector

```>> subset = series(1:4)
subset =
1     3     5     7
```

You can use the keyword `end` to specify slicing all the way to the end rather than listing the specific index for the last value

```>> subset = series(3:end)
subset =
5     7     9    11    13    15    17    19
```

Matrices are easily sliced too:

```>> msubset = m(2,3:4)
msubset =
7     8
```

linspace and logspace

You can create arrays of evenly spaced numbers using the `linspace` and `logspace` functions.

```>> linspace(-1,10,5)
ans =
-1.0000    1.7500    4.5000    7.2500   10.0000
```

Type `help linspace` for more info.

```>> logspace(-1,3,5)
ans =
1.0e+03 *
0.0001    0.0010    0.0100    0.1000    1.0000
```

Notice how the exponent of these numbers is shown.

Help and Documentation

You can type `help <function name>` into the command window if you know the name of the function. The MATLAB Documentation is also very helpful. Type `doc` into the Command Window to launch the Documentation browser.

Strings

Character strings in MATLAB are defined using single quotes:

```>> clear all;
astring = 'hello world';
whos
Name         Size            Bytes  Class    Attributes

astring      1x11               22  char
```

You can slice strings too

```>> astring(1:5)
ans =
'hello'
```

Scripts

You can create a script file containing MATLAB commands. This are known as m-files, since their name must end with the extension '.m'. You can then run the m-file in the command window, and MATLAB will read the file and execute the comands as if you had typed them into the command window at the prompt.

Create an m-file called 'test.m' using the MATLAB editor. Paste this in for the contents:

```str = 'hello world';
disp(str);

a = [1 2 3 4];
b = 2*a;
disp(b)
```

Then in the command window run test.m:

```>> ls
test.m

>> test
hello world
2     4     6     8
```

This was just a simple script, but you can make much more complex scripts that read and write data, do complex operations and plot results in figures, etc.

Functions

MATLAB comes with a large number of built-in standard mathematical functions such as `sin()`,`cos()`,`log()`,`log10()`,`exp()`, etc. You can find lists of all the built in mathematical functions by looking in the Documentation browser.

You can also defined you own custom functions by creating function m-files. For example, create an m-file called myfunc.m with the contents

```function y = myfunc(x)
y = x.^2;
end
```

Then call it from the command window

```>> x = [1:10];
>> y = myfunc(x);
>> disp(y)
1     4     9    16    25    36    49    64    81   100
```

Functions can have more than one input and more than one output:

```function [z,z2,x2,y2] = myfunc2(x,y)
x2 = x.^2;
y2 = y.^2;
z2 = x2 + y2;
z  = sqrt(z2);
end
```

Loops In myfun2() above, we used array notation to deal with case when the inputs x and y are vectors or matrices. MATLAB is optimized to work fastest using array operations. However, sometimes it is inevitable that you need to use a `for` or `while` loop to carry out some operations. Here are two simple examples

```clear x y
x = [1 2 3 4 5];
for i = 1:length(x)
y(i) = x(i).^2;
end
disp(y)
```

Note that you do not need to indent the for loop code in MATLAB (but you do in Python). So the above could also be written as

```clear x y
x = [1 2 3 4 5];
for i = 1:length(x); y(i) = x(i).^2; end
disp(y)
```

However, the indented code in the middle of the for-loop is easier to read and so we recommend that from a stylistic viewpoint.

You can define for loops on the command line, but typically they are best used in m-files.

Here's an example of a very simple while loop:

```x = 0;
while x < 10
x = x + 1;
disp(x)
end
```

Control flow

You can control the flow of your code using an `if` statement. For example

```if I == J
A(I,J) = 2;
elseif abs(I-J) == 1
A(I,J) = -1;
else
A(I,J) = 0;
end
```

If you have more than two or three `if`,`elseif` conditions, it is better to use a `switch` command sequence:

```method = 'Bilinear';
switch lower(method)
case {'linear','bilinear'}
disp('Method is linear')
case 'cubic'
disp('Method is cubic')
case 'nearest'
disp('Method is nearest')
otherwise
disp('Unknown method.')
end
```

Here method is a string and `lower(method)` converts it to lower case for use in the switch construct. Notice has the first `case` has two strings; if either is matched, that case is executed. You can also use numeric values and mix them with strings (e.g., `case{1,2,3,'one','two','three'}`).

Plotting

```x = linspace(0,10,100);
y = x.^2;
plot(x,y,'b-');
```

Plot two items on the same figure:

```u = x.^3;
plot(x,y,'b-',x,u,'r-')
xlabel('x axis')
ylabel('y axis')
title('This is the title')
```

or you can add then sequentially using the `hold` command

```figure;
plot(x,y,'b-');
hold on;
plot(x,u,'r-')
plot(x,u,'ro')
plot(x,y,'b.');
xlabel('x axis')
ylabel('y axis')
title('This is the title')
legend('y','u')
```

Some other useful plotting commands:

```surf(x,y,z)
pcolor(x,y,z)
semilogx(x,y)
semilogy(x,y)
loglog(x,y)
subplot(m,n,p)
```

Once you create a plot figure, you can add more plots to it by using the `hold on` command. If you don't use the hold command, MATLAB will erase the previous plot.

There are many commands for changing the appearance of your plots, depending on the particular plot type. Here are a few that are pretty commonly used (look them up in the documentation for further info):

```xlabel
ylabel
zlabel
title
shading
colormap
colorbar
caxis
axis
```

The `figure` command creates a new figure. When you have lots of figures, it can be helpful to create variables that refers to each figure:

```hFigure1 = figure;
% insert plot commands here

hFigure2 = figure;
% insert more plot commands here
```

Here variables `hFigure1` and `hFigure2` are handle variables that refer to the two figures. After creating the figures, type `hFigure1` into the command window. Here you will see the hidden world of all the possible settings you can specify for a figure's appearance. You can also create variables that refer to particular plot axes (created with `subplot`) as well as variables for each plot object (line, points, surfaces, etc). All of these have attributes that control their appearance. We don't have time to cover them in class, but you can dig deep into the documentation to figure out how to customize their appearances.

Saving figures There are a few ways to save figures. You can use the buttons in the figure's menu bar to adjust its size on the printed page (or you can do this using the figure's handle variable mentioned above) and then to save it to a file. However, for programming, its generally better to use commands in your codes to automatically save the figure. The easiest command is `saveas(H,'FILENAME','FORMAT')`. Here are a few examples where we will save the figure with handle variable hFigure 1 (as created above):

```saveas(hFigure1,'myFigure','fig')
```

This will save the figure in MATLAB's .fig format. You can click on the figure and it will reopen, allowing you to use MATLAB to continue interacting with the figure (i.e., adding stuff to it or changing its appearance).

If you want to print the figure, you can specify an image format such as one of these.

```saveas(hFigure1,'myFigure','jpg')
saveas(hFigure1,'myFigure','png')
saveas(hFigure1,'myFigure','pdf')
```

There are many other formats, see the help for `saveas` and `print` commands. The PDF format is useful since it stores the graphics in a vector image format, allowing you to later use software like Adobe Illustrator to fine tune the appearance if desired. However, I recommend learning how to control the plot appearance using you MATLAB scripts to, e.g., change the line width and color, marker size and color, etc so that you don't need to do anything else in graphical design software later. The other formats such as jpg and png create bitmapped images where the graphical objects get turned into pixels, so you can't later edit their appearance.

Structures

Structures in MATLAB are a construct for grouping many variables together into a single object. You can define a structure two different ways

```S =   struct('field1',VALUES1,'field2',VALUES2,...)
```

or

```S.field1 = VALUES1;
S.field2 = VALUES2;
...
```

How are structures useful? Consider this example. Suppose you have a complicated set of data that has many different attributes. For example the main data is the variable `data`, which is some measured quantity of interest. However, in addition to `data`, you might have lots of meta-data that describes the data collection method, location, and other related variables such as the latitude and longitude of the data collection, time, date, temperature, elevation, instrument name, sensor ID number, etc. You get the idea. You could define a variable for each of these quantities. However, if they are normal variables, you will have to keep track of all of them. For example suppose you read them in and then want to pass them to a function, you would have to have a code similar to this

```...
[data, latitude, logitude, time,date,temperature,elevation,instrument_name, ...
sensor_ID] = readMyData(fileName);

results = processData(data, latitude, logitude, time,date,temperature,elevation,instrument_name, ...
sensor_ID);
...
```

Now suppose you instead read these variables into a structure

```function S = readData(fileName);
% ... commands to open file and read in the variables...
%...

% Then assign to structure:
S.data = data;
S.latitude = latitude;
S.latitude = latitude;
S.logitude = logitude;
S.time    = time;
...
```

Now your main code will be much more readable:

```S = readMyData(fileName);

results = processData(S);
```

So you can think of structures as being like a box that you use to hold onto a collection of variables. Then instead of passing each variable to a function one at a time, you instead can just pass the box that holds all of them.

Reading and writing data

The save command will save variables to a file. Here are some examples from the documentation:

```% Save all variables from the workspace to test.mat:
save test.mat

% Save two variables, where FILENAME is a variable:
savefile = 'pqfile.mat';
p = rand(1, 10);
q = ones(10);
save(savefile, 'p', 'q');

% Save the fields of a structure as individual variables:
s1.a = 12.7;
s1.b = {'abc', [4 5; 6 7]};
s1.c = 'Hello!';
save('newstruct.mat', '-struct', 's1');
```

By default, MATLAB will save using its own binary .mat format. You can instead save as an ascii text file using the `'-ascii'` option. See the help for further details.

The `load` command is used to read in a data file in MATLAB's .mat format. It will also work to load in ascii text files as long as they only have numbers in them and are either a simple vector or matrix.Here are some examples from the documentation:

```  gongStruct = load('gong.mat')      % All variables
load('handel.mat', 'y')            % Only variable y
load('accidents.mat', 'hwy*')      % Variables starting with "hwy"
load('topo.mat', '-regexp', '\d')  % Variables containing digits

% Using command form
load gong.mat
load topo.mat -regexp \d
load 'hypothetical file.mat'       % Filename with spaces
```

`xlsread` will read in an excel spreadsheet.

You can also write you own custom code to read in more complicated data file formats. See the help for commands `fopen`,`fclose`,`fgets`,`fscanf`,`sscanf` to get started. Likewise, there are custom commands you can use to write data to files using your own custom format.

Working with time and dates

MATLAB has some built-in functions that are helpful for working with times and dates.

`datenum` is a command that converts a date into a serial date numbers N. A serial date number of 1 corresponds to Jan-1-0000.
The year 0000 is merely a reference point and is not intended to be interpreted as a real year. Examples:

```  n = datenum('19-May-2000')                % returns n = 730625.
n = datenum(2001,12,19)                   % returns n = 731204.
n = datenum(2001,12,19,18,0,0)            % returns n = 731204.75.
n = datenum('19.05.2000','dd.mm.yyyy')    % returns n = 730625.
```

Why is this useful? It is useful since now the time and date has been converted into a single number that you can perform operations on (add, subtract, compare, etc). The command `now` returns the current time and date as a datenum.

You can then convert a datenum into a string using the `datestr` command:

```  n = now;
datestr(n)
datestr(n,1)
datestr(n,13)
```

See the documentation for `datestr` for futher info.

If you plot a time series using a datenum vector for the x-axis, you can use the `datetick` command to get nicely formatted time stamps on the x-axis labels.