Eigen :: SparseQR :: matrixQ()永远挂在一个大的稀疏稀疏矩阵上

时间:2019-05-21 04:53:29

标签: eigen eigen3

我有一个大而稀疏的矩阵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和稀疏恒等矩阵之间执行稀疏乘积。为什么这应该很慢?

0 个答案:

没有答案