1 // This file is part of Eigen, a lightweight C++ template library
4 // Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
12 #define VERIFY_TRSM(TRI,XB) { \
13 (XB).setRandom(); ref = (XB); \
14 (TRI).solveInPlace(XB); \
15 VERIFY_IS_APPROX((TRI).toDenseMatrix() * (XB), ref); \
16 (XB).setRandom(); ref = (XB); \
17 (XB) = (TRI).solve(XB); \
18 VERIFY_IS_APPROX((TRI).toDenseMatrix() * (XB), ref); \
21 #define VERIFY_TRSM_ONTHERIGHT(TRI,XB) { \
22 (XB).setRandom(); ref = (XB); \
23 (TRI).transpose().template solveInPlace<OnTheRight>(XB.transpose()); \
24 VERIFY_IS_APPROX((XB).transpose() * (TRI).transpose().toDenseMatrix(), ref.transpose()); \
25 (XB).setRandom(); ref = (XB); \
26 (XB).transpose() = (TRI).transpose().template solve<OnTheRight>(XB.transpose()); \
27 VERIFY_IS_APPROX((XB).transpose() * (TRI).transpose().toDenseMatrix(), ref.transpose()); \
30 template<typename Scalar
,int Size
, int Cols
> void trsolve(int size
=Size
,int cols
=Cols
)
32 typedef typename NumTraits
<Scalar
>::Real RealScalar
;
34 Matrix
<Scalar
,Size
,Size
,ColMajor
> cmLhs(size
,size
);
35 Matrix
<Scalar
,Size
,Size
,RowMajor
> rmLhs(size
,size
);
37 enum { colmajor
= Size
==1 ? RowMajor
: ColMajor
,
38 rowmajor
= Cols
==1 ? ColMajor
: RowMajor
};
39 Matrix
<Scalar
,Size
,Cols
,colmajor
> cmRhs(size
,cols
);
40 Matrix
<Scalar
,Size
,Cols
,rowmajor
> rmRhs(size
,cols
);
41 Matrix
<Scalar
,Dynamic
,Dynamic
,colmajor
> ref(size
,cols
);
43 cmLhs
.setRandom(); cmLhs
*= static_cast<RealScalar
>(0.1); cmLhs
.diagonal().array() += static_cast<RealScalar
>(1);
44 rmLhs
.setRandom(); rmLhs
*= static_cast<RealScalar
>(0.1); rmLhs
.diagonal().array() += static_cast<RealScalar
>(1);
46 VERIFY_TRSM(cmLhs
.conjugate().template triangularView
<Lower
>(), cmRhs
);
47 VERIFY_TRSM(cmLhs
.adjoint() .template triangularView
<Lower
>(), cmRhs
);
48 VERIFY_TRSM(cmLhs
.template triangularView
<Upper
>(), cmRhs
);
49 VERIFY_TRSM(cmLhs
.template triangularView
<Lower
>(), rmRhs
);
50 VERIFY_TRSM(cmLhs
.conjugate().template triangularView
<Upper
>(), rmRhs
);
51 VERIFY_TRSM(cmLhs
.adjoint() .template triangularView
<Upper
>(), rmRhs
);
53 VERIFY_TRSM(cmLhs
.conjugate().template triangularView
<UnitLower
>(), cmRhs
);
54 VERIFY_TRSM(cmLhs
.template triangularView
<UnitUpper
>(), rmRhs
);
56 VERIFY_TRSM(rmLhs
.template triangularView
<Lower
>(), cmRhs
);
57 VERIFY_TRSM(rmLhs
.conjugate().template triangularView
<UnitUpper
>(), rmRhs
);
60 VERIFY_TRSM_ONTHERIGHT(cmLhs
.conjugate().template triangularView
<Lower
>(), cmRhs
);
61 VERIFY_TRSM_ONTHERIGHT(cmLhs
.template triangularView
<Upper
>(), cmRhs
);
62 VERIFY_TRSM_ONTHERIGHT(cmLhs
.template triangularView
<Lower
>(), rmRhs
);
63 VERIFY_TRSM_ONTHERIGHT(cmLhs
.conjugate().template triangularView
<Upper
>(), rmRhs
);
65 VERIFY_TRSM_ONTHERIGHT(cmLhs
.conjugate().template triangularView
<UnitLower
>(), cmRhs
);
66 VERIFY_TRSM_ONTHERIGHT(cmLhs
.template triangularView
<UnitUpper
>(), rmRhs
);
68 VERIFY_TRSM_ONTHERIGHT(rmLhs
.template triangularView
<Lower
>(), cmRhs
);
69 VERIFY_TRSM_ONTHERIGHT(rmLhs
.conjugate().template triangularView
<UnitUpper
>(), rmRhs
);
71 int c
= internal::random
<int>(0,cols
-1);
72 VERIFY_TRSM(rmLhs
.template triangularView
<Lower
>(), rmRhs
.col(c
));
73 VERIFY_TRSM(cmLhs
.template triangularView
<Lower
>(), rmRhs
.col(c
));
76 void test_product_trsolve()
78 for(int i
= 0; i
< g_repeat
; i
++)
81 CALL_SUBTEST_1((trsolve
<float,Dynamic
,Dynamic
>(internal::random
<int>(1,EIGEN_TEST_MAX_SIZE
),internal::random
<int>(1,EIGEN_TEST_MAX_SIZE
))));
82 CALL_SUBTEST_2((trsolve
<double,Dynamic
,Dynamic
>(internal::random
<int>(1,EIGEN_TEST_MAX_SIZE
),internal::random
<int>(1,EIGEN_TEST_MAX_SIZE
))));
83 CALL_SUBTEST_3((trsolve
<std::complex<float>,Dynamic
,Dynamic
>(internal::random
<int>(1,EIGEN_TEST_MAX_SIZE
/2),internal::random
<int>(1,EIGEN_TEST_MAX_SIZE
/2))));
84 CALL_SUBTEST_4((trsolve
<std::complex<double>,Dynamic
,Dynamic
>(internal::random
<int>(1,EIGEN_TEST_MAX_SIZE
/2),internal::random
<int>(1,EIGEN_TEST_MAX_SIZE
/2))));
87 CALL_SUBTEST_5((trsolve
<float,Dynamic
,1>(internal::random
<int>(1,EIGEN_TEST_MAX_SIZE
))));
88 CALL_SUBTEST_6((trsolve
<double,Dynamic
,1>(internal::random
<int>(1,EIGEN_TEST_MAX_SIZE
))));
89 CALL_SUBTEST_7((trsolve
<std::complex<float>,Dynamic
,1>(internal::random
<int>(1,EIGEN_TEST_MAX_SIZE
))));
90 CALL_SUBTEST_8((trsolve
<std::complex<double>,Dynamic
,1>(internal::random
<int>(1,EIGEN_TEST_MAX_SIZE
))));
93 CALL_SUBTEST_9((trsolve
<float,4,1>()));
94 CALL_SUBTEST_10((trsolve
<double,4,1>()));
95 CALL_SUBTEST_11((trsolve
<std::complex<float>,4,1>()));
96 CALL_SUBTEST_12((trsolve
<float,1,1>()));
97 CALL_SUBTEST_13((trsolve
<float,1,2>()));
98 CALL_SUBTEST_14((trsolve
<float,3,1>()));