public void SymmetricRandomMatrixEigenvectors() { for (int d = 1; d <= 100; d = d + 11) { Console.WriteLine("d={0}", d); SymmetricMatrix M = CreateSymmetricRandomMatrix(d, 1); double tr = M.Trace(); RealEigensystem E = M.Eigensystem(); Assert.IsTrue(E.Dimension == M.Dimension); SquareMatrix D = new SquareMatrix(E.Dimension); double[] es = new double[E.Dimension]; for (int i = 0; i < E.Dimension; i++) { double e = E.Eigenvalue(i); ColumnVector v = E.Eigenvector(i); Assert.IsTrue(TestUtilities.IsNearlyEigenpair(M, v, e)); D[i, i] = e; es[i] = e; } Assert.IsTrue(TestUtilities.IsSumNearlyEqual(es, tr)); Assert.IsTrue(TestUtilities.IsNearlyEqual( D, E.TransformMatrix.Transpose() * M * E.TransformMatrix )); } }
public static void EigenvaluesAndEigenvectors() { SymmetricMatrix H = new SymmetricMatrix(3); for (int r = 0; r < H.Dimension; r++) { for (int c = 0; c <= r; c++) { H[r, c] = 1.0 / (r + c + 1); } } RealEigendecomposition ed = H.Eigendecomposition(); SquareMatrix V = ed.TransformMatrix; PrintMatrix("V^T V", V.Transpose * V); PrintMatrix("V D V^T", V * ed.DiagonalizedMatrix * V.Transpose); foreach (RealEigenpair pair in ed.Eigenpairs) { Console.WriteLine($"Eigenvalue {pair.Eigenvalue}"); PrintMatrix("Hv", H * pair.Eigenvector); PrintMatrix("ev", pair.Eigenvalue * pair.Eigenvector); } ed.Eigenpairs.Sort(OrderBy.MagnitudeDescending); Console.WriteLine($"Largest eigenvalue {ed.Eigenpairs[0].Eigenvalue}"); ed.Eigenpairs.Sort(OrderBy.ValueAscending); Console.WriteLine($"Least eigenvalue {ed.Eigenpairs[0].Eigenvalue}"); double[] eigenvalues = H.Eigenvalues(); double sum = 0.0; double product = 1.0; foreach (double eigenvalue in eigenvalues) { sum += eigenvalue; product *= eigenvalue; } Console.WriteLine($"sum(e) = {sum}, tr(H) = {H.Trace()}"); Console.WriteLine($"prod(e) = {product}, det(H) = {H.CholeskyDecomposition().Determinant()}"); SquareMatrix G1 = new SquareMatrix(4); G1[0, 3] = 1.0; G1[1, 2] = 1.0; G1[2, 1] = -1.0; G1[3, 0] = -1.0; ComplexEigendecomposition ced = G1.Eigendecomposition(); foreach (ComplexEigenpair pair in ced.Eigenpairs) { Console.WriteLine(pair.Eigenvalue); } }
public void SymmetricHilbertMatrixEigenvalues() { for (int d = 1; d <= 8; d++) { SymmetricMatrix H = TestUtilities.CreateSymmetricHilbertMatrix(d); double tr = H.Trace(); double[] es = H.Eigenvalues(); Assert.IsTrue(TestUtilities.IsSumNearlyEqual(es, tr)); } }
public void SymmetricRandomMatrixEigenvectors() { for (int d = 1; d <= 100; d = d + 11) { SymmetricMatrix M = CreateSymmetricRandomMatrix(d, 1); RealEigendecomposition E = M.Eigendecomposition(); Assert.IsTrue(E.Dimension == M.Dimension); double[] eigenvalues = new double[E.Dimension]; for (int i = 0; i < E.Dimension; i++) { double e = E.Eigenpairs[i].Eigenvalue; ColumnVector v = E.Eigenpairs[i].Eigenvector; // The eigenvector works Assert.IsTrue(TestUtilities.IsNearlyEigenpair(M, v, e)); // The eigenvalue is the corresponding diagonal value of D Assert.IsTrue(E.DiagonalizedMatrix[i, i] == e); // Remember eigenvalue to take sum in future eigenvalues[i] = e; } // The eigenvectors sum to trace double tr = M.Trace(); Assert.IsTrue(TestUtilities.IsSumNearlyEqual(eigenvalues, tr)); // The decomposition works Assert.IsTrue(TestUtilities.IsNearlyEqual( E.DiagonalizedMatrix, E.TransformMatrix.Transpose * M * E.TransformMatrix )); // Transform matrix is orthogonal Assert.IsTrue(TestUtilities.IsNearlyEqual( E.TransformMatrix.Transpose * E.TransformMatrix, UnitMatrix.OfDimension(d) )); } }