Matlab有一个功能:
Z = null(A);
该MATLAB函数是获得的A的零空间的标准正交基 来自奇异值分解。
我必须在特征库中将MATLAB代码转换为C ++,但我不知道如何做到这一点。 我试过了:
MatrixXf m = MatrixXf::Random(3,5);
cout << "Here is the matrix m:" << endl << m << endl;
MatrixXf ker = m.fullPivLu().kernel();
cout << "Here is a matrix whose columns form a basis of the kernel of m:"
<< endl << ker << endl;
输出:
Here is the matrix m:
0.68 0.597 -0.33 0.108 -0.27
-0.211 0.823 0.536 -0.0452 0.0268
0.566 -0.605 -0.444 0.258 0.904
Here is a matrix whose columns form a basis of the kernel of m:
-0.219 0.763
0.00335 -0.447
0 1
1 0
-0.145 -0.285
它不是&#34; orthonormal&#34;零空间的基础。
答案 0 :(得分:0)
您可以使用CompleteOrthogonalDecomposition
获得零空间的正交基础:
template <typename Number> // 'Number' can be 'double' or 'std::complex<double>'
Eigen::Matrix<Number, Eigen::Dynamic, Eigen::Dynamic> kernel_COD(
const Eigen::Matrix<Number, Eigen::Dynamic, Eigen::Dynamic>& M) {
Eigen::CompleteOrthogonalDecomposition<
Eigen::Matrix<Number, Eigen::Dynamic, Eigen::Dynamic>>
cod;
cod.compute(M);
unsigned rk = cod.rank();
Eigen::Matrix<Number, Eigen::Dynamic, Eigen::Dynamic> P =
cod.colsPermutation();
Eigen::Matrix<Number, Eigen::Dynamic, Eigen::Dynamic> V =
cod.matrixZ().transpose();
Eigen::Matrix<Number, Eigen::Dynamic, Eigen::Dynamic> Kernel =
P * V.block(0, rk, V.rows(), V.cols() - rk);
return Kernel;
}