public void HilbertMatrixSVD() { int n = 4; SquareMatrix H = TestUtilities.CreateSymmetricHilbertMatrix(n).ToSquareMatrix(); SingularValueDecomposition SVD = H.SingularValueDecomposition(); Assert.IsTrue(SVD.RowCount == n); Assert.IsTrue(SVD.ColumnCount == n); Assert.IsTrue(SVD.ConditionNumber > 1.0); // Reconstruct matrix SquareMatrix H2 = new SquareMatrix(n); foreach (SingularValueContributor contributor in SVD.Contributors) { H2 += contributor.SingularValue * ((SquareMatrix)(contributor.LeftSingularVector * contributor.RightSingularVector.Transpose)); } // Use SVD to solve ColumnVector b = new ColumnVector(n); for (int i = 0; i < b.Dimension; i++) { b[i] = i; } ColumnVector x = SVD.Solve(b); Assert.IsTrue(TestUtilities.IsNearlyEqual(H * x, b)); }
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 SymmetricHilbertMatrixInverse() { for (int d = 1; d < 4; d++) { SymmetricMatrix H = TestUtilities.CreateSymmetricHilbertMatrix(d); SymmetricMatrix HI = H.Inverse(); Assert.IsTrue(TestUtilities.IsNearlyEqual(HI * H, UnitMatrix.OfDimension(d))); } // fails for d >= 4; look into this }
public void SymmetricHilbertMatrixInverse() { for (int d = 1; d <= 4; d++) { Console.WriteLine("d={0}", d); SquareMatrix I = TestUtilities.CreateSquareUnitMatrix(d); SymmetricMatrix H = TestUtilities.CreateSymmetricHilbertMatrix(d); SymmetricMatrix HI = H.Inverse(); Assert.IsTrue(TestUtilities.IsNearlyEqual(H * HI, I)); } // fails for d > 4! look into this }
public void SymmetricMatrixDecomposition() { for (int d = 1; d <= 4; d++) { SymmetricMatrix H = TestUtilities.CreateSymmetricHilbertMatrix(d); CholeskyDecomposition CD = H.CholeskyDecomposition(); Assert.IsTrue(CD != null, String.Format("d={0} not positive definite", d)); Assert.IsTrue(CD.Dimension == d); SymmetricMatrix HI = CD.Inverse(); SquareMatrix I = TestUtilities.CreateSquareUnitMatrix(d); Assert.IsTrue(TestUtilities.IsNearlyEqual(H * HI, I)); } }
public void HilbertMatrixCholeskyDecomposition() { for (int d = 1; d <= 4; d++) { SymmetricMatrix H = TestUtilities.CreateSymmetricHilbertMatrix(d); // Decomposition succeeds CholeskyDecomposition CD = H.CholeskyDecomposition(); Assert.IsTrue(CD != null); Assert.IsTrue(CD.Dimension == d); // Decomposition works SquareMatrix S = CD.SquareRootMatrix(); Assert.IsTrue(TestUtilities.IsNearlyEqual(S * S.Transpose, H)); // Inverse works SymmetricMatrix HI = CD.Inverse(); Assert.IsTrue(TestUtilities.IsNearlyEqual(H * HI, UnitMatrix.OfDimension(d))); } }