如何用特征库计算零空间的基础?

Jae*_*LEE 2 c++ linear-algebra eigen

如何用特征库计算矩阵零空间基础

我试图找到显式函数名来计算空基,并且作为一种变通方法,找到计算矩阵的rref的方法(因为我们能够从rref得到空基).

但我找不到任何相关的函数名称.

我认为必须有解决方案,但我不太了解Eigen库和Eigen的代码也很难理解.

请建议我解决这个问题的方法.

gga*_*ael 8

您可以使用Eigen :: FullPivLU :: kernel()方法获得null空间的基础:

FullPivLU<MatrixXd> lu(A);
MatrixXd A_null_space = lu.kernel();
Run Code Online (Sandbox Code Playgroud)


小智 5

FullPivLU 在 Eigen 中计算成本最高,http://eigen.tuxfamily.org/dox/group__DenseDecompositionBenchmark.html

更快的替代方法是使用 CompleteOrthogonalDecomposition。此代码使用矩阵的四个基本子空间(谷歌四个基本子空间和 URV 分解):

Matrix<double, Dynamic, Dynamic> mat37(3,7);
mat37 = MatrixXd::Random(3, 7);

CompleteOrthogonalDecomposition<Matrix<double, Dynamic, Dynamic> > cod;
cod.compute(mat37);
cout << "rank : " << cod.rank() << "\n";
// Find URV^T
MatrixXd V = cod.matrixZ().transpose();
MatrixXd Null_space = V.block(0, cod.rank(),V.rows(), V.cols() - cod.rank());
MatrixXd P = cod.colsPermutation();
Null_space = P * Null_space; // Unpermute the columns
// The Null space:
std::cout << "The null space: \n" << Null_space << "\n" ;
// Check that it is the null-space:
std::cout << "mat37 * Null_space = \n" << mat37 * Null_space  << '\n';
Run Code Online (Sandbox Code Playgroud)