Eigen :: SparseQR :: matrixQ () зависает навсегда для большой тонкой разреженной матрицы - PullRequest
0 голосов
/ 21 мая 2019

У меня есть большая, но разреженная матрица B, с размером 19068 x 156 и 79884 ненулевых элементов (так что около 2,7% записей не равны нулю).Я хочу вычислить ядро ​​матрицы Bᵀ, поэтому я сделал разреженное QR-разложение на B. Так что если B = [Q₁ Q₂] * [R;0], то Q₂ является ядром Bᵀ.Я могу выполнить разложение 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 и разреженной единичной матрицей.Почему это должно быть медленно?

...