public void testSVD() { //BOOST_MESSAGE("Testing singular value decomposition..."); setup(); double tol = 1.0e-12; Matrix[] testMatrices = { M1, M2, M3, M4 }; for (int j = 0; j < testMatrices.Length; j++) { // m >= n required (rows >= columns) Matrix A = testMatrices[j]; SVD svd = new SVD(A); // U is m x n Matrix U = svd.U(); // s is n long Vector s = svd.singularValues(); // S is n x n Matrix S = svd.S(); // V is n x n Matrix V = svd.V(); for (int i=0; i < S.rows(); i++) { if (S[i,i] != s[i]) Assert.Fail("S not consistent with s"); } // tests Matrix U_Utranspose = Matrix.transpose(U)*U; if (norm(U_Utranspose-I) > tol) Assert.Fail("U not orthogonal (norm of U^T*U-I = " + norm(U_Utranspose-I) + ")"); Matrix V_Vtranspose = Matrix.transpose(V) * V; if (norm(V_Vtranspose-I) > tol) Assert.Fail("V not orthogonal (norm of V^T*V-I = " + norm(V_Vtranspose-I) + ")"); Matrix A_reconstructed = U * S * Matrix.transpose(V); if (norm(A_reconstructed-A) > tol) Assert.Fail("Product does not recover A: (norm of U*S*V^T-A = " + norm(A_reconstructed-A) + ")"); } }