% ==================================================================
% A few more matlab basics

% format: change appearance of output
% 'format long' makes matlab print in full (16 digit) precision

pi
ans =
    3.1416

format long
pi
ans =
   3.141592653589793

% Special numbers: inf, NaN, i, j

% inf is infinity, for example 1 divided by 0
1/0 
ans =
   Inf

% NaN is 'not a number', for example 0 divided by 0, which is undefined
0/0
ans =
   NaN

% i and j are the unit imaginary numbers, the square root of -1
i
ans =
  0.000000000000000 + 1.000000000000000i

j
ans =
  0.000000000000000 + 1.000000000000000i

i^2
ans =
    -1

% most common functions have extensions to the set of complex numbers
cos(2+3*i)
ans =
 -4.189625690968807 - 9.109227893755337i


% caution: if you use a function name for a variable name, you won't be able
% to access the function until you clear the variable

rand = rand()
rand =
   0.090750827467831


rand()
ans =
   0.090750827467831

rand()
ans =
   0.090750827467831

rand()
ans =
   0.090750827467831

% hmmm, why do I keep getting the same random number?
% because you're access a variable named 'rand' and not the function 'rand()", silly!

whos
  Name          Size            Bytes  Class     Attributes

  ans           1x1                16  double    complex   
  rand          1x1                 8  double              
  x         10000x1             80000  double              

% you need to run 'clear rand' to release the variable

clear rand

whos
  Name          Size            Bytes  Class     Attributes

  ans           1x6                12  char                
  x         10000x1             80000  double              

% now you can access the function again
rand()
ans =
   0.546980919566268

rand()
ans =
   0.895124242734885

% characters: one last data type, along with double, int32, uint32, ..., and logical

% you can assign a set fo characters to a variable as follows

f = 'foo'
f =
foo

whos
  Name          Size            Bytes  Class     Attributes

  ans           1x1                 8  double              
  f             1x3                 6  char                
  x         10000x1             80000  double              


% ====================================================================
% Vectors and matrices

% Construct a row vector by explicitly listing its elements, separated by commas
x = [4, 5, 9]
x =
     4     5     9

% Construct a column vector by explicitly listing its elements, separated by semicolons
x = [4; 5; 9]
x =
     4
     5
     9

% To access an element (component) of the vector, use parentheses
% x(i) accesses ith component of x

x(1)
ans =
     4
x(2)
ans =
     5
x(3)
ans =
     9
x(4)
{Index exceeds matrix dimensions.} % error message


% Transpose: the transpose operator ' (apostrophe) turns a row vector into a col vec

x
x =
     4     5     9

y = x'  
y =
     4
     5
     9

y'
ans =
     4     5     9


% Matlab colon syntax

% m:n means m through n by intervals of 1

1:4 
ans =
     1     2     3     4

1:10
ans =
     1     2     3     4     5     6     7     8     9    10


% x:inc:y means x through y by steps of inc

0:0.2:1   % 0 through 1 by steps of 0.2

ans =
         0    0.2000    0.4000    0.6000    0.8000    1.0000

% use this functionality to produce plot of sin(x) for 0 <= x < pi
x = 0:0.1:pi; 
size(x)
ans =
     1    32
plot(x,sin(x),'r-')
plot(x,sin(x),'r.-')


% linspace: another way to get a vector of uniformly spaced points

x = linspace(0,pi,100);   % 100 uniformly distributed points btwn 0 and pi
size(x)
ans =
     1   100

plot(x,sin(x),'r.-')

x(1)
ans =
     0
x(2)
ans =
    0.0317
x(3)
ans =
    0.0635
x(4)
ans =
    0.0952


% subindexing: how to extract a subset of the components of a vector

% observe that x is a vector of dimension 100 and look at the values of
% its first four components

size(x)
ans =
     1   100
x(1)
ans =
     0
x(2)
ans =
    0.0317
x(3)
ans =
    0.0635
x(4)
ans =
    0.0952

% recall that 1:4 means the vector [1, 2, 3, 4]
1:4
ans =
     1     2     3     4

% extract components 1,2,3,4 of x using syntax x(1:4)
x(1:4)
ans =
         0    0.0317    0.0635    0.0952

% extract components 1,2,3,4 of x using syntax x([1 2 3 4]), will give same thing
x([1 2 3 4])
ans =
         0    0.0317    0.0635    0.0952

% Some more demonstrations of subindexing
x = 11:15
x =
    11    12    13    14    15

x(1:3)
ans =
    11    12    13

x(3:5)
ans =
    13    14    15

x([5 4 3 2 1])
ans =
    15    14    13    12    11

x(5:-1:1)
ans =
    15    14    13    12    11

x(randi(5,1,5))
ans =
    15    14    14    13    12


% Vector arithmetic: vectors add elementwise
x = [ 4 5 9]
x =
     4     5     9

y = [1 2 0]
y =
     1     2     0

x + y
ans =
     5     7     9

% scalar multiplication
x
x =
     4     5     9

2*x
ans =
     8    10    18

% norm: measures the length of a vector
norm(x)
ans =
   11.0454
x
x =
     4     5     9
sqrt(4^2 + 5^2 + 9^2)
ans =
   11.0454


% Matrices

% create a matrix literally 
A = [4, 5, 9 ; 3, 2, 1 ; 0 , 6,4]
A =
     4     5     9
     3     2     1
     0     6     4

% Accessing components
A = [4, 5, 9 ; 3, 2, 1 ; 0 , 6,4]
A =
     4     5     9
     3     2     1
     0     6     4

% A(i,j) gets elem in ith row and jth col
A(1,1)
ans =
     4

A(1,2)
ans =
     5

A(3,1)
ans =
     0


% you can also assign a new number into a matrix element
A(3,1) = 99
A =
     4     5     9
     3     2     1
    99     6     4

% indexing with colons
% A(:,j) returns jth column

A(:,1)
ans =
     4
     3
    99

A(:,2)
ans =
     5
     2
     6

A(:,3)
ans =
     9
     1
     4
A
A =
     4     5     9
     3     2     1
    99     6     4

% A(i,:) returns ith row

A(1,:)
ans =
     4     5     9

A(2,:)
ans =
     3     2     1

A(3,:)
ans =
    99     6     4

% A(i,m:n) returns ith row elements m through n

A =
     4     5     9
     3     2     1
    99     6     4

A(1,:)
ans =
     4     5     9

A(1,2:3)
ans =
     5     9