Source Codes
MATRIX INVERSION
Private Sub Matrix_Inversion(ByVal A(,) As Single, ByVal Bound As Integer, ByRef A_inv(,) As Single)
'---- Gauss Jordan Inverse Matrix |A I| = |I B| where B = A^-1
Dim _triang(Bound, (Bound * 2) + 1) As Single
Dim p, q As Integer
'----Forming |A I| matrix
For p = 0 To Bound
For q = 0 To Bound
_triang(p, q) = A(p, q)
If p = q Then
_triang(p, q + (Bound + 1)) = 1
End If
Next
Next
'----Gauss Jordan for reducing to |B I|
Dim line_1 As Integer
Dim temp, pivot As Single
For k = 0 To Bound
'Bring a non-zero element first by changes lines if necessary
If _triang(k, k) = 0 Then
For n = k To Bound
If _triang(n, k) <> 0 Then line_1 = n : Exit For 'Finds line_1 with non-zero element
Next n
'Change line k with line_1
For m = k To ((Bound * 2) + 1)
temp = _triang(k, m)
_triang(k, m) = _triang(line_1, m)
_triang(line_1, m) = temp
Next m
End If
pivot = _triang(k, k)
For n = k To (Bound * 2) + 1
_triang(k, n) = _triang(k, n) / pivot
Next n
'For other lines, make a zero element by using:
'Ai1=Aij-A11*(Aij/A11)
'and change all the line using the same formula for other elements
Dim mult_1 As Single
For n = 0 To Bound
If n = k And n = Bound Then Exit For
If n = k And n < Bound Then n = n + 1 'Do not change that element (already equals to 1), go for next one
If _triang(n, k) <> 0 Then 'if it is zero, stays as it is
mult_1 = _triang(n, k) / _triang(k, k)
For m = k To (Bound * 2) + 1
_triang(n, m) = _triang(n, m) - (_triang(k, m) * mult_1)
Next m
End If
Next n
Next k
For p = 0 To Bound
For q = 0 To Bound
A_inv(p, q) = _triang(p, q + (Bound + 1))
Next
Next
End Sub
Private Sub Matrix_Transpose(ByVal A(,) As Single, ByVal Bound As Integer, ByRef AT(,) As Single)
Dim i, j As Integer
For i = 0 To Bound
For j = 0 To Bound
AT(i, j) = A(j, i)
Next
Next
End Sub
CHOLESKI DECOMPOSITION
CHOLESKI DECOMPOSITION
Private Sub Choleski_Decomposition(ByVal A(,) As Single, ByVal n As Integer, ByRef L(,) As Single)
Dim Sum1, Sum2, Sum3 As Single
ReDim L(n, n)
L(0, 0) = Math.Sqrt(A(0, 0))
For j = 1 To n
L(j, 0) = A(j, 0) / L(0, 0)
Next
For i = 1 To n - 1
For k = 0 To i
Sum1 = Sum1 + Math.Pow(L(i, k), 2)
Next
L(i, i) = Math.Sqrt(A(i, i) - Sum1)
For j = i + 1 To n
For k = 0 To i
Sum2 = Sum2 + (L(j, k) * L(i, k))
Next
L(j, i) = ((A(j, i) - Sum2) / (L(i, i)))
Next
Next
For k = 0 To n - 1
Sum3 = Sum3 + Math.Pow(L(n, k), 2)
Next
L(n, n) = Math.Sqrt(A(n, n) - Sum3)
End Sub
GAUSS ELIMINATION
GAUSS ELIMINATION
#Region "Gauss Elimination Method"
'-----Redefined Gauss Elimination Procedure
Private Sub Gauss(ByVal A(,) As Single, ByVal B() As Single, ByRef X() As Single, ByVal Bound As Integer)
'___________________________________________________________________________________________
'---------------- HouseHolder Transformation developed by Samson Mano ----------------------
'-------------------- based on the following notes -----------------------------------------
'----------------- 1. https://en.wikipedia.org/wiki/Gaussian_elimination--------------------
'___________________________________________________________________________________________
Dim Triangular_A(Bound, Bound + 1) As Single
Dim soln(Bound) As Single 'Solution matrix
For m = 0 To Bound
For n = 0 To Bound
Triangular_A(m, n) = A(m, n)
Next
Next
'.... substituting the force to triangularmatrics....
For n = 0 To Bound
Triangular_A(n, Bound + 1) = B(n)
Next
ForwardSubstitution(Triangular_A, Bound)
ReverseElimination(Triangular_A, X, Bound)
End Sub
Private Sub ForwardSubstitution(ByRef _triang(,) As Single, ByVal bound As Integer)
'Forward Elimination
'Dim _fraction As Single
For k = 0 To bound - 1
For i = k + 1 To bound
If _triang(k, k) = 0 Then
Continue For
End If
_triang(i, k) = _triang(i, k) / _triang(k, k)
For j = k + 1 To bound + 1
_triang(i, j) = _triang(i, j) - (_triang(i, k) * _triang(k, j))
Next
Next
Next
End Sub
Private Sub ReverseElimination(ByRef _triang(,) As Single, ByRef X() As Single, ByVal bound As Integer)
'Back Substitution
For i = 0 To bound
X(i) = _triang(i, bound + 1)
Next
For i = bound To 0 Step -1
For j = i + 1 To bound
X(i) = X(i) - (_triang(i, j) * X(j))
Next
X(i) = X(i) / _triang(i, i)
Next
End Sub
#End Region
EIGEN VALUES & EIGEN VECTORS USING HOUSEHOLDER TRANSFORMATION/ QR DECOMPOSITION
EIGEN VALUES & EIGEN VECTORS USING HOUSEHOLDER TRANSFORMATION/ QR DECOMPOSITION
Householder transformations are widely used in numerical linear algebra, to perform QR decompositions and in the first step of the QR algorithm. The QR algorithm for the computation of eigenvalues, which is based on the QR-decomposition, is considered to be one of the 10 most important algorithms of the 20th century
#Region "EigenValues and EigenVectors Calculator Using HouseHolder Transformation and QR Decomposition"
'___________________________________________________________________________________________________________________________________________________________________________________________
'___________________________________________________________________________________________________________________________________________________________________________________________
Private Sub EigenValues_and_EigenVectors_HouseHolder_Transfromation(ByVal A_Matrix(,) As Double, ByVal n As Integer, ByRef EigenValues() As Double, ByRef Eigen_Vector(,) As Double)
'___________________________________________________________________________________________
'---------------- EigenValues and EigenVector calculator developed by Samson Mano ----------
'------------ based on HouseHolder Transfromation and QR Decomposition ---------------------
'-------------- Eigen values and Eigen Vectors of A_Matrix is calculated ------------------
'--------- for 4x4 matrix n = 3 , 7x7 matrix n =4 and ExE matrix n = E-1 !!!! Important Note
'___________________________________________________________________________________________
Dim TPPk_Matrix(n, n) As Double
HouseHolder_Transformation(A_Matrix, n, TPPk_Matrix)
Dim Possib_EigenVector(n, n) As Double
Dim lv1, lv2, lv3 As Integer
'----- keep unit matrix for possib_Eigenvector
For lv1 = 0 To n Step +1
Possib_EigenVector(lv1, lv1) = 1
Next
Do
Dim TQMatrix(n, n) As Double
Dim TRMatrix(n, n) As Double
QRDecomposition(A_Matrix, n, TQMatrix, TRMatrix)
'---- Update A matrix to A1 which is A = QR => Q^-1A = R => Q^-1AQ = RQ = A1 and Q^-1 = Q^T
For lv1 = 0 To n Step +1
For lv2 = 0 To n Step +1
A_Matrix(lv1, lv2) = 0
For lv3 = 0 To n Step +1
A_Matrix(lv1, lv2) = A_Matrix(lv1, lv2) + (TRMatrix(lv1, lv3) * TQMatrix(lv3, lv2))
Next
Next
Next
'---- Update EigenVector here which is Q1*Q2*Q3 .... Qk
Dim Temp_Q(n, n) As Double
For lv1 = 0 To n Step +1
For lv2 = 0 To n Step +1
Temp_Q(lv1, lv2) = 0
For lv3 = 0 To n Step +1
Temp_Q(lv1, lv2) = Temp_Q(lv1, lv2) + (Possib_EigenVector(lv1, lv3) * TQMatrix(lv3, lv2))
Next
Next
Next
For lv1 = 0 To n Step +1
For lv2 = 0 To n Step +1
Possib_EigenVector(lv1, lv2) = Temp_Q(lv1, lv2)
Next
Next
'---- Exit if lower triangle of A_Matrix becomes Zero
If Check_IfLowerTriangleisZero(A_Matrix, n) = True Then
Exit Do
End If
Loop
'-------------- Fixing the EigenValues here
For lv1 = 0 To n
EigenValues(lv1) = A_Matrix(lv1, lv1)
Next
'------------ Fixing the EigenVectors here
For lv1 = 0 To n Step +1
For lv2 = 0 To n Step +1
Eigen_Vector(lv1, lv2) = 0
For lv3 = 0 To n Step +1
Eigen_Vector(lv1, lv2) = Eigen_Vector(lv1, lv2) + (TPPk_Matrix(lv1, lv3) * Possib_EigenVector(lv3, lv2))
Next
Next
Next
'********** Sorting EigenValues / EigenVectors
For lv1 = 0 To n - 1 Step +1
For lv2 = lv1 + 1 To n Step +1
'Sorting Ascending Minimum to Maximum
If EigenValues(lv1) > EigenValues(lv2) Then
SortSwap(EigenValues(lv1), EigenValues(lv2))
For lv3 = 0 To n Step +1
SortSwap(Eigen_Vector(lv3, lv1), Eigen_Vector(lv3, lv2))
Next
End If
Next
Next
End Sub
Private Sub SortSwap(ByRef a As Double, ByRef b As Double)
Dim temp As Double
temp = a
a = b
b = temp
End Sub
Private Function Check_IfLowerTriangleisZero(ByRef A_Matrix(,) As Double, ByVal n As Integer) As Boolean
Dim lv1, lv2 As Integer
Dim Chk_Bool As Boolean
Chk_Bool = True
For lv1 = 1 To n Step +1
For lv2 = 0 To (lv1 - 1) Step +1
If Math.Round(A_Matrix(lv1, lv2), 5) <> 0 Then
Chk_Bool = False
GoTo Ex1
End If
Next
Next
Ex1:
Return Chk_Bool
End Function
Private Sub HouseHolder_Transformation(ByRef A_Matrix(,) As Double, ByVal n As Integer, ByRef PPk_Matrix(,) As Double)
'___________________________________________________________________________________________
'---------------- HouseHolder Transformation developed by Samson Mano ----------------------
'-------------------- based on the following notes -----------------------------------------
'----------------- 1. https://en.wikipedia.org/wiki/Householder_transformation--------------
'___________________________________________________________________________________________
Dim k As Integer
'--- Fix Unit Matrix for P0 so that we can multiply p1p2..pk
For k = 0 To n Step +1
PPk_Matrix(k, k) = 1
Next
For k = 0 To n - 2 Step +1
'----- Find the alpha value alpha = -1*(sgn(a(k+1,k))*sqrt(a(j,k)^2) ->j from k+1 to n
Dim alpha As Double = 0
Dim lv1, lv2, lv3 As Integer
For lv1 = k + 1 To n Step +1
alpha = alpha + (A_Matrix(lv1, k) ^ 2)
Next
alpha = (-1) * (Math.Sign(A_Matrix(k + 1, k))) * Math.Sqrt(alpha)
'----- Find the r value r_value = math.sqrt((1/2)*(alpha^2 - (A_matrix(k+1,k)*alpha))
Dim r_value As Double
r_value = Math.Sqrt((1 / 2) * ((alpha ^ 2) - (A_Matrix(k + 1, k) * alpha)))
'----- Find the v matrix v(0)=v(1)=v(2)=...=v(k)=0 and v(k+1)=(a(k+1,k)-alpha)/(2*r) and v(j)=a(j,k)/(2*r) -> j = k+2,k+3,...,n
Dim v_matrix(n) As Double
For lv1 = 0 To k Step +1
v_matrix(lv1) = 0
Next
v_matrix(k + 1) = (A_Matrix(k + 1, k) - alpha) / (2 * r_value)
For lv1 = k + 2 To n Step +1
v_matrix(lv1) = A_Matrix(lv1, k) / (2 * r_value)
Next
'----- Find the vvT matrix and P_Matrix
Dim vvT(n, n) As Double
Dim I_Matix(n, n) As Double
'Multiply v matrix with vT matrix
For lv1 = 0 To n Step +1
For lv2 = 0 To n Step +1
vvT(lv1, lv2) = 0
I_Matix(lv1, lv2) = 0
vvT(lv1, lv2) = v_matrix(lv1) * v_matrix(lv2)
Next
I_Matix(lv1, lv1) = 1 '--- All the diagonals are 1
Next
'Multiply vvT matrix with 2
For lv1 = 0 To n Step +1
For lv2 = 0 To n Step +1
vvT(lv1, lv2) = 2 * vvT(lv1, lv2)
Next
Next
'Forming P_Matrix here
Dim P_Matrix(n, n) As Double
For lv1 = 0 To n Step +1
For lv2 = 0 To n Step +1
P_Matrix(lv1, lv2) = I_Matix(lv1, lv2) - vvT(lv1, lv2)
Next
Next
'----- Store P_matrix as mutiples to use in transformation PPk = p1p2p3...pk
Dim Temp_P(n, n) As Double
For lv1 = 0 To n Step +1
For lv2 = 0 To n Step +1
Temp_P(lv1, lv2) = 0
For lv3 = 0 To n Step +1
Temp_P(lv1, lv2) = Temp_P(lv1, lv2) + (PPk_Matrix(lv1, lv3) * P_Matrix(lv3, lv2))
Next
Next
Next
For lv1 = 0 To n Step +1
For lv2 = 0 To n Step +1
PPk_Matrix(lv1, lv2) = Temp_P(lv1, lv2)
Next
Next
'----- Find P_Matrix*A_Matrix*P_Matrix which is the A_Matrix HouseHolder Transformation
Dim AP_Matrix(n, n) As Double
'Multiply A_Matrix with P_Matrix to find intermittent AP_Matrix
For lv1 = 0 To n Step +1
For lv2 = 0 To n Step +1
AP_Matrix(lv1, lv2) = 0
For lv3 = 0 To n Step +1
AP_Matrix(lv1, lv2) = AP_Matrix(lv1, lv2) + (A_Matrix(lv1, lv3) * P_Matrix(lv3, lv2))
Next
Next
Next
'Multiply P_Matrix with AP_Matrix
For lv1 = 0 To n Step +1
For lv2 = 0 To n Step +1
A_Matrix(lv1, lv2) = 0
For lv3 = 0 To n Step +1
A_Matrix(lv1, lv2) = A_Matrix(lv1, lv2) + (P_Matrix(lv1, lv3) * AP_Matrix(lv3, lv2))
Next
Next
Next
Next
End Sub
Private Sub QRDecomposition(ByRef A_Matrix(,) As Double, ByRef n As Integer, ByRef Q_Matrix(,) As Double, ByRef R_Matrix(,) As Double)
'___________________________________________________________________________________________
'---------------- QR Algorithgm developed by Samson Mano -----------------------------------
'-------------------- based on the following notes -----------------------------------------
'----------------- 1. http://ranger.uta.edu/~weems/NOTES4351/hansen.pdf---------------------
'----------------- 2. http://web.engr.illinois.edu/~heath/scicomp/notes/chap03.pdf----------
'----------------- 3. http://www.math.usm.edu/lambers/mat610/sum10/lecture9.pdf-------------
'___________________________________________________________________________________________
'--------------------Initialization A- Matrix
Dim A(n, n) As Double
Dim R(n - 1)(,) As Double
Dim i, j, k As Integer
For i = 0 To n
For j = 0 To n
A(i, j) = A_Matrix(i, j)
Next
Next
'___________________________________________________________________________
For k = 0 To (n - 1) Step 1
Dim A_Norm As Double = 0
For i = k To n
A_Norm = A_Norm + (A(i, k) ^ 2) '---- Finding the length of column vector
Next
A_Norm = Math.Sqrt(A_Norm)
Dim Alpha_A As Double = If(A_Norm < 0, A_Norm, -A_Norm)
'----- Forming V - Matrix v = a - alpha * (e)
Dim V(n) As Double
For i = k To n Step 1
V(i) = A(i, k)
Next
V(k) = V(k) - Alpha_A
'-------------------------
'--- H = I - (2/V^T*V)* V *V^T
V_VT_Mul(V, k, n, R)
For i = k To n Step 1
Dim V_Ratio As Double
Dim A_Col(n) As Double
For j = k To n Step 1
A_Col(j) = A(j, i) '---- Transformation for every column
Next
V_Ratio = VT_A_Mul(V, A_Col, k, n) * VT_V_Mul(V, k, n)
For j = k To n Step 1
A(j, i) = A_Col(j) - (V_Ratio * V(j)) '---- Transformation for every column
Next
Next
Next
'------------- Multiplying all the H - Matrix to form Q_Matrix
Dim Q(0)(,) As Double
ReDim Q(0)(n, n)
For i = 0 To n
Q(0)(i, i) = 1 '----- Creating I - matrix
Next
For k = 0 To (n - 1) Step 1
H_Multiplication(Q, R, k, n, Q)
Next
'_______________________________________________________________
'Transferring the result
For i = 0 To n
For j = 0 To n
R_Matrix(i, j) = A(i, j)
Next
Next
For i = 0 To n
For j = 0 To n
Q_Matrix(i, j) = Q(0)(i, j)
Next
Next
End Sub
Private Sub H_Multiplication(ByRef A()(,) As Double, _
ByRef B()(,) As Double, _
ByRef k As Integer, _
ByRef n As Integer, _
ByRef C()(,) As Double)
'------- Ordinary Matrix multiplication
Dim T(n, n) As Double
For i = 0 To n
For j = 0 To n
T(i, j) = 0
For d = 0 To n
T(i, j) = T(i, j) + (A(0)(i, d) * B(k)(d, j))
Next
Next
Next
ReDim C(0)(n, n)
For i = 0 To n
For j = 0 To n
C(0)(i, j) = T(i, j)
Next
Next
End Sub
Private Sub V_VT_Mul(ByRef V() As Double, ByRef k As Integer, ByRef n As Integer, ByRef H()(,) As Double)
ReDim H(k)(n, n)
Dim c As Double = VT_V_Mul(V, k, n)
'------- Initilaizing
For i = 0 To n
For j = 0 To n
If i = j Then
H(k)(i, j) = 1
Else
H(k)(i, j) = 0
End If
Next
Next
'---- Doing the operation H = I - (2/vT*V)*(V*VT)
For i = k To n
For j = k To n
If i = j Then
H(k)(i, j) = 1 - (c * V(i) * V(j))
Else
H(k)(i, j) = 0 - (c * V(i) * V(j))
End If
Next
Next
End Sub
Private Function VT_A_Mul(ByRef V() As Double, ByRef A() As Double, ByRef k As Integer, ByRef n As Integer)
'-------- Function calculates ratio of |V^T*A/V^T*V|
Dim VtV As Double = 0 ' Holds the value of V^T*V
Dim VtA As Double = 0 ' Holds the value of V^T*A
For i = k To n
VtA = VtA + (V(i) * A(i))
Next
Return (VtA)
End Function
Private Function VT_V_Mul(ByRef V() As Double, ByRef k As Integer, ByRef n As Integer)
'-------- Function calculates ratio of |V^T*A/V^T*V|
Dim VtV As Double = 0 ' Holds the value of V^T*V
Dim VtA As Double = 0 ' Holds the value of V^T*A
For i = k To n
VtV = VtV + (V(i) ^ 2)
Next
Return (2 / VtV)
End Function
'___________________________________________________________________________________________________________________________________________________________________________________________
'___________________________________________________________________________________________________________________________________________________________________________________________
#End Region