我有一个大而稀疏的矩阵B
,尺寸为19068 x 156,非零为79884(因此约有2.7%的项为非零)。我想计算矩阵Bᵀ的角,所以我对B做了一个稀疏的QR分解。因此,如果B = [Q₁Q2] * [R; 0],那么Q 2是B 1的核心。我可以成功地(并且非常快地)完成QR分解,但是当我调用SparseQR :: matrixQ()函数时,该程序仅在此处挂了一个小时而没有返回任何内容。
#include <Eigen/Sparse>
#include <Eigen/SparseQR>
int main() {
// Assume the matrix B is generated somehow. B's size is 19068 x 156
Eigen::SparseMatrix<double> B = ...;
// Now do QR decomposition on B.
Eigen::SparseQR<Eigen::SparseMatrix<double>, Eigen::COLAMDOrdering<int>> qr;
qr.analyzePattern(B);
qr.factorize(B);
if (qr.info() != Eigen::Success) {
throw std::runtime_error("QR fails."); // It doesn't throw
}
std::cout << "rank of B is " << qr.rank() << "\n"; // rank of B is 156
Eigen::SparseMatrix<double> Q;
Q = qr.matrixQ(); // It hangs on this step forever.
const Eigen::SparseMatrix<double> B_kernal = Q.rightCols(B.rows() - qr.rank());
}
根据https://eigen.tuxfamily.org/dox/classEigen_1_1SparseQR.html#ae1cc0a836c177d4f42600f8639354be1,调用matrixQ()
仅在矩阵Q和稀疏恒等矩阵之间执行稀疏乘积。为什么这应该很慢?