Fix SPQR for rectangular matrices

(grafted from f939c351cbfcb1007943fe6062503bc455b692e1
)
This commit is contained in:
Gael Guennebaud 2016-10-12 22:39:33 +02:00
parent 91207cbae3
commit 03fd417f66
2 changed files with 6 additions and 5 deletions

View File

@ -110,9 +110,9 @@ class SPQR
max2Norm = RealScalar(1); max2Norm = RealScalar(1);
pivotThreshold = 20 * (mat.rows() + mat.cols()) * max2Norm * NumTraits<RealScalar>::epsilon(); pivotThreshold = 20 * (mat.rows() + mat.cols()) * max2Norm * NumTraits<RealScalar>::epsilon();
} }
cholmod_sparse A; cholmod_sparse A;
A = viewAsCholmod(mat); A = viewAsCholmod(mat);
m_rows = matrix.rows();
Index col = matrix.cols(); Index col = matrix.cols();
m_rank = SuiteSparseQR<Scalar>(m_ordering, pivotThreshold, col, &A, m_rank = SuiteSparseQR<Scalar>(m_ordering, pivotThreshold, col, &A,
&m_cR, &m_E, &m_H, &m_HPinv, &m_HTau, &m_cc); &m_cR, &m_E, &m_H, &m_HPinv, &m_HTau, &m_cc);
@ -130,7 +130,7 @@ class SPQR
/** /**
* Get the number of rows of the input matrix and the Q matrix * Get the number of rows of the input matrix and the Q matrix
*/ */
inline Index rows() const {return m_cR->nrow; } inline Index rows() const {return m_rows; }
/** /**
* Get the number of columns of the input matrix. * Get the number of columns of the input matrix.
@ -254,6 +254,7 @@ class SPQR
mutable Index m_rank; // The rank of the matrix mutable Index m_rank; // The rank of the matrix
mutable cholmod_common m_cc; // Workspace and parameters mutable cholmod_common m_cc; // Workspace and parameters
bool m_useDefaultThreshold; // Use default threshold bool m_useDefaultThreshold; // Use default threshold
Index m_rows;
template<typename ,typename > friend struct SPQR_QProduct; template<typename ,typename > friend struct SPQR_QProduct;
}; };

View File

@ -18,8 +18,8 @@ int generate_sparse_rectangular_problem(MatrixType& A, DenseMat& dA, int maxRows
int cols = internal::random<int>(1,rows); int cols = internal::random<int>(1,rows);
double density = (std::max)(8./(rows*cols), 0.01); double density = (std::max)(8./(rows*cols), 0.01);
A.resize(rows,rows); A.resize(rows,cols);
dA.resize(rows,rows); dA.resize(rows,cols);
initSparse<Scalar>(density, dA, A,ForceNonZeroDiag); initSparse<Scalar>(density, dA, A,ForceNonZeroDiag);
A.makeCompressed(); A.makeCompressed();
return rows; return rows;