Skip to content

Commit 4dbdc9b

Browse files
committed
SparseQR: Add toSparse method in matrixQ return type to extract the related Eigen SparseMatrix
1 parent 9eb1056 commit 4dbdc9b

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

include/eigenpy/decompositions/sparse/SparseQR.hpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ struct SparseQRMatrixQReturnTypeVisitor
6464
typedef Eigen::SparseQRMatrixQTransposeReturnType<SparseQRType>
6565
QTransposeType;
6666
typedef Eigen::SparseQRMatrixQReturnType<SparseQRType> QType;
67+
typedef typename SparseQRType::QRMatrixType QRMatrixType;
6768
typedef Eigen::VectorXd VectorXd;
6869
typedef Eigen::MatrixXd MatrixXd;
6970

@@ -92,9 +93,21 @@ struct SparseQRMatrixQReturnTypeVisitor
9293
+[](const QType& self) -> QTransposeType { return self.adjoint(); })
9394

9495
.def(
95-
"transpose", +[](const QType& self) -> QTransposeType {
96+
"transpose",
97+
+[](const QType& self) -> QTransposeType {
9698
return self.transpose();
97-
});
99+
})
100+
101+
.def(
102+
"toSparse",
103+
+[](QType& self) -> QRMatrixType {
104+
Eigen::Index m = self.rows();
105+
MatrixXd I = MatrixXd::Identity(m, m);
106+
MatrixXd Q_dense = self * I;
107+
return Q_dense.sparseView();
108+
},
109+
bp::arg("self"),
110+
"Convert the Q matrix to a sparse matrix representation.");
98111
}
99112

100113
static void expose() {

unittest/python/decompositions/sparse/test_SparseQR.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,24 @@
7272
QtAP = Qt @ A_permuted
7373
R_dense = spqr.matrixR().toarray()
7474
assert eigenpy.is_approx(QtAP, R_dense)
75+
76+
Q_sparse = Q.toSparse()
77+
R_sparse = R
78+
79+
assert Q_sparse.shape == (dim, dim)
80+
81+
QtQ_sparse = Q_sparse.T @ Q_sparse
82+
QQt_sparse = Q_sparse @ Q_sparse.T
83+
I_sparse = spa.identity(dim, format="csc")
84+
85+
assert eigenpy.is_approx(QtQ_sparse.toarray(), I_sparse.toarray())
86+
assert eigenpy.is_approx(QQt_sparse.toarray(), I_sparse.toarray())
87+
88+
Q_sparse_test_vec = Q_sparse @ test_vec
89+
assert eigenpy.is_approx(Qv, Q_sparse_test_vec)
90+
91+
Q_sparse_test_matrix = Q_sparse @ test_matrix
92+
assert eigenpy.is_approx(QM, Q_sparse_test_matrix)
93+
94+
QR_sparse = Q_sparse @ R_sparse.toarray()
95+
assert eigenpy.is_approx(QR_sparse, A_permuted)

0 commit comments

Comments
 (0)