# Basic Matlab definitions and operations

This tutorial script shows the basic ways that Matlab can be used and some built-in operations.

## Contents

## A Calculator

From the start Matlab can be used as a basic calculator, for example:

5+2342 2354.3452*45345.23 234/23

ans = 2347 ans = 1.0676e+08 ans = 10.1739

## Column and Row vectors

Matlab's basic data structure is an array with the mathematical properties of a vector or matrix (an individual number is a scalar, or vector of length one). A vector can be created by using the "[]" symbols with spaces in between:

A=[ 1 2 3 4 5]

A = 1 2 3 4 5

The default is to make a row vector. To make a column vector use the ";" symbol to separate:

B=[ 1; 2; 3; 4; 5]

B = 1 2 3 4 5

## Matrix operations

For another example, I define the number of rows and columns then I use the rand command to make up random vectors and matrices. Next I give examples of standard operations, including special Matlab operations.

numrows=5; numcols=5; myrowvec=rand(numrows,1); mycolvec=rand(1,numcols); mymatrix=rand(numrows,numcols);

Matrix multiplication right.

ans1=mymatrix*myrowvec

ans1 = 1.4788 1.8762 2.2505 1.8595 1.8251

Matrix multiplication left.

ans2=mycolvec*mymatrix

ans2 = 2.0461 2.3164 2.0875 1.2882 0.3671

Dot product method 1.

ans3=dot(myrowvec,mycolvec)

ans3 = 1.8859

Dot product method 2.

ans3b=mycolvec*myrowvec

ans3b = 1.8859

Outer product.

ans4=myrowvec*mycolvec

ans4 = 0.0795 0.2269 0.4456 0.7801 0.7861 0.0884 0.2523 0.4954 0.8673 0.8740 0.0124 0.0354 0.0694 0.1216 0.1225 0.0891 0.2544 0.4995 0.8746 0.8813 0.0617 0.1761 0.3458 0.6055 0.6102

Transpose.

ans5=mymatrix' myrowvec ans6=myrowvec'

ans5 = 0.1576 0.9706 0.9572 0.4854 0.8003 0.1419 0.4218 0.9157 0.7922 0.9595 0.6557 0.0357 0.8491 0.9340 0.6787 0.7577 0.7431 0.3922 0.6555 0.1712 0.7060 0.0318 0.2769 0.0462 0.0971 myrowvec = 0.8147 0.9058 0.1270 0.9134 0.6324 ans6 = 0.8147 0.9058 0.1270 0.9134 0.6324

Entry by entry multiplication.

ans7=myrowvec.*(2*ones(size(myrowvec))) ans8=myrowvec.*mycolvec'

ans7 = 1.6294 1.8116 0.2540 1.8268 1.2647 ans8 = 0.0795 0.2523 0.0694 0.8746 0.6102

## Searching vectors

Consider trying to find all the entries in a vector with a value larger than 0.5.

myrowvec2=rand(50000,1);

Time how long it takes.

tic myind=zeros(size(myrowvec2)); for ii=1:50000 if myrowvec2(ii)>0.5 myind(ii)=1; end end time1=toc

time1 = 0.0025

But Matlab is a vectorized language so for large vectors a much faster way to do this is to use the logical operations.

tic myind2=(myrowvec2>0.5); time2=toc

time2 = 5.7922e-04

and it would be easy to have multiple ifs, say finding values between 0.5 and 0.75.

tic myind3=((myrowvec2>0.5)&(myrowvec2<0.75)); time3=toc

time3 = 7.8635e-04

The savings from vectorization become evident for large matrices. There is another related command that is sometimes useful.

```
myind=find(myrowvec2<0.5); % finds the indices of the entries in myrowvec2 that are less than a half.
```

IMPORTANT: IN GENERAL TRY TO AVOID FOR LOOPS IN MATLAB

## Function definition

While Matlab has the means to create complex software structures involving functions I tend to prefer flat codes and for these inline function definitions are very useful. If you define your parameters before the function definition the functions will just use them all the time. This example is a traveling internal wave in a channel.

H=20; % total depth. L=2*1e1; % wavelength. k=2*pi/L; % wave number. modenum=1; % mode number. m=modenum*pi/H; % vertical wave number. N0=2e-2; N02=N0^2; % buoyancy frequency and buoyancy frequency squared. sigma=(N0*k*H)/sqrt(modenum^2*pi^2+k*H*k*H); % frequency. myper=2*pi/sigma; % period. amp=0.1; % wave amplitude.

You use the th '@' symbol to define an anonymous function. Basically put @(variables) function_definition.

```
myf=@(x,z,t) amp*cos(k*x-sigma*t).*sin(m*z);
% To call the function we would just say:
wavenow=myf(0,H/2,0)
```

wavenow = 0.1000

OK let's use all that to do something cool This loop makes a movie of the graph of a polynomial as the coefficient of the cubic term changes and marks the negative regions.

xg=linspace(-5,5,1001); % define a grid. figure(1),clf % open a figure and clear it. for a3=-2:0.1:2 % loop over the coefficient of x^3.

myp=@(x) 0.001*x.^4+a3.*x.^3-x.^2+10*x-5; pg=myp(xg); myind=find(pg<0); clf plot(xg,pg,'k',xg(myind),pg(myind),'ro','linewidth',2)

xlabel('x') % label ylabel('p(x)') % label title(['a3 = ' num2str(a3,4)]) % title axis([-5 5 -100 100]) % fix the axis, [x_min x_max y_min y_max] grid on drawnow

```
end
```