\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}