本征:获得稀疏矩阵的核

时间:2019-02-19 12:29:18

标签: c++ sparse-matrix linear-algebra eigen

给定稀疏矩阵A和向量b,我想获得方程x的解A * x = b以及{{1 }}。

一种可能性是convert A进行密集表示。

A

是否可以直接在稀疏表示中执行相同操作?除了FullPivLu之外,我在任何地方都找不到函数#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; }

1 个答案:

答案 0 :(得分:0)

我认为@chtz的答案几乎是正确的,除了我们需要使用最后的A.cols()-qr.rank()列。这是一个数学推导。

假设我们对矩阵Aᵀ做QR分解

A p * P = [Q Q 2] * [R; 0] =Q₁* R

其中P是置换矩阵,因此

Aᵀ=Q₁* R *P⁻¹。

我们可以看到Range(Aᵀ)= Range(Q₁* R *P⁻¹)= Range(Q₁)(因为P和R都是可逆的)。

由于Aᵀ和Q₁具有相同的范围空间,这意味着A和Q₁ᵀ也将具有相同的零空间,即Null(A)= Null(Q₁ᵀ)。 (在这里,我们使用以下属性:Range(M)和Null(Mᵀ)对于任何矩阵M都是互补的,因此Null(A)= complement(Range(Aᵀ))= complement(Range(Q₁) )= Null(Q₁ᵀ))。

另一方面,由于矩阵[Q 1 Q 2]是正交的,所以Null(Q 1)=范围(Q 2),因此Null(A)=范围(Q 2),即核(A)= Q 2。 >

由于Q²是正确的A.cols()-qr.rank()列,因此您可以调用rightCols(A.cols() - qr.rank())来检索A的内核。

有关内核空间的更多信息,您可以参考https://en.wikipedia.org/wiki/Kernel_(linear_algebra)