\documentclass[12pt]{article}
\title{Matrices and Least Square Fit}
\author{FOSSEE}
\usepackage{listings}
\lstset{language=Python,
    basicstyle=\ttfamily,
  commentstyle=\itshape\bfseries,
  showstringspaces=false,
}
\newcommand{\typ}[1]{\lstinline{#1}}
\usepackage[english]{babel}
\usepackage[latin1]{inputenc}
\usepackage{times}
\usepackage[T1]{fontenc}
\usepackage{ae,aecompl}
\usepackage{mathpazo,courier,euler}
\usepackage[scaled=.95]{helvet}

\begin{document}
\date{}
\vspace{-1in}
\begin{center}
\LARGE{Matrices and Least Square Fit}\\
\large{FOSSEE}
\end{center}
\section{Matrices}
\subsection{Basics}
Matrix Creation\\
\typ{In []: C = array([[1,1,2], [2,4,1], [-1,3,7]])}\\
It creates C matrix of shape 3x3\\
Shape is dimensions of given array.
\begin{lstlisting}
In []: C.shape 
Out[]: (3, 3)
In []: shape([[1,2],[4,5],[3,0]])
Out[]: (3, 2)
\end{lstlisting}
\typ{In []: B = ones_like(C)} \\
B would be array of ones with the same shape and type as C.\\
\typ{In []: A = ones((3,2))} \\
A would be new matrix of given shape(arguments), filled with ones.\\ 
\typ{In []: I = identity(3)}\\
I would be identity matrix of shape 3x3

\subsection{Accessing Elements}
\begin{lstlisting}
In []: C
Out[]: 
array([[ 1,  1,  2],
       [ 2,  4,  1],
       [-1,  3,  7]])
In []: C[1,2]
Out[]: 1
\end{lstlisting}
Two indexes separated by \typ{','} specifies [row, column]. So \typ{C[1,2]} gets third element of second row(indices starts from 0).
\newpage
\begin{lstlisting}
In []: C[1]
Out[]: array([2, 4, 1])
\end{lstlisting}
Single index implies complete row.
\subsection{Changing elements}
\begin{lstlisting}
In []: C[1,1] = -2
In []: C
Out[]: 
array([[ 1,  1,  2],
       [ 2, -2,  1],
       [-1,  3,  7]])

In []: C[1] = [0,0,0]
In []: C
Out[]: 
array([[ 1,  1,  2],
       [ 0,  0,  0],
       [-1,  3,  7]])
\end{lstlisting}

\subsection{Slicing}
Accessing rows with Matrices is straightforward. But If one wants to access particular Column, or want a sub-matrix, Slicing is the way to go.
\begin{lstlisting}
In []: C[:,1]
Out[]: array([1, 0, 3])
\end{lstlisting}
First index(:) specifies row(':' implies all the rows) and second index(1) specifies column(second column).
\begin{lstlisting}
In []: C[1,:]
Out[]: array([0, 0, 0])
\end{lstlisting}
Here we get second row(1), all columns(':') of C matrix.
\newpage
\begin{lstlisting}
In []: C[0:2,:]
Out[]: 
array([[1, 1, 2],
       [0, 0, 0]])
\end{lstlisting}
Result is sub-matrix with first and second row(endpoint is excluded), and all columns from C.
\begin{lstlisting}
In []: C[1:3,:]
Out[]: 
array([[ 0,  0,  0],
       [-1,  3,  7]])

In []: C[:2,:]
Out[]: 
array([[1, 1, 2],
       [0, 0, 0]])
\end{lstlisting}
\typ{':2'} => start from first row, till and excluding third row.
\begin{lstlisting}
In []: C[1:,:]
Out[]: 
array([[ 0,  0,  0],
       [-1,  3,  7]])

In []: C[1:,:2]
Out[]: 
array([[ 0,  0],
       [-1,  3]])
\end{lstlisting}
\typ{'1:'} => Start from second row, till last row\\
\typ{':2'} => Start from first column, till and excluding third column.
\newpage
\subsection{Striding}
Often apart from sub-matrix, one needs to get some mechanism to jump a step. For example, how can we have all alternate rows of a Matrix. \\
Following method will return Matrix with alternate rows.
\begin{lstlisting}
In []: C[::2,:]
Out[]: 
array([[ 1,  1,  2],
       [-1,  3,  7]])
\end{lstlisting}
\typ{C[startR:stopR:stepR,startC:stopC:stepC]} => Syntax of mentioning starting index, ending index, and step to jump.\\
In above mentioned case, \typ{'::2'} means, start from first row, till last row(both are blank), with step of 2, that is, skipping alternate row. After first row, C[startR], next row would be C[startR+stepR] and so on.
\begin{lstlisting}
In []: C[:,::2]
Out[]: 
array([[ 1,  2],
       [ 0,  0],
       [-1,  7]])
\end{lstlisting}
Same as above, just that here we get matrix with each alternate column and all rows.
\begin{lstlisting}
In []: C[::2,::2]
Out[]: 
array([[ 1,  2],
       [-1,  7]])
\end{lstlisting}
\section{Matrix Operations}
For a Matrix A and B of equal shapes.
\begin{lstlisting}
In []: A.T # Transpose
In []: sum(A) # Sum of all elements
In []: A+B # Addition
In []: A*B # Element wise product
In []: dot(A,b) #Matrix multiplication
In []: inv(A) # Inverse
In []: det(A) # Determinant
\end{lstlisting}
Eigen Values and Eigen Vectors
\begin{lstlisting}
In []: eig(A) #Eigen Values and Vectors
In []: eigvals(A) #Eigen Values 
\end{lstlisting}
%% Norm
%% \begin{lstlisting}
%% In []: norm(A)
%% \end{lstlisting}
%% Single Value Decomposition
%% \begin{lstlisting}
%% In []: svd(A)
%% \end{lstlisting}
\section{Least Square Fit Line}
\begin{lstlisting}
L = []
T = []
for line in open('pendulum.txt'):
    point = line.split()
    L.append(float(point[0]))
    T.append(float(point[1]))
Tsq = []
for time in T:
    Tsq.append(time*time)
plot(L, Tsq, '.')
\end{lstlisting}
This is exact curve we get from L Vs Tsq from data.This relation among L and Tsq is not of straight line. For getting Least Square Fit line, we have to solve the relations:\\
$L=m*Tsq+c$ (something similar to $y=m*x+c$)\\
For present scenario, we have L and corresponding Tsq values. For finding m and c at given points we use \typ{lstlq} function provided by pylab. It returns the least-squares solution to an equation. \\
For finding Least Square Fit line for this particular data we have to do following steps:\\
\typ{In []: A = array([L, ones\_like(L)])}\\
A is 2x(Length of array L) array.
\begin{lstlisting}
In []: A = A.T #now A.shape = (Length of array L)x2
In []: result = lstsq(A,TSq)
In []: coef = result[0]
In []: Tline = coef[0]*L + coef[1]
\end{lstlisting}
\typ{coef[0]} is array with all $m$ values, and \typ{coef[1]} contains $c$.\\
To get the final plot.\\
\typ{In []: plot(L, Tline)}

\end{document}
