% Introduction to Matlab --- Raymond Spiteri

% notice that everything after a '%' is a comment
% no matter where it appears on the line

%%%%%%%%%%%%%%%% getting started %%%%%%%%%%%%%%%%%%%%%%%

help % this is a very important command to know!

lookfor % when you're not sure what you want!

demo % for touring the capabilities of Matlab

% you can probably guess what the next two commands do
% (if you can't, you'll probably figure it out pretty quick!)
quit 
exit 

% some other useful commmands

pwd   % print working directory
cd    % on its own, this is equivalent to pwd
      % but it can be used to change directory
    
dir   % both of these show you the contents of the directory
ls    % but they are not exactly the same!

path  % shows you what's in Matlab's path
      % i.e., what directories it will look in for files
     
who   % the names of the variables in your workspace
whos  % the names and sizes

clear % clears the current workspace
      % it is often good practice to start scripts with this command!      
      
diary 'oct30.txt'  % start recording your session in file oct30.txt
% in the meantime, let's look at some pre-defined constants
pi
eps
Inf
NaN
diary off          % stop recording session

% scientific notation is OK

a = 1e-10

% our friend the complex number
i + i
j + j


      
% in Matlab, *everything* is a matrix

A = [1 2 3; 4 5 6; 7 8 9] % give me a matrix

% don't worry -- Matlab is case sensitive, so the old (scalar) a still exists!

size(A)                   % dimensions of A

A'                        % transpose

A + A                     % matrix addition

2*A                       % scalar-matrix multiplication

A - A                     % matrix subtraction

A*A                       % matrix-matrix multiplication

A^2                       % powers of matrices

A/A                       % matrix division??? this really means A*inv(A)

A^(-1)                    % same as inv(A)

det(A)                    % determinant

trace(A)                  % sum of diagonal elements

eig(A)                    % eigenvalues

[V,lambda] = eig(A)       % eigenvectors and eigenvalues

% access a chunk of A

A(:,1)                    % first column of A
A(2,:)                    % second row of A

% component-wise operations

A.*A                      % not the same as A^2 !!!

A.^2                      % same as A.*A

A./A                      % matrix of ones (pretty boring!)

exp(A)                    % take exponential of every element

format long e

log(A)                    % take natural logarithm (ln) of every element

% matrix functions

expm(A)                   % matrix exponential! I + A + A^2/2! + A^3/3! + ...

logm(A)                   % matrix logarithm (complex because of 0 eigenvalue)

% common matrices

m=4; n=2;                 % the semi-colon suppresses the output
                          % very useful when writing scripts (improves performance!)
                          
ones(m,n)                 % matrix of ones  

zeros(m)                  % matrix of zeros

eye(n)                    % identity matrix (math joke)

diag([1,2,3,4])           % a diagonal matrix

diag([1,2,3,4],-1)        % a matrix with a subdiagonal

% linear system solving: given matrix A and vector b such that Ax=b, find x

A = [3 1; 2 2]; 
b = [0; 1];     
x = A\b

% random numbers

x = rand            % a random number between 0 and 1 (uniformly chosen)
A = rand(m)         % uniformly distributed mxm matrix of random numbers
B = randn(m,n)      % normally distributed mxn matrix of random numbers (mean 0, standard deviation 1)

seed = 0;           % used to 'control' randomness 
rand('state',seed)  % (make random runs reproducible)

% let's generate (and save) some random data for later
random_data = randn(1000,1);
save random_data.dat random_data -ascii
clear
load random_data.dat
random_data
more on             % let's stop it so we can look at it!

% simple plotting

ezplot('sin(x)/x')                        % default axes
ezplot('sin(x)/x',[-3*pi, 3*pi,-0.5,1.5]) % customized axes

% data plotting

plot(random_data)
hold on                             % do not make new figure
plot(random_data,'ro')
hold off
semilogy(random_data)

% basic statistical functions

max(random_data)
min(random_data)
mean(random_data)                    % average
std(random_data)                     % standard deviation
median(random_data)
sum(random_data)
prod(random_data)
sort(random_data)                    % sort data in increasing order

hist(random_data,40)                 % create a histogram of data frequencies

a = [0.5 1 1.6 1.2 .8 2.1];          % create some other phony data
pie(a)                               % make a pie chart
pie(a,a==max(a))                     % pull out the largest slice (dieting can wait)

a = sort(a);
t = 1:length(a);
plot(a,'ko')
hold on
coeff = polyfit(t,a,1)               % linear regression (line of best fit)
fit = coeff(1)*t + coeff(2)
plot(t,fit)

coeff = polyfit(t,a,2)               % parabola of best fit
fit = coeff(1)*t.^2 + coeff(2)*t + coeff(3) 
plot(t,fit,'g--')

% simple looping constructs

% for loop
x = 0;
for i=1:10,
  x = x + 1;
end
disp(x)

% while loop
x = 0;
while (x < 10),
    x = x + 1;
end
disp(x)

x=0;
for i=1:10,
  if (x > 5)
      x = x + 1;
  end
end
x

x=0;
for i=1:10,
  if (x > 5)
      x = x + 1;
  else
      x = x - 1;
  end
end
x

% symbolics

S1 = sym('sin(x)')
diff(S1)
diff(S1,4)
int(S1)

% numerical quadrature: quad and quadl

a = input('Please enter left  end of integration: ');
b = input('Please enter right end of integration: ');

quad('sin(x)',a,b)

