У меня есть большая, но разреженная матрица 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 и разреженной единичной матрицей.Почему это должно быть медленно?