%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Introducing Matlab 
% adapted from Eero Simoncelli (http://www.cns.nyu.edu/~eero) 
% and Hany Farid (http://www.cs.dartmouth.edu/~farid)
% and Serge Belongie (http://www-cse.ucsd.edu/~sjb) 
% This version by Tim Marks (http://mplab.ucsd.edu/~marks)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (1) Help and basics

% The symbol "%" is used in front of a comment.

% To get help, type "help" (will give list of help topics) or "help topic" 
% (e.g., "help plot")

% If you don't know the exact name of the topic or command you are looking for,
% type "lookfor keyword" (e.g., "lookfor regression")

% When writing a long matlab statement that exceeds a single row use ...
% to continue statement to next row.

% When using the command line, a ";" at the end means matlab will not
% display the result. If ";" is omitted then matlab will display result.

% Use the up-arrow to recall commands without retyping them (and down
% arrow to go forward in commands).  

% Other commands borrowed from emacs and/or tcsh:
% C-a moves to beginning of line (C-e for end), C-f moves forward a
% character (C-b moves back), C-d deletes a character, C-k deletes 
% the line to the right of the cursor, C-p goes back through the
% command history and C-n goes forward (equivalent to up and down arrows),
% tab command completion.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (2) Objects in matlab -- the basic objects in matlab are scalars,
% vectors, and matrices...


N	= 5				% a scalar
v 	= [1 0 0]			% a row vector
v	= [1,2,3]			% a row vector
v	= [1;2;3]			% a column vector
v 	= v'				% transpose a vector 
					%  (row to column or column to row)
v	= [-4:4]			% a vector in a specified range:
v	= pi*[-4:4]/4			%
v	= [1:.5:3]			%  [start:stepsize:end]
v	= []				% empty vector


                        		% Specific matrices:	1ST parameter is ROWS
					% 			2ND parameter is COLS 
m	= zeros(2,3)   			% a matrix of zeros
v	= ones(1,3)  			% a matrix of ones
v	= rand(3,1)			% rand matrix (see also randn)
m	= eye(3)			% identity matrix (3x3)

% Create a text file 'matrix_data' containing:
					% 	2     3     4
					% 	5     6     7
					% 	1     2     3
% Then type the following commands

load matrix_data 			% read data from the file
matrix_data				% The variable containing the file data


v	= [5 6 7];			% access a vector element
v(3)					%	vector(index) 

length(v)				% number of elements in a vector

m 	= [1 2 3; 4 5 6]		% a matrix
m(1,3)					% access a matrix element
					% 	matrix(rownumber, columnnumber)
m(2,:)    				% access a matrix row (2nd row)
m(:,1)    				% access a matrix column (1st row)
m(:)					% turn matrix into a vector (concatenate columns)

size(m)					% size of a matrix (ROWS,COLS)
size(m,1)  				% number of rows
size(m,2)  				% number of columns

m1	= zeros(size(m))		% create a new matrix with size of m

who					% list of variables
whos					% list variables with size/type


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (3) Simple operations on vectors and matrices

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  (A) Pointwise (element by element) Operations:

% addition of vectors/matrices and multiplication by a scalar
% are done "element by element"
a	= [1 2 3 4];			% vector
2 * a 					% scalar multiplication
a / 4					% scalar multiplication
b	= [5 6 7 8];			% vector
a + b					% pointwise vector addition
a - b					% pointwise vector subtraction
a .^ 2					% pointise vector squaring (note .)
a .* b					% pointwise vector multiply (note .)
a ./ b					% pointwise vector divide (note .)

log( [1 2 3 4] )			% pointwise arithmetic operation
round( [1.5 2; 2.2 3.1] )		% pointwise arithmetic operation


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  (B) Vector Operations (no for loops needed)
% Built-in matlab functions operate on vectors, if a matrix is given,
% then the function operates on each column of the matrix

a	= [1 4 6 3]			% vector
sum(a)					% sum of vector elements
mean(a)					% mean of vector elements
var(a)					% variance
std(a)					% standard deviation
max(a)					% maximum


a 	= [1 2 3; 4 5 6]		% matrix
mean(a) 	                     	% mean of each column
max(a)          	             	% max of each column    
max(max(a))			     	% to obtain max of matrix 
max(a(:))		     		% 	or...


%%%%%%%%%%%%%%%%%%%%%%%%
%  (C) Matrix Operations:

[1 2 3] * [4 5 6]'  			% row vector 1x3 times column vector 3x1 
                    			% results in single number, also
                   			% known as dot product or inner product

[1 2 3]' * [4 5 6]  			% column vector 3x1 times row vector 1x3
                    			% results in 3x3 matrix, also
                    			% known as outer product

a	= rand(3,2)			% 3x2 matrix
b	= rand(2,4)			% 2x4 matrix
c	= a * b				% 3x4 matrix

a	= [1 2; 3 4; 5 6]		% 3 x 2 matrix
b	= [5 6 7];			% 1 x 3 vector
b * a					% matrix multiply
a' * b'					% matrix multiply


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (4) Saving your work

save mysession      			% creates file mysession.mat with all variables
save mysession a b  			% save only variables a and b in the file

clear					% clear all variables
clear a b           			% clear variables a and b

load mysession				% load variables from file
a
b


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (5) Relations and control statements

% Example: given a vector v, create a new vector u with values equal to
% v if they are greater than 0, and equal to 0 if they less than or
% equal to 0.


v	= [3 5 -2 5 -1 0]		% 1: USING FOR LOOPS
u 	= zeros( size(v) );		% initialize
for i = 1:size(v,2)			
  if( v(i) > 0 )
    u(i) = v(i); 
  end
end
u

v	= [3 5 -2 5 -1 0]		% 2: WITHOUT FOR LOOPS
u2	= zeros( size(v) );		% initialize
ind	= find( v>0 )			% index into positive elements 
u2(ind)	= v( ind )			


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (6) Creating functions using m-files:
% Functions in matlab are written in m-files. Create a file called 
% 'thres.m' In this file put the following:

function res = thres( v )

res = zeros( size(v) );			% initialize
ind = find( v>0 );			% index into positive elements 
res(ind) = v(ind);			

% Save the file  thres.m  then type the following at the command line:

v	= [3 5 -2 5 -1 0]
u	= thres( v )			% call function from command line


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (7) Plotting 

x	= [0 1 2 3 4];			% basic plotting
plot( x );
plot( x, 2*x );
axis( [0 8 0 8] );

x 	= pi*[-24:24]/24;
plot( x, sin(x) );
xlabel( 'radians' );
ylabel( 'sin value' );
title( 'dummy' );
gtext( 'put cursor where you want text and press mouse' );

figure;					% multiple functions in separate graphs
subplot( 1,2,1 );
plot( x, sin(x) );
axis square;
subplot( 1,2,2 );
plot( x, 2.*cos(x) );
axis square;

figure;					% multiple functions in single graph
plot( x,sin(x) );
hold on;              			
plot (x, 2.*cos(x), '--' );
legend( 'sin', 'cos' );
hold off;

figure;					% matrices as images
m	= rand(64,64);
imagesc(m)
colormap gray;
axis image
axis off;


gcf					% Figure number of current (active) figure
figure(gcf)				% Bring current figure window to front
figure(1)				% Make figure 1 current and bring it to front


close(1)				% close figure 1 window
close(gcf)				% close current figure window
close all				% close all figure windows

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (8) Working with the Images and the Matlab Image Processing Toolbox

[I,map]=imread('trees.tif');		% read a TIFF image

figure
imshow(I,map)				% display it as indexed image w/colormap

I2=ind2gray(I,map);			% convert it to grayscale

figure
imshow(I2)				% display image

image(I2)				% display image less intelligently
colormap(gray(256))			% use gray colormap for values 0-255
					%	 0 = black, 255 = white

imagesc(I2,[0 20])			% scale data to use full colormap
					%  for values between 0 and 50
					%	  0 = black, 50 or greater = white

% Now drag the figure window to stretch the image's aspect ratio. Then type:

axis image				% make displayed aspect ratio proportional
					%  to image dimensions 

I=imread('football.jpg');		% read a JPEG image into 3D array

figure
imshow(I)
rect=getrect;				% use mouse to select rectangle. Then:
I2=imcrop(I,rect);			% crop
I2=rgb2gray(I2);			% convert to grayscale (2D matrix)
max(I2(:))				% maximum intensity value in I2
min(I2(:))				% minimum intensity value in I2
colormap(gray(256));			% use gray colormap for values 0-255
image(I2)				% display image
imagesc(I2)				% scale data to use full colormap
					%  between min and max values in I2
					%          min = black, max = white

colorbar				% turn on color bar
pixval					% display pixel values interactively
					%  as cursor is positioned over image
truesize				% display at resolution of one screen pixel
					%  per image pixel
truesize(2*size(I2))			% display at resolution of two screen pixels
					%  per image pixel

I3=imresize(I2,0.5,'bil');		% resize by 50% using bilinear interpolation
I3=imrotate(I2,45,'bil','crop');	% rotate 45 degrees and crop to original size
I3=double(I2);				% convert from uint8 to double, to allow
					%  math operations
imagesc(I3.^2)				% display squared image intensities (pixel-wise)
imagesc(log(I3))			% display log of image intensities

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%