aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/sparse_solvers.cpp
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2010-06-03 11:56:08 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2010-06-03 11:56:08 +0200
commitd92de9574a2aec4af51ad04c0dc5cd2eb39e45bf (patch)
tree292e521fad350815aaa422636479a84aca7af785 /test/sparse_solvers.cpp
parent8350ab9fb85d278cf2687efc86d211b25741c657 (diff)
fix sparse LDLT with complexes
Diffstat (limited to 'test/sparse_solvers.cpp')
-rw-r--r--test/sparse_solvers.cpp13
1 files changed, 7 insertions, 6 deletions
diff --git a/test/sparse_solvers.cpp b/test/sparse_solvers.cpp
index 00df1bffd..ea8aee718 100644
--- a/test/sparse_solvers.cpp
+++ b/test/sparse_solvers.cpp
@@ -149,26 +149,27 @@ template<typename Scalar> void sparse_solvers(int rows, int cols)
}
// test LDLT
- if (!NumTraits<Scalar>::IsComplex)
{
- // TODO fix the issue with complex (see SparseLDLT::solveInPlace)
SparseMatrix<Scalar> m2(rows, cols);
DenseMatrix refMat2(rows, cols);
DenseVector b = DenseVector::Random(cols);
DenseVector refX(cols), x(cols);
-// initSPD(density, refMat2, m2);
initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, 0, 0);
- refMat2 += (refMat2.adjoint()).eval();
- refMat2.diagonal() *= 0.5;
+ for(int i=0; i<rows; ++i)
+ m2.coeffRef(i,i) = refMat2(i,i) = ei_abs(ei_real(refMat2(i,i)));
- refX = refMat2.llt().solve(b); // FIXME use LLT to compute the reference because LDLT seems to fail with large matrices
+ refX = refMat2.template selfadjointView<Upper>().llt().solve(b);
+ // FIXME use LLT to compute the reference because LDLT seems to fail with large matrices
typedef SparseMatrix<Scalar,Upper|SelfAdjoint> SparseSelfAdjointMatrix;
x = b;
SparseLDLT<SparseSelfAdjointMatrix> ldlt(m2);
if (ldlt.succeeded())
ldlt.solveInPlace(x);
+ else
+ std::cerr << "warning LDLT failed\n";
+
VERIFY(refX.isApprox(x,test_precision<Scalar>()) && "LDLT: default");
}