如何使用 Eigen 库计算零空间的基础?
How to compute basis of nullspace with Eigen library?
如何使用 Eigen 库计算矩阵的零空间的基?
我试图找到显式函数名称来计算空基,并且作为解决方法,找到了计算矩阵的 rref 的方法(因为我们能够从 rref 获得空基础)。
但是我找不到任何相关的函数名称。
我想一定有解决办法,但我对Eigen库了解不多,Eigen的代码也很难看懂。
请给我建议这个问题的解决方案。
您可以使用 Eigen::FullPivLU::kernel() 方法获得空值 space 的基础:
FullPivLU<MatrixXd> lu(A);
MatrixXd A_null_space = lu.kernel();
备选方案:使用 OpenCV 计算 null space:
`
cv::Mat EpipolarConstraint::getNullSpace(cv::Mat p)
{
cv::SVD svd = cv::SVD(p, cv::SVD::FULL_UV);
cv::Mat vt_ = svd.vt;
int i;
for (i = 1; i <= 3; i++)
{
if (p.at<double>(i - 1, i - 1) == 0)
{
break;
}
}
cv::Mat result = vt_(cv::Rect(0, i-1, p.cols, vt_.rows-i+1));
cv::Mat result_t;
cv::transpose(result, result_t);
return result_t;
}`
FullPivLU 在 Eigen 中的计算成本最高,http://eigen.tuxfamily.org/dox/group__DenseDecompositionBenchmark.html。
更快的替代方法是使用 CompleteOrthogonalDecomposition。此代码使用矩阵的四个基本子空间(google 四个基本子空间和 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';
如何使用 Eigen 库计算矩阵的零空间的基?
我试图找到显式函数名称来计算空基,并且作为解决方法,找到了计算矩阵的 rref 的方法(因为我们能够从 rref 获得空基础)。
但是我找不到任何相关的函数名称。
我想一定有解决办法,但我对Eigen库了解不多,Eigen的代码也很难看懂。
请给我建议这个问题的解决方案。
您可以使用 Eigen::FullPivLU::kernel() 方法获得空值 space 的基础:
FullPivLU<MatrixXd> lu(A);
MatrixXd A_null_space = lu.kernel();
备选方案:使用 OpenCV 计算 null space:
`
cv::Mat EpipolarConstraint::getNullSpace(cv::Mat p)
{
cv::SVD svd = cv::SVD(p, cv::SVD::FULL_UV);
cv::Mat vt_ = svd.vt;
int i;
for (i = 1; i <= 3; i++)
{
if (p.at<double>(i - 1, i - 1) == 0)
{
break;
}
}
cv::Mat result = vt_(cv::Rect(0, i-1, p.cols, vt_.rows-i+1));
cv::Mat result_t;
cv::transpose(result, result_t);
return result_t;
}`
FullPivLU 在 Eigen 中的计算成本最高,http://eigen.tuxfamily.org/dox/group__DenseDecompositionBenchmark.html。
更快的替代方法是使用 CompleteOrthogonalDecomposition。此代码使用矩阵的四个基本子空间(google 四个基本子空间和 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';