【发布时间】:2019-02-19 12:29:17
【问题描述】:
给定一个稀疏矩阵A和一个向量b,我想得到方程A * x = b的解x以及A的核。
一种可能性是convertA 到密集表示。
#include <iostream>
#include <Eigen/Dense>
#include <Eigen/SparseQR>
int main()
{
// This is a toy problem. My actual matrix
// is of course bigger and sparser.
Eigen::SparseMatrix<double> A(2,2);
A.insert(0,0) = 1;
A.insert(0,1) = 2;
A.insert(1,0) = 4;
A.insert(1,1) = 8;
A.makeCompressed();
Eigen::Vector2d b;
b << 3, 12;
Eigen::SparseQR<Eigen::SparseMatrix<double>,
Eigen::COLAMDOrdering<int> > solver;
solver.compute(A);
std::cout << "Solution:\n" << solver.solve(b) << std::endl;
Eigen::Matrix2d A_dense(A);
std::cout << "Kernel:\n" << A_dense.fullPivLu().kernel() << std::endl;
return 0;
}
是否可以直接在稀疏表示中做同样的事情?除了FullPivLu,我在任何地方都找不到函数kernel()。
【问题讨论】:
-
懒得自己实现它,但是应该计算
A.transpose()的SparseQR并通过将qr.matrixQ()乘以Q的最后一列来获得qr.rank()的最后一列一个稀疏(或密集)的单位矩阵。 -
@chtz 你不想把你的评论变成答案吗?如果对它的工作原理有一点解释,我很乐意接受。
标签: c++ sparse-matrix linear-algebra eigen