Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "main.h"
00026
00027 template<typename MatrixType> void trmv(const MatrixType& m)
00028 {
00029 typedef typename MatrixType::Index Index;
00030 typedef typename MatrixType::Scalar Scalar;
00031 typedef typename NumTraits<Scalar>::Real RealScalar;
00032 typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;
00033
00034 RealScalar largerEps = 10*test_precision<RealScalar>();
00035
00036 Index rows = m.rows();
00037 Index cols = m.cols();
00038
00039 MatrixType m1 = MatrixType::Random(rows, cols),
00040 m3(rows, cols);
00041 VectorType v1 = VectorType::Random(rows);
00042
00043 Scalar s1 = internal::random<Scalar>();
00044
00045 m1 = MatrixType::Random(rows, cols);
00046
00047
00048 m3 = m1.template triangularView<Eigen::Lower>();
00049 VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::Lower>() * v1, largerEps));
00050 m3 = m1.template triangularView<Eigen::Upper>();
00051 VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::Upper>() * v1, largerEps));
00052 m3 = m1.template triangularView<Eigen::UnitLower>();
00053 VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::UnitLower>() * v1, largerEps));
00054 m3 = m1.template triangularView<Eigen::UnitUpper>();
00055 VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::UnitUpper>() * v1, largerEps));
00056
00057
00058 m3 = m1.template triangularView<Eigen::Lower>();
00059 VERIFY(((s1*m3).conjugate() * v1).isApprox((s1*m1).conjugate().template triangularView<Eigen::Lower>() * v1, largerEps));
00060 m3 = m1.template triangularView<Eigen::Upper>();
00061 VERIFY((m3.conjugate() * v1.conjugate()).isApprox(m1.conjugate().template triangularView<Eigen::Upper>() * v1.conjugate(), largerEps));
00062
00063
00064 m3 = m1.template triangularView<Eigen::Upper>();
00065 VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::Lower>() * v1, largerEps));
00066 m3 = m1.template triangularView<Eigen::Lower>();
00067 VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::Upper>() * v1, largerEps));
00068 m3 = m1.template triangularView<Eigen::UnitUpper>();
00069 VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::UnitLower>() * v1, largerEps));
00070 m3 = m1.template triangularView<Eigen::UnitLower>();
00071 VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::UnitUpper>() * v1, largerEps));
00072
00073
00074 m3 = m1.template triangularView<Eigen::Upper>();
00075 VERIFY((m3.adjoint() * v1).isApprox(m1.adjoint().template triangularView<Eigen::Lower>() * v1, largerEps));
00076 m3 = m1.template triangularView<Eigen::Lower>();
00077 VERIFY((m3.adjoint() * (s1*v1.conjugate())).isApprox(m1.adjoint().template triangularView<Eigen::Upper>() * (s1*v1.conjugate()), largerEps));
00078 m3 = m1.template triangularView<Eigen::UnitUpper>();
00079
00080
00081 m3 = m1.template triangularView<Eigen::Lower>();
00082 VERIFY((v1.transpose() * m3).isApprox(v1.transpose() * m1.template triangularView<Eigen::Lower>(), largerEps));
00083 VERIFY((v1.adjoint() * m3).isApprox(v1.adjoint() * m1.template triangularView<Eigen::Lower>(), largerEps));
00084 VERIFY((v1.adjoint() * m3.adjoint()).isApprox(v1.adjoint() * m1.template triangularView<Eigen::Lower>().adjoint(), largerEps));
00085
00086
00087 }
00088
00089 void test_product_trmv()
00090 {
00091 int s;
00092 for(int i = 0; i < g_repeat ; i++) {
00093 CALL_SUBTEST_1( trmv(Matrix<float, 1, 1>()) );
00094 CALL_SUBTEST_2( trmv(Matrix<float, 2, 2>()) );
00095 CALL_SUBTEST_3( trmv(Matrix3d()) );
00096 s = internal::random<int>(1,200);
00097 CALL_SUBTEST_4( trmv(MatrixXcf(s,s)) );
00098 s = internal::random<int>(1,200);
00099 CALL_SUBTEST_5( trmv(MatrixXcd(s,s)) );
00100 s = internal::random<int>(1,320);
00101 CALL_SUBTEST_6( trmv(Matrix<float,Dynamic,Dynamic,RowMajor>(s, s)) );
00102 }
00103 }