mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
remove the Triangular suffix to Upper, Lower, UnitLower, etc,
and remove the respective bit flags
This commit is contained in:
@@ -64,8 +64,8 @@ template<typename MatrixType> void bandmatrix(const MatrixType& _m)
|
||||
int a = std::max(0,cols-d-supers);
|
||||
int b = std::max(0,rows-d-subs);
|
||||
if(a>0) dm1.block(0,d+supers,rows,a).setZero();
|
||||
dm1.block(0,supers+1,cols-supers-1-a,cols-supers-1-a).template triangularView<UpperTriangular>().setZero();
|
||||
dm1.block(subs+1,0,rows-subs-1-b,rows-subs-1-b).template triangularView<LowerTriangular>().setZero();
|
||||
dm1.block(0,supers+1,cols-supers-1-a,cols-supers-1-a).template triangularView<Upper>().setZero();
|
||||
dm1.block(subs+1,0,rows-subs-1-b,rows-subs-1-b).template triangularView<Lower>().setZero();
|
||||
if(b>0) dm1.block(d+subs,0,b,cols).setZero();
|
||||
//std::cerr << m.m_data << "\n\n" << m.toDense() << "\n\n" << dm1 << "\n\n";
|
||||
VERIFY_IS_APPROX(dm1,m.toDenseMatrix());
|
||||
|
||||
@@ -58,12 +58,12 @@ template<typename MatrixType> void cholesky(const MatrixType& m)
|
||||
symm += a1 * a1.adjoint();
|
||||
}
|
||||
|
||||
SquareMatrixType symmUp = symm.template triangularView<UpperTriangular>();
|
||||
SquareMatrixType symmLo = symm.template triangularView<LowerTriangular>();
|
||||
SquareMatrixType symmUp = symm.template triangularView<Upper>();
|
||||
SquareMatrixType symmLo = symm.template triangularView<Lower>();
|
||||
|
||||
// to test if really Cholesky only uses the upper triangular part, uncomment the following
|
||||
// FIXME: currently that fails !!
|
||||
//symm.template part<StrictlyLowerTriangular>().setZero();
|
||||
//symm.template part<StrictlyLower>().setZero();
|
||||
|
||||
#ifdef HAS_GSL
|
||||
// if (ei_is_same_type<RealScalar,double>::ret)
|
||||
@@ -94,7 +94,7 @@ template<typename MatrixType> void cholesky(const MatrixType& m)
|
||||
#endif
|
||||
|
||||
{
|
||||
LLT<SquareMatrixType,LowerTriangular> chollo(symmLo);
|
||||
LLT<SquareMatrixType,Lower> chollo(symmLo);
|
||||
VERIFY_IS_APPROX(symm, chollo.matrixL().toDenseMatrix() * chollo.matrixL().adjoint().toDenseMatrix());
|
||||
vecX = chollo.solve(vecB);
|
||||
VERIFY_IS_APPROX(symm * vecX, vecB);
|
||||
@@ -102,7 +102,7 @@ template<typename MatrixType> void cholesky(const MatrixType& m)
|
||||
VERIFY_IS_APPROX(symm * matX, matB);
|
||||
|
||||
// test the upper mode
|
||||
LLT<SquareMatrixType,UpperTriangular> cholup(symmUp);
|
||||
LLT<SquareMatrixType,Upper> cholup(symmUp);
|
||||
VERIFY_IS_APPROX(symm, cholup.matrixL().toDenseMatrix() * cholup.matrixL().adjoint().toDenseMatrix());
|
||||
vecX = cholup.solve(vecB);
|
||||
VERIFY_IS_APPROX(symm * vecX, vecB);
|
||||
|
||||
@@ -85,31 +85,31 @@ template<typename MatrixType> void product_notemporary(const MatrixType& m)
|
||||
// NOTE this is because the Block expression is not handled yet by our expression analyser
|
||||
VERIFY_EVALUATION_COUNT(( m3.block(r0,r0,r1,r1).noalias() = s1 * m1.block(r0,c0,r1,c1) * (s1*m2).block(c0,r0,c1,r1) ), 1);
|
||||
|
||||
VERIFY_EVALUATION_COUNT( m3.noalias() -= (s1 * m1).template triangularView<LowerTriangular>() * m2, 0);
|
||||
VERIFY_EVALUATION_COUNT( rm3.noalias() = (s1 * m1.adjoint()).template triangularView<UpperTriangular>() * (m2+m2), 1);
|
||||
VERIFY_EVALUATION_COUNT( rm3.noalias() = (s1 * m1.adjoint()).template triangularView<UnitUpperTriangular>() * m2.adjoint(), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.noalias() -= (s1 * m1).template triangularView<Lower>() * m2, 0);
|
||||
VERIFY_EVALUATION_COUNT( rm3.noalias() = (s1 * m1.adjoint()).template triangularView<Upper>() * (m2+m2), 1);
|
||||
VERIFY_EVALUATION_COUNT( rm3.noalias() = (s1 * m1.adjoint()).template triangularView<UnitUpper>() * m2.adjoint(), 0);
|
||||
|
||||
VERIFY_EVALUATION_COUNT( rm3.col(c0).noalias() = (s1 * m1.adjoint()).template triangularView<UnitUpperTriangular>() * (s2*m2.row(c0)).adjoint(), 0);
|
||||
VERIFY_EVALUATION_COUNT( rm3.col(c0).noalias() = (s1 * m1.adjoint()).template triangularView<UnitUpper>() * (s2*m2.row(c0)).adjoint(), 0);
|
||||
|
||||
VERIFY_EVALUATION_COUNT( m1.template triangularView<LowerTriangular>().solveInPlace(m3), 0);
|
||||
VERIFY_EVALUATION_COUNT( m1.adjoint().template triangularView<LowerTriangular>().solveInPlace(m3.transpose()), 0);
|
||||
VERIFY_EVALUATION_COUNT( m1.template triangularView<Lower>().solveInPlace(m3), 0);
|
||||
VERIFY_EVALUATION_COUNT( m1.adjoint().template triangularView<Lower>().solveInPlace(m3.transpose()), 0);
|
||||
|
||||
VERIFY_EVALUATION_COUNT( m3.noalias() -= (s1 * m1).adjoint().template selfadjointView<LowerTriangular>() * (-m2*s3).adjoint(), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.noalias() = s2 * m2.adjoint() * (s1 * m1.adjoint()).template selfadjointView<UpperTriangular>(), 0);
|
||||
VERIFY_EVALUATION_COUNT( rm3.noalias() = (s1 * m1.adjoint()).template selfadjointView<LowerTriangular>() * m2.adjoint(), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.noalias() -= (s1 * m1).adjoint().template selfadjointView<Lower>() * (-m2*s3).adjoint(), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.noalias() = s2 * m2.adjoint() * (s1 * m1.adjoint()).template selfadjointView<Upper>(), 0);
|
||||
VERIFY_EVALUATION_COUNT( rm3.noalias() = (s1 * m1.adjoint()).template selfadjointView<Lower>() * m2.adjoint(), 0);
|
||||
|
||||
VERIFY_EVALUATION_COUNT( m3.col(c0).noalias() = (s1 * m1).adjoint().template selfadjointView<LowerTriangular>() * (-m2.row(c0)*s3).adjoint(), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.col(c0).noalias() -= (s1 * m1).adjoint().template selfadjointView<UpperTriangular>() * (-m2.row(c0)*s3).adjoint(), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.col(c0).noalias() = (s1 * m1).adjoint().template selfadjointView<Lower>() * (-m2.row(c0)*s3).adjoint(), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.col(c0).noalias() -= (s1 * m1).adjoint().template selfadjointView<Upper>() * (-m2.row(c0)*s3).adjoint(), 0);
|
||||
|
||||
VERIFY_EVALUATION_COUNT( m3.block(r0,c0,r1,c1).noalias() += m1.block(r0,r0,r1,r1).template selfadjointView<UpperTriangular>() * (s1*m2.block(r0,c0,r1,c1)), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.block(r0,c0,r1,c1).noalias() = m1.block(r0,r0,r1,r1).template selfadjointView<UpperTriangular>() * m2.block(r0,c0,r1,c1), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.block(r0,c0,r1,c1).noalias() += m1.block(r0,r0,r1,r1).template selfadjointView<Upper>() * (s1*m2.block(r0,c0,r1,c1)), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.block(r0,c0,r1,c1).noalias() = m1.block(r0,r0,r1,r1).template selfadjointView<Upper>() * m2.block(r0,c0,r1,c1), 0);
|
||||
|
||||
VERIFY_EVALUATION_COUNT( m3.template selfadjointView<LowerTriangular>().rankUpdate(m2.adjoint()), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.template selfadjointView<Lower>().rankUpdate(m2.adjoint()), 0);
|
||||
|
||||
m3.resize(1,1);
|
||||
VERIFY_EVALUATION_COUNT( m3.noalias() = m1.block(r0,r0,r1,r1).template selfadjointView<LowerTriangular>() * m2.block(r0,c0,r1,c1), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.noalias() = m1.block(r0,r0,r1,r1).template selfadjointView<Lower>() * m2.block(r0,c0,r1,c1), 0);
|
||||
m3.resize(1,1);
|
||||
VERIFY_EVALUATION_COUNT( m3.noalias() = m1.block(r0,r0,r1,r1).template triangularView<UnitUpperTriangular>() * m2.block(r0,c0,r1,c1), 0);
|
||||
VERIFY_EVALUATION_COUNT( m3.noalias() = m1.block(r0,r0,r1,r1).template triangularView<UnitUpper>() * m2.block(r0,c0,r1,c1), 0);
|
||||
}
|
||||
|
||||
void test_product_notemporary()
|
||||
|
||||
@@ -53,25 +53,25 @@ template<typename MatrixType> void product_selfadjoint(const MatrixType& m)
|
||||
m1 = (m1.adjoint() + m1).eval();
|
||||
|
||||
// rank2 update
|
||||
m2 = m1.template triangularView<LowerTriangular>();
|
||||
m2.template selfadjointView<LowerTriangular>().rankUpdate(v1,v2);
|
||||
VERIFY_IS_APPROX(m2, (m1 + v1 * v2.adjoint()+ v2 * v1.adjoint()).template triangularView<LowerTriangular>().toDenseMatrix());
|
||||
m2 = m1.template triangularView<Lower>();
|
||||
m2.template selfadjointView<Lower>().rankUpdate(v1,v2);
|
||||
VERIFY_IS_APPROX(m2, (m1 + v1 * v2.adjoint()+ v2 * v1.adjoint()).template triangularView<Lower>().toDenseMatrix());
|
||||
|
||||
m2 = m1.template triangularView<UpperTriangular>();
|
||||
m2.template selfadjointView<UpperTriangular>().rankUpdate(-v1,s2*v2,s3);
|
||||
VERIFY_IS_APPROX(m2, (m1 + (-s2*s3) * (v1 * v2.adjoint()+ v2 * v1.adjoint())).template triangularView<UpperTriangular>().toDenseMatrix());
|
||||
m2 = m1.template triangularView<Upper>();
|
||||
m2.template selfadjointView<Upper>().rankUpdate(-v1,s2*v2,s3);
|
||||
VERIFY_IS_APPROX(m2, (m1 + (-s2*s3) * (v1 * v2.adjoint()+ v2 * v1.adjoint())).template triangularView<Upper>().toDenseMatrix());
|
||||
|
||||
m2 = m1.template triangularView<UpperTriangular>();
|
||||
m2.template selfadjointView<UpperTriangular>().rankUpdate(-r1.adjoint(),r2.adjoint()*s3,s1);
|
||||
VERIFY_IS_APPROX(m2, (m1 + (-s3*s1) * (r1.adjoint() * r2 + r2.adjoint() * r1)).template triangularView<UpperTriangular>().toDenseMatrix());
|
||||
m2 = m1.template triangularView<Upper>();
|
||||
m2.template selfadjointView<Upper>().rankUpdate(-r1.adjoint(),r2.adjoint()*s3,s1);
|
||||
VERIFY_IS_APPROX(m2, (m1 + (-s3*s1) * (r1.adjoint() * r2 + r2.adjoint() * r1)).template triangularView<Upper>().toDenseMatrix());
|
||||
|
||||
if (rows>1)
|
||||
{
|
||||
m2 = m1.template triangularView<LowerTriangular>();
|
||||
m2.block(1,1,rows-1,cols-1).template selfadjointView<LowerTriangular>().rankUpdate(v1.tail(rows-1),v2.head(cols-1));
|
||||
m2 = m1.template triangularView<Lower>();
|
||||
m2.block(1,1,rows-1,cols-1).template selfadjointView<Lower>().rankUpdate(v1.tail(rows-1),v2.head(cols-1));
|
||||
m3 = m1;
|
||||
m3.block(1,1,rows-1,cols-1) += v1.tail(rows-1) * v2.head(cols-1).adjoint()+ v2.head(cols-1) * v1.tail(rows-1).adjoint();
|
||||
VERIFY_IS_APPROX(m2, m3.template triangularView<LowerTriangular>().toDenseMatrix());
|
||||
VERIFY_IS_APPROX(m2, m3.template triangularView<Lower>().toDenseMatrix());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,10 +28,10 @@ template<int OtherSize> struct symm_extra {
|
||||
template<typename M1, typename M2, typename Scalar>
|
||||
static void run(M1& m1, M1& m2, M2& rhs2, M2& rhs22, M2& rhs23, Scalar s1, Scalar s2)
|
||||
{
|
||||
m2 = m1.template triangularView<LowerTriangular>();
|
||||
VERIFY_IS_APPROX(rhs22 = (rhs2) * (m2).template selfadjointView<LowerTriangular>(),
|
||||
m2 = m1.template triangularView<Lower>();
|
||||
VERIFY_IS_APPROX(rhs22 = (rhs2) * (m2).template selfadjointView<Lower>(),
|
||||
rhs23 = (rhs2) * (m1));
|
||||
VERIFY_IS_APPROX(rhs22 = (s2*rhs2) * (s1*m2).template selfadjointView<LowerTriangular>(),
|
||||
VERIFY_IS_APPROX(rhs22 = (s2*rhs2) * (s1*m2).template selfadjointView<Lower>(),
|
||||
rhs23 = (s2*rhs2) * (s1*m1));
|
||||
}
|
||||
};
|
||||
@@ -65,38 +65,38 @@ template<typename Scalar, int Size, int OtherSize> void symm(int size = Size, in
|
||||
Scalar s1 = ei_random<Scalar>(),
|
||||
s2 = ei_random<Scalar>();
|
||||
|
||||
m2 = m1.template triangularView<LowerTriangular>();
|
||||
VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView<LowerTriangular>() * (s2*rhs1),
|
||||
m2 = m1.template triangularView<Lower>();
|
||||
VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView<Lower>() * (s2*rhs1),
|
||||
rhs13 = (s1*m1) * (s2*rhs1));
|
||||
|
||||
m2 = m1.template triangularView<UpperTriangular>(); rhs12.setRandom(); rhs13 = rhs12;
|
||||
VERIFY_IS_APPROX(rhs12 += (s1*m2).template selfadjointView<UpperTriangular>() * (s2*rhs1),
|
||||
m2 = m1.template triangularView<Upper>(); rhs12.setRandom(); rhs13 = rhs12;
|
||||
VERIFY_IS_APPROX(rhs12 += (s1*m2).template selfadjointView<Upper>() * (s2*rhs1),
|
||||
rhs13 += (s1*m1) * (s2*rhs1));
|
||||
|
||||
m2 = m1.template triangularView<LowerTriangular>();
|
||||
VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView<LowerTriangular>() * (s2*rhs2.adjoint()),
|
||||
m2 = m1.template triangularView<Lower>();
|
||||
VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView<Lower>() * (s2*rhs2.adjoint()),
|
||||
rhs13 = (s1*m1) * (s2*rhs2.adjoint()));
|
||||
|
||||
m2 = m1.template triangularView<UpperTriangular>();
|
||||
VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView<UpperTriangular>() * (s2*rhs2.adjoint()),
|
||||
m2 = m1.template triangularView<Upper>();
|
||||
VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView<Upper>() * (s2*rhs2.adjoint()),
|
||||
rhs13 = (s1*m1) * (s2*rhs2.adjoint()));
|
||||
|
||||
m2 = m1.template triangularView<UpperTriangular>();
|
||||
VERIFY_IS_APPROX(rhs12 = (s1*m2.adjoint()).template selfadjointView<LowerTriangular>() * (s2*rhs2.adjoint()),
|
||||
m2 = m1.template triangularView<Upper>();
|
||||
VERIFY_IS_APPROX(rhs12 = (s1*m2.adjoint()).template selfadjointView<Lower>() * (s2*rhs2.adjoint()),
|
||||
rhs13 = (s1*m1.adjoint()) * (s2*rhs2.adjoint()));
|
||||
|
||||
// test row major = <...>
|
||||
m2 = m1.template triangularView<LowerTriangular>(); rhs12.setRandom(); rhs13 = rhs12;
|
||||
VERIFY_IS_APPROX(rhs12 -= (s1*m2).template selfadjointView<LowerTriangular>() * (s2*rhs3),
|
||||
m2 = m1.template triangularView<Lower>(); rhs12.setRandom(); rhs13 = rhs12;
|
||||
VERIFY_IS_APPROX(rhs12 -= (s1*m2).template selfadjointView<Lower>() * (s2*rhs3),
|
||||
rhs13 -= (s1*m1) * (s2 * rhs3));
|
||||
|
||||
m2 = m1.template triangularView<UpperTriangular>();
|
||||
VERIFY_IS_APPROX(rhs12 = (s1*m2.adjoint()).template selfadjointView<LowerTriangular>() * (s2*rhs3).conjugate(),
|
||||
m2 = m1.template triangularView<Upper>();
|
||||
VERIFY_IS_APPROX(rhs12 = (s1*m2.adjoint()).template selfadjointView<Lower>() * (s2*rhs3).conjugate(),
|
||||
rhs13 = (s1*m1.adjoint()) * (s2*rhs3).conjugate());
|
||||
|
||||
|
||||
m2 = m1.template triangularView<UpperTriangular>(); rhs13 = rhs12;
|
||||
VERIFY_IS_APPROX(rhs12.noalias() += s1 * ((m2.adjoint()).template selfadjointView<LowerTriangular>() * (s2*rhs3).conjugate()),
|
||||
m2 = m1.template triangularView<Upper>(); rhs13 = rhs12;
|
||||
VERIFY_IS_APPROX(rhs12.noalias() += s1 * ((m2.adjoint()).template selfadjointView<Lower>() * (s2*rhs3).conjugate()),
|
||||
rhs13 += (s1*m1.adjoint()) * (s2*rhs3).conjugate());
|
||||
|
||||
// test matrix * selfadjoint
|
||||
|
||||
@@ -45,28 +45,28 @@ template<typename MatrixType> void syrk(const MatrixType& m)
|
||||
Scalar s1 = ei_random<Scalar>();
|
||||
|
||||
m2.setZero();
|
||||
VERIFY_IS_APPROX((m2.template selfadjointView<LowerTriangular>().rankUpdate(rhs2,s1)._expression()),
|
||||
((s1 * rhs2 * rhs2.adjoint()).eval().template triangularView<LowerTriangular>().toDenseMatrix()));
|
||||
VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(rhs2,s1)._expression()),
|
||||
((s1 * rhs2 * rhs2.adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));
|
||||
|
||||
m2.setZero();
|
||||
VERIFY_IS_APPROX(m2.template selfadjointView<UpperTriangular>().rankUpdate(rhs2,s1)._expression(),
|
||||
(s1 * rhs2 * rhs2.adjoint()).eval().template triangularView<UpperTriangular>().toDenseMatrix());
|
||||
VERIFY_IS_APPROX(m2.template selfadjointView<Upper>().rankUpdate(rhs2,s1)._expression(),
|
||||
(s1 * rhs2 * rhs2.adjoint()).eval().template triangularView<Upper>().toDenseMatrix());
|
||||
|
||||
m2.setZero();
|
||||
VERIFY_IS_APPROX(m2.template selfadjointView<LowerTriangular>().rankUpdate(rhs1.adjoint(),s1)._expression(),
|
||||
(s1 * rhs1.adjoint() * rhs1).eval().template triangularView<LowerTriangular>().toDenseMatrix());
|
||||
VERIFY_IS_APPROX(m2.template selfadjointView<Lower>().rankUpdate(rhs1.adjoint(),s1)._expression(),
|
||||
(s1 * rhs1.adjoint() * rhs1).eval().template triangularView<Lower>().toDenseMatrix());
|
||||
|
||||
m2.setZero();
|
||||
VERIFY_IS_APPROX(m2.template selfadjointView<UpperTriangular>().rankUpdate(rhs1.adjoint(),s1)._expression(),
|
||||
(s1 * rhs1.adjoint() * rhs1).eval().template triangularView<UpperTriangular>().toDenseMatrix());
|
||||
VERIFY_IS_APPROX(m2.template selfadjointView<Upper>().rankUpdate(rhs1.adjoint(),s1)._expression(),
|
||||
(s1 * rhs1.adjoint() * rhs1).eval().template triangularView<Upper>().toDenseMatrix());
|
||||
|
||||
m2.setZero();
|
||||
VERIFY_IS_APPROX(m2.template selfadjointView<LowerTriangular>().rankUpdate(rhs3.adjoint(),s1)._expression(),
|
||||
(s1 * rhs3.adjoint() * rhs3).eval().template triangularView<LowerTriangular>().toDenseMatrix());
|
||||
VERIFY_IS_APPROX(m2.template selfadjointView<Lower>().rankUpdate(rhs3.adjoint(),s1)._expression(),
|
||||
(s1 * rhs3.adjoint() * rhs3).eval().template triangularView<Lower>().toDenseMatrix());
|
||||
|
||||
m2.setZero();
|
||||
VERIFY_IS_APPROX(m2.template selfadjointView<UpperTriangular>().rankUpdate(rhs3.adjoint(),s1)._expression(),
|
||||
(s1 * rhs3.adjoint() * rhs3).eval().template triangularView<UpperTriangular>().toDenseMatrix());
|
||||
VERIFY_IS_APPROX(m2.template selfadjointView<Upper>().rankUpdate(rhs3.adjoint(),s1)._expression(),
|
||||
(s1 * rhs3.adjoint() * rhs3).eval().template triangularView<Upper>().toDenseMatrix());
|
||||
}
|
||||
|
||||
void test_product_syrk()
|
||||
|
||||
@@ -36,27 +36,27 @@ template<typename Scalar> void trmm(int size,int othersize)
|
||||
s2 = ei_random<Scalar>();
|
||||
|
||||
tri.setRandom();
|
||||
loTri = tri.template triangularView<LowerTriangular>();
|
||||
upTri = tri.template triangularView<UpperTriangular>();
|
||||
loTri = tri.template triangularView<Lower>();
|
||||
upTri = tri.template triangularView<Upper>();
|
||||
ge1.setRandom();
|
||||
ge2.setRandom();
|
||||
|
||||
VERIFY_IS_APPROX( ge3 = tri.template triangularView<LowerTriangular>() * ge1, loTri * ge1);
|
||||
VERIFY_IS_APPROX(rge3 = tri.template triangularView<LowerTriangular>() * ge1, loTri * ge1);
|
||||
VERIFY_IS_APPROX( ge3 = tri.template triangularView<UpperTriangular>() * ge1, upTri * ge1);
|
||||
VERIFY_IS_APPROX(rge3 = tri.template triangularView<UpperTriangular>() * ge1, upTri * ge1);
|
||||
VERIFY_IS_APPROX( ge3 = (s1*tri.adjoint()).template triangularView<UpperTriangular>() * (s2*ge1), s1*loTri.adjoint() * (s2*ge1));
|
||||
VERIFY_IS_APPROX(rge3 = tri.adjoint().template triangularView<UpperTriangular>() * ge1, loTri.adjoint() * ge1);
|
||||
VERIFY_IS_APPROX( ge3 = tri.adjoint().template triangularView<LowerTriangular>() * ge1, upTri.adjoint() * ge1);
|
||||
VERIFY_IS_APPROX(rge3 = tri.adjoint().template triangularView<LowerTriangular>() * ge1, upTri.adjoint() * ge1);
|
||||
VERIFY_IS_APPROX( ge3 = tri.template triangularView<LowerTriangular>() * ge2.adjoint(), loTri * ge2.adjoint());
|
||||
VERIFY_IS_APPROX(rge3 = tri.template triangularView<LowerTriangular>() * ge2.adjoint(), loTri * ge2.adjoint());
|
||||
VERIFY_IS_APPROX( ge3 = tri.template triangularView<UpperTriangular>() * ge2.adjoint(), upTri * ge2.adjoint());
|
||||
VERIFY_IS_APPROX(rge3 = tri.template triangularView<UpperTriangular>() * ge2.adjoint(), upTri * ge2.adjoint());
|
||||
VERIFY_IS_APPROX( ge3 = (s1*tri).adjoint().template triangularView<UpperTriangular>() * ge2.adjoint(), ei_conj(s1) * loTri.adjoint() * ge2.adjoint());
|
||||
VERIFY_IS_APPROX(rge3 = tri.adjoint().template triangularView<UpperTriangular>() * ge2.adjoint(), loTri.adjoint() * ge2.adjoint());
|
||||
VERIFY_IS_APPROX( ge3 = tri.adjoint().template triangularView<LowerTriangular>() * ge2.adjoint(), upTri.adjoint() * ge2.adjoint());
|
||||
VERIFY_IS_APPROX(rge3 = tri.adjoint().template triangularView<LowerTriangular>() * ge2.adjoint(), upTri.adjoint() * ge2.adjoint());
|
||||
VERIFY_IS_APPROX( ge3 = tri.template triangularView<Lower>() * ge1, loTri * ge1);
|
||||
VERIFY_IS_APPROX(rge3 = tri.template triangularView<Lower>() * ge1, loTri * ge1);
|
||||
VERIFY_IS_APPROX( ge3 = tri.template triangularView<Upper>() * ge1, upTri * ge1);
|
||||
VERIFY_IS_APPROX(rge3 = tri.template triangularView<Upper>() * ge1, upTri * ge1);
|
||||
VERIFY_IS_APPROX( ge3 = (s1*tri.adjoint()).template triangularView<Upper>() * (s2*ge1), s1*loTri.adjoint() * (s2*ge1));
|
||||
VERIFY_IS_APPROX(rge3 = tri.adjoint().template triangularView<Upper>() * ge1, loTri.adjoint() * ge1);
|
||||
VERIFY_IS_APPROX( ge3 = tri.adjoint().template triangularView<Lower>() * ge1, upTri.adjoint() * ge1);
|
||||
VERIFY_IS_APPROX(rge3 = tri.adjoint().template triangularView<Lower>() * ge1, upTri.adjoint() * ge1);
|
||||
VERIFY_IS_APPROX( ge3 = tri.template triangularView<Lower>() * ge2.adjoint(), loTri * ge2.adjoint());
|
||||
VERIFY_IS_APPROX(rge3 = tri.template triangularView<Lower>() * ge2.adjoint(), loTri * ge2.adjoint());
|
||||
VERIFY_IS_APPROX( ge3 = tri.template triangularView<Upper>() * ge2.adjoint(), upTri * ge2.adjoint());
|
||||
VERIFY_IS_APPROX(rge3 = tri.template triangularView<Upper>() * ge2.adjoint(), upTri * ge2.adjoint());
|
||||
VERIFY_IS_APPROX( ge3 = (s1*tri).adjoint().template triangularView<Upper>() * ge2.adjoint(), ei_conj(s1) * loTri.adjoint() * ge2.adjoint());
|
||||
VERIFY_IS_APPROX(rge3 = tri.adjoint().template triangularView<Upper>() * ge2.adjoint(), loTri.adjoint() * ge2.adjoint());
|
||||
VERIFY_IS_APPROX( ge3 = tri.adjoint().template triangularView<Lower>() * ge2.adjoint(), upTri.adjoint() * ge2.adjoint());
|
||||
VERIFY_IS_APPROX(rge3 = tri.adjoint().template triangularView<Lower>() * ge2.adjoint(), upTri.adjoint() * ge2.adjoint());
|
||||
}
|
||||
|
||||
void test_product_trmm()
|
||||
|
||||
@@ -44,37 +44,37 @@ template<typename MatrixType> void trmv(const MatrixType& m)
|
||||
m1 = MatrixType::Random(rows, cols);
|
||||
|
||||
// check with a column-major matrix
|
||||
m3 = m1.template triangularView<Eigen::LowerTriangular>();
|
||||
VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::LowerTriangular>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::UpperTriangular>();
|
||||
VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::UpperTriangular>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::UnitLowerTriangular>();
|
||||
VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::UnitLowerTriangular>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::UnitUpperTriangular>();
|
||||
VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::UnitUpperTriangular>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::Lower>();
|
||||
VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::Lower>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::Upper>();
|
||||
VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::Upper>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::UnitLower>();
|
||||
VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::UnitLower>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::UnitUpper>();
|
||||
VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::UnitUpper>() * v1, largerEps));
|
||||
|
||||
// check conjugated and scalar multiple expressions (col-major)
|
||||
m3 = m1.template triangularView<Eigen::LowerTriangular>();
|
||||
VERIFY(((s1*m3).conjugate() * v1).isApprox((s1*m1).conjugate().template triangularView<Eigen::LowerTriangular>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::UpperTriangular>();
|
||||
VERIFY((m3.conjugate() * v1.conjugate()).isApprox(m1.conjugate().template triangularView<Eigen::UpperTriangular>() * v1.conjugate(), largerEps));
|
||||
m3 = m1.template triangularView<Eigen::Lower>();
|
||||
VERIFY(((s1*m3).conjugate() * v1).isApprox((s1*m1).conjugate().template triangularView<Eigen::Lower>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::Upper>();
|
||||
VERIFY((m3.conjugate() * v1.conjugate()).isApprox(m1.conjugate().template triangularView<Eigen::Upper>() * v1.conjugate(), largerEps));
|
||||
|
||||
// check with a row-major matrix
|
||||
m3 = m1.template triangularView<Eigen::UpperTriangular>();
|
||||
VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::LowerTriangular>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::LowerTriangular>();
|
||||
VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::UpperTriangular>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::UnitUpperTriangular>();
|
||||
VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::UnitLowerTriangular>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::UnitLowerTriangular>();
|
||||
VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::UnitUpperTriangular>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::Upper>();
|
||||
VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::Lower>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::Lower>();
|
||||
VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::Upper>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::UnitUpper>();
|
||||
VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::UnitLower>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::UnitLower>();
|
||||
VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::UnitUpper>() * v1, largerEps));
|
||||
|
||||
// check conjugated and scalar multiple expressions (row-major)
|
||||
m3 = m1.template triangularView<Eigen::UpperTriangular>();
|
||||
VERIFY((m3.adjoint() * v1).isApprox(m1.adjoint().template triangularView<Eigen::LowerTriangular>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::LowerTriangular>();
|
||||
VERIFY((m3.adjoint() * (s1*v1.conjugate())).isApprox(m1.adjoint().template triangularView<Eigen::UpperTriangular>() * (s1*v1.conjugate()), largerEps));
|
||||
m3 = m1.template triangularView<Eigen::UnitUpperTriangular>();
|
||||
m3 = m1.template triangularView<Eigen::Upper>();
|
||||
VERIFY((m3.adjoint() * v1).isApprox(m1.adjoint().template triangularView<Eigen::Lower>() * v1, largerEps));
|
||||
m3 = m1.template triangularView<Eigen::Lower>();
|
||||
VERIFY((m3.adjoint() * (s1*v1.conjugate())).isApprox(m1.adjoint().template triangularView<Eigen::Upper>() * (s1*v1.conjugate()), largerEps));
|
||||
m3 = m1.template triangularView<Eigen::UnitUpper>();
|
||||
|
||||
// TODO check with sub-matrices
|
||||
}
|
||||
|
||||
@@ -49,28 +49,28 @@ template<typename Scalar,int Size, int Cols> void trsolve(int size=Size,int cols
|
||||
cmLhs.setRandom(); cmLhs *= static_cast<RealScalar>(0.1); cmLhs.diagonal().array() += static_cast<RealScalar>(1);
|
||||
rmLhs.setRandom(); rmLhs *= static_cast<RealScalar>(0.1); rmLhs.diagonal().array() += static_cast<RealScalar>(1);
|
||||
|
||||
VERIFY_TRSM(cmLhs.conjugate().template triangularView<LowerTriangular>(), cmRhs);
|
||||
VERIFY_TRSM(cmLhs .template triangularView<UpperTriangular>(), cmRhs);
|
||||
VERIFY_TRSM(cmLhs .template triangularView<LowerTriangular>(), rmRhs);
|
||||
VERIFY_TRSM(cmLhs.conjugate().template triangularView<UpperTriangular>(), rmRhs);
|
||||
VERIFY_TRSM(cmLhs.conjugate().template triangularView<Lower>(), cmRhs);
|
||||
VERIFY_TRSM(cmLhs .template triangularView<Upper>(), cmRhs);
|
||||
VERIFY_TRSM(cmLhs .template triangularView<Lower>(), rmRhs);
|
||||
VERIFY_TRSM(cmLhs.conjugate().template triangularView<Upper>(), rmRhs);
|
||||
|
||||
VERIFY_TRSM(cmLhs.conjugate().template triangularView<UnitLowerTriangular>(), cmRhs);
|
||||
VERIFY_TRSM(cmLhs .template triangularView<UnitUpperTriangular>(), rmRhs);
|
||||
VERIFY_TRSM(cmLhs.conjugate().template triangularView<UnitLower>(), cmRhs);
|
||||
VERIFY_TRSM(cmLhs .template triangularView<UnitUpper>(), rmRhs);
|
||||
|
||||
VERIFY_TRSM(rmLhs .template triangularView<LowerTriangular>(), cmRhs);
|
||||
VERIFY_TRSM(rmLhs.conjugate().template triangularView<UnitUpperTriangular>(), rmRhs);
|
||||
VERIFY_TRSM(rmLhs .template triangularView<Lower>(), cmRhs);
|
||||
VERIFY_TRSM(rmLhs.conjugate().template triangularView<UnitUpper>(), rmRhs);
|
||||
|
||||
|
||||
VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView<LowerTriangular>(), cmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(cmLhs .template triangularView<UpperTriangular>(), cmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(cmLhs .template triangularView<LowerTriangular>(), rmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView<UpperTriangular>(), rmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView<Lower>(), cmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(cmLhs .template triangularView<Upper>(), cmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(cmLhs .template triangularView<Lower>(), rmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView<Upper>(), rmRhs);
|
||||
|
||||
VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView<UnitLowerTriangular>(), cmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(cmLhs .template triangularView<UnitUpperTriangular>(), rmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView<UnitLower>(), cmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(cmLhs .template triangularView<UnitUpper>(), rmRhs);
|
||||
|
||||
VERIFY_TRSM_ONTHERIGHT(rmLhs .template triangularView<LowerTriangular>(), cmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(rmLhs.conjugate().template triangularView<UnitUpperTriangular>(), rmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(rmLhs .template triangularView<Lower>(), cmRhs);
|
||||
VERIFY_TRSM_ONTHERIGHT(rmLhs.conjugate().template triangularView<UnitUpper>(), rmRhs);
|
||||
}
|
||||
|
||||
void test_product_trsolve()
|
||||
|
||||
@@ -47,7 +47,7 @@ template<typename MatrixType> void qr()
|
||||
MatrixQType q = qr.householderQ();
|
||||
VERIFY_IS_UNITARY(q);
|
||||
|
||||
MatrixType r = qr.matrixQR().template triangularView<UpperTriangular>();
|
||||
MatrixType r = qr.matrixQR().template triangularView<Upper>();
|
||||
MatrixType c = q * r * qr.colsPermutation().inverse();
|
||||
VERIFY_IS_APPROX(m1, c);
|
||||
|
||||
@@ -72,7 +72,7 @@ template<typename MatrixType, int Cols2> void qr_fixedsize()
|
||||
VERIFY(!qr.isInvertible());
|
||||
VERIFY(!qr.isSurjective());
|
||||
|
||||
Matrix<Scalar,Rows,Cols> r = qr.matrixQR().template triangularView<UpperTriangular>();
|
||||
Matrix<Scalar,Rows,Cols> r = qr.matrixQR().template triangularView<Upper>();
|
||||
Matrix<Scalar,Rows,Cols> c = qr.householderQ() * r * qr.colsPermutation().inverse();
|
||||
VERIFY_IS_APPROX(m1, c);
|
||||
|
||||
|
||||
@@ -115,9 +115,9 @@ template<typename SparseMatrixType> void sparse_product(const SparseMatrixType&
|
||||
VERIFY_IS_APPROX(mS, refS);
|
||||
VERIFY_IS_APPROX(x=mS*b, refX=refS*b);
|
||||
|
||||
VERIFY_IS_APPROX(x=mUp.template selfadjointView<UpperTriangular>()*b, refX=refS*b);
|
||||
VERIFY_IS_APPROX(x=mLo.template selfadjointView<LowerTriangular>()*b, refX=refS*b);
|
||||
VERIFY_IS_APPROX(x=mS.template selfadjointView<UpperTriangular|LowerTriangular>()*b, refX=refS*b);
|
||||
VERIFY_IS_APPROX(x=mUp.template selfadjointView<Upper>()*b, refX=refS*b);
|
||||
VERIFY_IS_APPROX(x=mLo.template selfadjointView<Lower>()*b, refX=refS*b);
|
||||
VERIFY_IS_APPROX(x=mS.template selfadjointView<Upper|Lower>()*b, refX=refS*b);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -65,23 +65,23 @@ template<typename Scalar> void sparse_solvers(int rows, int cols)
|
||||
|
||||
// lower - dense
|
||||
initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords);
|
||||
VERIFY_IS_APPROX(refMat2.template triangularView<LowerTriangular>().solve(vec2),
|
||||
m2.template triangularView<LowerTriangular>().solve(vec3));
|
||||
VERIFY_IS_APPROX(refMat2.template triangularView<Lower>().solve(vec2),
|
||||
m2.template triangularView<Lower>().solve(vec3));
|
||||
|
||||
// upper - dense
|
||||
initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, &zeroCoords, &nonzeroCoords);
|
||||
VERIFY_IS_APPROX(refMat2.template triangularView<UpperTriangular>().solve(vec2),
|
||||
m2.template triangularView<UpperTriangular>().solve(vec3));
|
||||
VERIFY_IS_APPROX(refMat2.template triangularView<Upper>().solve(vec2),
|
||||
m2.template triangularView<Upper>().solve(vec3));
|
||||
|
||||
// lower - transpose
|
||||
initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords);
|
||||
VERIFY_IS_APPROX(refMat2.transpose().template triangularView<UpperTriangular>().solve(vec2),
|
||||
m2.transpose().template triangularView<UpperTriangular>().solve(vec3));
|
||||
VERIFY_IS_APPROX(refMat2.transpose().template triangularView<Upper>().solve(vec2),
|
||||
m2.transpose().template triangularView<Upper>().solve(vec3));
|
||||
|
||||
// upper - transpose
|
||||
initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, &zeroCoords, &nonzeroCoords);
|
||||
VERIFY_IS_APPROX(refMat2.transpose().template triangularView<LowerTriangular>().solve(vec2),
|
||||
m2.transpose().template triangularView<LowerTriangular>().solve(vec3));
|
||||
VERIFY_IS_APPROX(refMat2.transpose().template triangularView<Lower>().solve(vec2),
|
||||
m2.transpose().template triangularView<Lower>().solve(vec3));
|
||||
|
||||
SparseMatrix<Scalar> matB(rows, rows);
|
||||
DenseMatrix refMatB = DenseMatrix::Zero(rows, rows);
|
||||
@@ -89,21 +89,21 @@ template<typename Scalar> void sparse_solvers(int rows, int cols)
|
||||
// lower - sparse
|
||||
initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular);
|
||||
initSparse<Scalar>(density, refMatB, matB);
|
||||
refMat2.template triangularView<LowerTriangular>().solveInPlace(refMatB);
|
||||
m2.template triangularView<LowerTriangular>().solveInPlace(matB);
|
||||
refMat2.template triangularView<Lower>().solveInPlace(refMatB);
|
||||
m2.template triangularView<Lower>().solveInPlace(matB);
|
||||
VERIFY_IS_APPROX(matB.toDense(), refMatB);
|
||||
|
||||
// upper - sparse
|
||||
initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular);
|
||||
initSparse<Scalar>(density, refMatB, matB);
|
||||
refMat2.template triangularView<UpperTriangular>().solveInPlace(refMatB);
|
||||
m2.template triangularView<UpperTriangular>().solveInPlace(matB);
|
||||
refMat2.template triangularView<Upper>().solveInPlace(refMatB);
|
||||
m2.template triangularView<Upper>().solveInPlace(matB);
|
||||
VERIFY_IS_APPROX(matB, refMatB);
|
||||
|
||||
// test deprecated API
|
||||
initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords);
|
||||
VERIFY_IS_APPROX(refMat2.template triangularView<LowerTriangular>().solve(vec2),
|
||||
m2.template triangularView<LowerTriangular>().solve(vec3));
|
||||
VERIFY_IS_APPROX(refMat2.template triangularView<Lower>().solve(vec2),
|
||||
m2.template triangularView<Lower>().solve(vec3));
|
||||
}
|
||||
|
||||
// test LLT
|
||||
@@ -118,29 +118,28 @@ template<typename Scalar> void sparse_solvers(int rows, int cols)
|
||||
initSPD(density, refMat2, m2);
|
||||
|
||||
refX = refMat2.llt().solve(b);
|
||||
typedef SparseMatrix<Scalar,LowerTriangular|SelfAdjoint> SparseSelfAdjointMatrix;
|
||||
if (!NumTraits<Scalar>::IsComplex)
|
||||
{
|
||||
x = b;
|
||||
SparseLLT<SparseSelfAdjointMatrix> (m2).solveInPlace(x);
|
||||
SparseLLT<SparseMatrix<Scalar> > (m2).solveInPlace(x);
|
||||
VERIFY(refX.isApprox(x,test_precision<Scalar>()) && "LLT: default");
|
||||
}
|
||||
#ifdef EIGEN_CHOLMOD_SUPPORT
|
||||
x = b;
|
||||
SparseLLT<SparseSelfAdjointMatrix,Cholmod>(m2).solveInPlace(x);
|
||||
SparseLLT<SparseMatrix<Scalar> ,Cholmod>(m2).solveInPlace(x);
|
||||
VERIFY(refX.isApprox(x,test_precision<Scalar>()) && "LLT: cholmod");
|
||||
#endif
|
||||
|
||||
#ifdef EIGEN_TAUCS_SUPPORT
|
||||
x = b;
|
||||
SparseLLT<SparseSelfAdjointMatrix,Taucs>(m2,IncompleteFactorization).solveInPlace(x);
|
||||
SparseLLT<SparseMatrix<Scalar> ,Taucs>(m2,IncompleteFactorization).solveInPlace(x);
|
||||
VERIFY(refX.isApprox(x,test_precision<Scalar>()) && "LLT: taucs (IncompleteFactorization)");
|
||||
// TODO fix TAUCS with complexes
|
||||
x = b;
|
||||
SparseLLT<SparseSelfAdjointMatrix,Taucs>(m2,SupernodalMultifrontal).solveInPlace(x);
|
||||
SparseLLT<SparseMatrix<Scalar> ,Taucs>(m2,SupernodalMultifrontal).solveInPlace(x);
|
||||
VERIFY(refX.isApprox(x,test_precision<Scalar>()) && "LLT: taucs (SupernodalMultifrontal)");
|
||||
x = b;
|
||||
SparseLLT<SparseSelfAdjointMatrix,Taucs>(m2,SupernodalLeftLooking).solveInPlace(x);
|
||||
SparseLLT<SparseMatrix<Scalar> ,Taucs>(m2,SupernodalLeftLooking).solveInPlace(x);
|
||||
VERIFY(refX.isApprox(x,test_precision<Scalar>()) && "LLT: taucs (SupernodalLeftLooking)");
|
||||
#endif
|
||||
}
|
||||
@@ -161,7 +160,7 @@ template<typename Scalar> void sparse_solvers(int rows, int cols)
|
||||
refMat2.diagonal() *= 0.5;
|
||||
|
||||
refX = refMat2.llt().solve(b); // FIXME use LLT to compute the reference because LDLT seems to fail with large matrices
|
||||
typedef SparseMatrix<Scalar,UpperTriangular|SelfAdjoint> SparseSelfAdjointMatrix;
|
||||
typedef SparseMatrix<Scalar,Upper|SelfAdjoint> SparseSelfAdjointMatrix;
|
||||
x = b;
|
||||
SparseLDLT<SparseSelfAdjointMatrix> ldlt(m2);
|
||||
if (ldlt.succeeded())
|
||||
|
||||
@@ -53,14 +53,14 @@ template<typename MatrixType> void triangular_square(const MatrixType& m)
|
||||
v2 = VectorType::Random(rows),
|
||||
vzero = VectorType::Zero(rows);
|
||||
|
||||
MatrixType m1up = m1.template triangularView<UpperTriangular>();
|
||||
MatrixType m2up = m2.template triangularView<UpperTriangular>();
|
||||
MatrixType m1up = m1.template triangularView<Upper>();
|
||||
MatrixType m2up = m2.template triangularView<Upper>();
|
||||
|
||||
if (rows*cols>1)
|
||||
{
|
||||
VERIFY(m1up.isUpperTriangular());
|
||||
VERIFY(m2up.transpose().isLowerTriangular());
|
||||
VERIFY(!m2.isLowerTriangular());
|
||||
VERIFY(m1up.isUpper());
|
||||
VERIFY(m2up.transpose().isLower());
|
||||
VERIFY(!m2.isLower());
|
||||
}
|
||||
|
||||
// VERIFY_IS_APPROX(m1up.transpose() * m2, m1.upper().transpose().lower() * m2);
|
||||
@@ -68,20 +68,20 @@ template<typename MatrixType> void triangular_square(const MatrixType& m)
|
||||
// test overloaded operator+=
|
||||
r1.setZero();
|
||||
r2.setZero();
|
||||
r1.template triangularView<UpperTriangular>() += m1;
|
||||
r1.template triangularView<Upper>() += m1;
|
||||
r2 += m1up;
|
||||
VERIFY_IS_APPROX(r1,r2);
|
||||
|
||||
// test overloaded operator=
|
||||
m1.setZero();
|
||||
m1.template triangularView<UpperTriangular>() = m2.transpose() + m2;
|
||||
m1.template triangularView<Upper>() = m2.transpose() + m2;
|
||||
m3 = m2.transpose() + m2;
|
||||
VERIFY_IS_APPROX(m3.template triangularView<LowerTriangular>().transpose().toDenseMatrix(), m1);
|
||||
VERIFY_IS_APPROX(m3.template triangularView<Lower>().transpose().toDenseMatrix(), m1);
|
||||
|
||||
// test overloaded operator=
|
||||
m1.setZero();
|
||||
m1.template triangularView<LowerTriangular>() = m2.transpose() + m2;
|
||||
VERIFY_IS_APPROX(m3.template triangularView<LowerTriangular>().toDenseMatrix(), m1);
|
||||
m1.template triangularView<Lower>() = m2.transpose() + m2;
|
||||
VERIFY_IS_APPROX(m3.template triangularView<Lower>().toDenseMatrix(), m1);
|
||||
|
||||
m1 = MatrixType::Random(rows, cols);
|
||||
for (int i=0; i<rows; ++i)
|
||||
@@ -89,49 +89,49 @@ template<typename MatrixType> void triangular_square(const MatrixType& m)
|
||||
|
||||
Transpose<MatrixType> trm4(m4);
|
||||
// test back and forward subsitution with a vector as the rhs
|
||||
m3 = m1.template triangularView<UpperTriangular>();
|
||||
VERIFY(v2.isApprox(m3.adjoint() * (m1.adjoint().template triangularView<LowerTriangular>().solve(v2)), largerEps));
|
||||
m3 = m1.template triangularView<LowerTriangular>();
|
||||
VERIFY(v2.isApprox(m3.transpose() * (m1.transpose().template triangularView<UpperTriangular>().solve(v2)), largerEps));
|
||||
m3 = m1.template triangularView<UpperTriangular>();
|
||||
VERIFY(v2.isApprox(m3 * (m1.template triangularView<UpperTriangular>().solve(v2)), largerEps));
|
||||
m3 = m1.template triangularView<LowerTriangular>();
|
||||
VERIFY(v2.isApprox(m3.conjugate() * (m1.conjugate().template triangularView<LowerTriangular>().solve(v2)), largerEps));
|
||||
m3 = m1.template triangularView<Upper>();
|
||||
VERIFY(v2.isApprox(m3.adjoint() * (m1.adjoint().template triangularView<Lower>().solve(v2)), largerEps));
|
||||
m3 = m1.template triangularView<Lower>();
|
||||
VERIFY(v2.isApprox(m3.transpose() * (m1.transpose().template triangularView<Upper>().solve(v2)), largerEps));
|
||||
m3 = m1.template triangularView<Upper>();
|
||||
VERIFY(v2.isApprox(m3 * (m1.template triangularView<Upper>().solve(v2)), largerEps));
|
||||
m3 = m1.template triangularView<Lower>();
|
||||
VERIFY(v2.isApprox(m3.conjugate() * (m1.conjugate().template triangularView<Lower>().solve(v2)), largerEps));
|
||||
|
||||
// test back and forward subsitution with a matrix as the rhs
|
||||
m3 = m1.template triangularView<UpperTriangular>();
|
||||
VERIFY(m2.isApprox(m3.adjoint() * (m1.adjoint().template triangularView<LowerTriangular>().solve(m2)), largerEps));
|
||||
m3 = m1.template triangularView<LowerTriangular>();
|
||||
VERIFY(m2.isApprox(m3.transpose() * (m1.transpose().template triangularView<UpperTriangular>().solve(m2)), largerEps));
|
||||
m3 = m1.template triangularView<UpperTriangular>();
|
||||
VERIFY(m2.isApprox(m3 * (m1.template triangularView<UpperTriangular>().solve(m2)), largerEps));
|
||||
m3 = m1.template triangularView<LowerTriangular>();
|
||||
VERIFY(m2.isApprox(m3.conjugate() * (m1.conjugate().template triangularView<LowerTriangular>().solve(m2)), largerEps));
|
||||
m3 = m1.template triangularView<Upper>();
|
||||
VERIFY(m2.isApprox(m3.adjoint() * (m1.adjoint().template triangularView<Lower>().solve(m2)), largerEps));
|
||||
m3 = m1.template triangularView<Lower>();
|
||||
VERIFY(m2.isApprox(m3.transpose() * (m1.transpose().template triangularView<Upper>().solve(m2)), largerEps));
|
||||
m3 = m1.template triangularView<Upper>();
|
||||
VERIFY(m2.isApprox(m3 * (m1.template triangularView<Upper>().solve(m2)), largerEps));
|
||||
m3 = m1.template triangularView<Lower>();
|
||||
VERIFY(m2.isApprox(m3.conjugate() * (m1.conjugate().template triangularView<Lower>().solve(m2)), largerEps));
|
||||
|
||||
// check M * inv(L) using in place API
|
||||
m4 = m3;
|
||||
m3.transpose().template triangularView<Eigen::UpperTriangular>().solveInPlace(trm4);
|
||||
m3.transpose().template triangularView<Eigen::Upper>().solveInPlace(trm4);
|
||||
VERIFY(m4.cwiseAbs().isIdentity(test_precision<RealScalar>()));
|
||||
|
||||
// check M * inv(U) using in place API
|
||||
m3 = m1.template triangularView<UpperTriangular>();
|
||||
m3 = m1.template triangularView<Upper>();
|
||||
m4 = m3;
|
||||
m3.transpose().template triangularView<Eigen::LowerTriangular>().solveInPlace(trm4);
|
||||
m3.transpose().template triangularView<Eigen::Lower>().solveInPlace(trm4);
|
||||
VERIFY(m4.cwiseAbs().isIdentity(test_precision<RealScalar>()));
|
||||
|
||||
// check solve with unit diagonal
|
||||
m3 = m1.template triangularView<UnitUpperTriangular>();
|
||||
VERIFY(m2.isApprox(m3 * (m1.template triangularView<UnitUpperTriangular>().solve(m2)), largerEps));
|
||||
m3 = m1.template triangularView<UnitUpper>();
|
||||
VERIFY(m2.isApprox(m3 * (m1.template triangularView<UnitUpper>().solve(m2)), largerEps));
|
||||
|
||||
// VERIFY(( m1.template triangularView<UpperTriangular>()
|
||||
// * m2.template triangularView<UpperTriangular>()).isUpperTriangular());
|
||||
// VERIFY(( m1.template triangularView<Upper>()
|
||||
// * m2.template triangularView<Upper>()).isUpper());
|
||||
|
||||
// test swap
|
||||
m1.setOnes();
|
||||
m2.setZero();
|
||||
m2.template triangularView<UpperTriangular>().swap(m1);
|
||||
m2.template triangularView<Upper>().swap(m1);
|
||||
m3.setZero();
|
||||
m3.template triangularView<UpperTriangular>().setOnes();
|
||||
m3.template triangularView<Upper>().setOnes();
|
||||
VERIFY_IS_APPROX(m2,m3);
|
||||
|
||||
}
|
||||
@@ -165,69 +165,69 @@ template<typename MatrixType> void triangular_rect(const MatrixType& m)
|
||||
v2 = VectorType::Random(rows),
|
||||
vzero = VectorType::Zero(rows);
|
||||
|
||||
MatrixType m1up = m1.template triangularView<UpperTriangular>();
|
||||
MatrixType m2up = m2.template triangularView<UpperTriangular>();
|
||||
MatrixType m1up = m1.template triangularView<Upper>();
|
||||
MatrixType m2up = m2.template triangularView<Upper>();
|
||||
|
||||
if (rows*cols>1)
|
||||
{
|
||||
VERIFY(m1up.isUpperTriangular());
|
||||
VERIFY(m2up.transpose().isLowerTriangular());
|
||||
VERIFY(!m2.isLowerTriangular());
|
||||
VERIFY(m1up.isUpper());
|
||||
VERIFY(m2up.transpose().isLower());
|
||||
VERIFY(!m2.isLower());
|
||||
}
|
||||
|
||||
// test overloaded operator+=
|
||||
r1.setZero();
|
||||
r2.setZero();
|
||||
r1.template triangularView<UpperTriangular>() += m1;
|
||||
r1.template triangularView<Upper>() += m1;
|
||||
r2 += m1up;
|
||||
VERIFY_IS_APPROX(r1,r2);
|
||||
|
||||
// test overloaded operator=
|
||||
m1.setZero();
|
||||
m1.template triangularView<UpperTriangular>() = 3 * m2;
|
||||
m1.template triangularView<Upper>() = 3 * m2;
|
||||
m3 = 3 * m2;
|
||||
VERIFY_IS_APPROX(m3.template triangularView<UpperTriangular>().toDenseMatrix(), m1);
|
||||
VERIFY_IS_APPROX(m3.template triangularView<Upper>().toDenseMatrix(), m1);
|
||||
|
||||
|
||||
m1.setZero();
|
||||
m1.template triangularView<LowerTriangular>() = 3 * m2;
|
||||
VERIFY_IS_APPROX(m3.template triangularView<LowerTriangular>().toDenseMatrix(), m1);
|
||||
m1.template triangularView<Lower>() = 3 * m2;
|
||||
VERIFY_IS_APPROX(m3.template triangularView<Lower>().toDenseMatrix(), m1);
|
||||
|
||||
m1.setZero();
|
||||
m1.template triangularView<StrictlyUpperTriangular>() = 3 * m2;
|
||||
VERIFY_IS_APPROX(m3.template triangularView<StrictlyUpperTriangular>().toDenseMatrix(), m1);
|
||||
m1.template triangularView<StrictlyUpper>() = 3 * m2;
|
||||
VERIFY_IS_APPROX(m3.template triangularView<StrictlyUpper>().toDenseMatrix(), m1);
|
||||
|
||||
|
||||
m1.setZero();
|
||||
m1.template triangularView<StrictlyLowerTriangular>() = 3 * m2;
|
||||
VERIFY_IS_APPROX(m3.template triangularView<StrictlyLowerTriangular>().toDenseMatrix(), m1);
|
||||
m1.template triangularView<StrictlyLower>() = 3 * m2;
|
||||
VERIFY_IS_APPROX(m3.template triangularView<StrictlyLower>().toDenseMatrix(), m1);
|
||||
m1.setRandom();
|
||||
m2 = m1.template triangularView<UpperTriangular>();
|
||||
VERIFY(m2.isUpperTriangular());
|
||||
VERIFY(!m2.isLowerTriangular());
|
||||
m2 = m1.template triangularView<StrictlyUpperTriangular>();
|
||||
VERIFY(m2.isUpperTriangular());
|
||||
m2 = m1.template triangularView<Upper>();
|
||||
VERIFY(m2.isUpper());
|
||||
VERIFY(!m2.isLower());
|
||||
m2 = m1.template triangularView<StrictlyUpper>();
|
||||
VERIFY(m2.isUpper());
|
||||
VERIFY(m2.diagonal().isMuchSmallerThan(RealScalar(1)));
|
||||
m2 = m1.template triangularView<UnitUpperTriangular>();
|
||||
VERIFY(m2.isUpperTriangular());
|
||||
m2 = m1.template triangularView<UnitUpper>();
|
||||
VERIFY(m2.isUpper());
|
||||
m2.diagonal().array() -= Scalar(1);
|
||||
VERIFY(m2.diagonal().isMuchSmallerThan(RealScalar(1)));
|
||||
m2 = m1.template triangularView<LowerTriangular>();
|
||||
VERIFY(m2.isLowerTriangular());
|
||||
VERIFY(!m2.isUpperTriangular());
|
||||
m2 = m1.template triangularView<StrictlyLowerTriangular>();
|
||||
VERIFY(m2.isLowerTriangular());
|
||||
m2 = m1.template triangularView<Lower>();
|
||||
VERIFY(m2.isLower());
|
||||
VERIFY(!m2.isUpper());
|
||||
m2 = m1.template triangularView<StrictlyLower>();
|
||||
VERIFY(m2.isLower());
|
||||
VERIFY(m2.diagonal().isMuchSmallerThan(RealScalar(1)));
|
||||
m2 = m1.template triangularView<UnitLowerTriangular>();
|
||||
VERIFY(m2.isLowerTriangular());
|
||||
m2 = m1.template triangularView<UnitLower>();
|
||||
VERIFY(m2.isLower());
|
||||
m2.diagonal().array() -= Scalar(1);
|
||||
VERIFY(m2.diagonal().isMuchSmallerThan(RealScalar(1)));
|
||||
// test swap
|
||||
m1.setOnes();
|
||||
m2.setZero();
|
||||
m2.template triangularView<UpperTriangular>().swap(m1);
|
||||
m2.template triangularView<Upper>().swap(m1);
|
||||
m3.setZero();
|
||||
m3.template triangularView<UpperTriangular>().setOnes();
|
||||
m3.template triangularView<Upper>().setOnes();
|
||||
VERIFY_IS_APPROX(m2,m3);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user