29 #include <tests/myratest.h> 38 myra::out() << typestring<Precision>() << std::endl;
42 for (
int n = 0; n < N; ++n)
44 for (
int n = 0; n < N-1; ++n)
45 T(n+1,n) = T(n,n+1) = T1(n);
47 auto XD = stev(T0,T1);
48 const auto& X = XD.first;
49 const auto& D = XD.second;
52 Precision R_error = frobenius(T-X*D*transpose(X))/frobenius(D);
53 myra::out() <<
" |T-X*D*X'| = " << R_error << std::endl;
55 Precision X_error = frobenius(gemm(X,
'T',X)-I);
56 myra::out() <<
" |X'X-I| = " << X_error << std::endl;
61 Precision Xk_error = frobenius(gemm(Xk,
'T',Xk)-Ik)/N;
62 myra::out() <<
" |Xk'Xk-Ik| = " << Xk_error << std::endl;
65 for (
int n = 0; n < N-1; ++n)
66 sorted &= D(n) <= D(n+1);
67 myra::out() << std::boolalpha;
68 myra::out() <<
" sorted D(n) <= D(n+1) = " << sorted << std::endl;
70 REQUIRE(R_error < tolerance);
71 REQUIRE(X_error < tolerance);
72 REQUIRE(Xk_error < tolerance);
77 template<
class Precision>
void test_random(
int N, Precision tolerance)
81 test_detail(T0,T1,tolerance);
85 template<
class Precision>
void test_split(
int N,
int S, Precision tolerance)
90 test_detail(T0,T1,tolerance);
96 ADD_TEST(
"sstev",
"[dense][lapack]")
97 { test_random<float>(50,1.0e-4f); }
100 ADD_TEST(
"sstev_split",
"[dense][lapack]")
101 { test_split<float>(100,27,1.0e-4f); }
104 ADD_TEST(
"sstev_stress",
"[dense][lapack][.]")
108 for (
int n = 1; n < N; ++n)
109 for (
int t = 0; t < T; ++t)
110 test_random<float>(n,1.0e-4f);
114 ADD_TEST(
"dstev",
"[dense][lapack]")
115 { test_random<double>(50,1.0e-12); }
118 ADD_TEST(
"dstev_split",
"[dense][lapack]")
119 { test_split<double>(100,27,1.0e-12); }
122 ADD_TEST(
"dstev_stress",
"[dense][lapack][.]")
126 for (
int n = 1; n < N; ++n)
127 for (
int t = 0; t < T; ++t)
128 test_random<double>(n,1.0e-12);
Interface class for representing subranges of DiagonalMatrix's.
Interface class for representing subranges of dense Matrix's.
MatrixRange< Number > left(int j) const
Returns the j leftmost columns, this(:,0:j)
Definition: MatrixRange.cpp:223
Interface class for representing subranges of dense Vector's.
Routines for computing Frobenius norms of various algebraic containers.
Routines for multiplying by a DiagonalMatrix.
static Vector< Number > random(int N)
Generates a random Vector of specified size.
Definition: Vector.cpp:276
Overloads expr() for Matrix<Number>, LowerMatrix<Number>, Vector<Number> and DiagonalMatrix<Number> ...
Returns a transposed copy of a Matrix. The inplace version only works on a square operand...
Various utility functions/classes related to scalar Number types.
static Matrix< Number > identity(int IJ)
Generates an identity Matrix of specified size.
Definition: Matrix.cpp:349
General purpose dense matrix container, O(i*j) storage.
int size() const
Size inspector.
Definition: Vector.cpp:118
Tabulates a vector of length N, allows random access.
Definition: conjugate.h:21
Container for either a column vector or row vector (depends upon the usage context) ...
Computes all eigenpairs of real symmetric tridiagonal matrix.
Container for a diagonal matrix, O(n) storage. Used by SVD, row/column scaling, etc.
Variety of routines all for dense Matrix*Matrix multiplies. Delegates to the BLAS.