public void EigenvectorTest() { double[,] Arr1 = new double[4, 4] { { 4, 1, -2, 2 }, { 1, 2, 0, 1 }, { -2, 0, 3, -2 }, { 2, 1, -2, -1 } }; double[,] Arr2 = new double[2, 3] { { 3,1,1 }, { -1, 3,1 }}; double[,] Arr3 = new double[5, 5] { { 2, 0, 8, 6, 0 }, { 1, 6, 0, 1, 7 }, { 5, 0, 7, 4, 0 }, { 7, 0, 8, 5, 0 }, { 0, 10, 0, 0, 7 } }; double[,] Arr4 = new double[4, 4] { { 3, 1, 0, 1 }, { 1, 3, 1, 1 }, { 0, 1, 3, 1 }, { 1, 1, 1, 3 } }; MMatrix A = new MMatrix(Arr2); MMatrix B = new MMatrix(); string s = ""; Vector v = new Vector(); MMatrix Eigenvectors = new MMatrix(); try { //A = MMatrix.RandomMatrix(3,0,255); B = A*A.Transpose(); s += "\nAA*=\n" + B.PrintToString(); B.Jacobi_Cyclic_Method(ref v, ref Eigenvectors); s += "\nBefore sort:"; s += "\nEigenvalues of(A*At)=" + v.PrintToString(); s += "\nEigenvectors of A*At:\n" + Eigenvectors.PrintToString(); MMatrix.SortEigen(ref v, ref Eigenvectors); s += "\nAfter sort:"; s += "\nEigenvalues of(A*At)=" + v.PrintToString(); s += "\nEigenvectors of A*At:\n" + Eigenvectors.PrintToString(); //This is not neccesary anymore since the eigenvectors are already orthonomalized s += "\nOrthonormalize eigenvectors(Ax = 0)\n" + MMatrix.Orthonormalize(Eigenvectors).PrintToString(); this.RichText_Display(s); } catch (MMatrixException exp) { MessageBox.Show("INFO: " + exp.Message, sProjectTile, MessageBoxButtons.OK, MessageBoxIcon.Warning); } }
//A = U*S*Vt //This method is not right public static void FactorSVD(MMatrix A) { MMatrix B = new MMatrix(); Vector Eigenvalues = new Vector(); MMatrix Eigenvectors = new MMatrix(); int index; //U B = A * A.Transpose(); B.Jacobi_Cyclic_Method(ref Eigenvalues,ref Eigenvectors); SortEigen(ref Eigenvalues,ref Eigenvectors); A.SVD_U = Eigenvectors.MArray; //S A.SVD_S = new double[A.row, A.col]; index = (A.row < A.col) ? (A.row) : (A.col); for (int i = 0; i < index; ++i) A.SVD_S[i, i] = Math.Sqrt(Eigenvalues[i]); //V B = B.Transpose(); B.Jacobi_Cyclic_Method(ref Eigenvalues,ref Eigenvectors); SortEigen(ref Eigenvalues,ref Eigenvectors); A.SVD_Vt = Eigenvectors.Transpose().MArray; }