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