1 // This file is part of Eigen, a lightweight C++ template library
4 // Copyright (C) 2012 Desire Nuentsa Wakam <desire.nuentsa_wakam@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
9 #include <Eigen/SPQRSupport>
12 template<typename MatrixType
,typename DenseMat
>
13 int generate_sparse_rectangular_problem(MatrixType
& A
, DenseMat
& dA
, int maxRows
= 300, int maxCols
= 300)
15 eigen_assert(maxRows
>= maxCols
);
16 typedef typename
MatrixType::Scalar Scalar
;
17 int rows
= internal::random
<int>(1,maxRows
);
18 int cols
= internal::random
<int>(1,rows
);
19 double density
= (std::max
)(8./(rows
*cols
), 0.01);
23 initSparse
<Scalar
>(density
, dA
, A
,ForceNonZeroDiag
);
28 template<typename Scalar
> void test_spqr_scalar()
30 typedef SparseMatrix
<Scalar
,ColMajor
> MatrixType
;
32 Matrix
<Scalar
,Dynamic
,Dynamic
> dA
;
33 typedef Matrix
<Scalar
,Dynamic
,1> DenseVector
;
35 SPQR
<MatrixType
> solver
;
36 generate_sparse_rectangular_problem(A
,dA
);
39 b
= DenseVector::Random(m
);
41 if (solver
.info() != Success
)
43 std::cerr
<< "sparse QR factorization failed\n";
48 if (solver
.info() != Success
)
50 std::cerr
<< "sparse QR factorization failed\n";
54 //Compare with a dense solver
55 refX
= dA
.colPivHouseholderQr().solve(b
);
56 VERIFY(x
.isApprox(refX
,test_precision
<Scalar
>()));
58 void test_spqr_support()
60 CALL_SUBTEST_1(test_spqr_scalar
<double>());
61 CALL_SUBTEST_2(test_spqr_scalar
<std::complex<double> >());