簡體   English   中英

如何用特征庫計算零空間的基礎?

[英]How to compute basis of nullspace with Eigen library?

如何用特征庫計算矩陣零空間基礎

我試圖找到顯式函數名來計算空基,並且作為一種變通方法,找到計算矩陣的rref的方法(因為我們能夠從rref得到空基)。

但我找不到任何相關的函數名稱。

我認為必須有解決方案,但我不太了解Eigen庫和Eigen的代碼也很難理解。

請建議我解決這個問題的方法。

您可以使用Eigen :: FullPivLU :: kernel()方法獲得null空間的基礎:

FullPivLU<MatrixXd> lu(A);
MatrixXd A_null_space = lu.kernel();

替代方法:使用OpenCV計算空間:

`
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。 此代碼使用矩陣的四個基本子空間(谷歌四個基本子空間和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';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM