我想找到与某个X矩阵最接近的正定矩阵。
但是我很难将其翻译成Eigen的答案。我尝试了以下方法:
Matrix<double, 9, 9> X, D, DPLUS, Z, Y;
X.setRandom();
Y = 0.5 * (X + X.transpose().eval());
EigenSolver<Matrix<double, 9, 9>> es;
es.compute(Y);
D = es.eigenvalues().asDiagonal();
DPlus = D.cwiseMax(0);
Z = es.eigenvectors() * DPLUS * es.eigenvectors().transpose().eval();
这给了我一个复杂问题的错误,但这是否与链接的答案所暗示的内容一致?
这非常简单。由于矩阵Y在构造上是对称的,因此您需要使用SelfAdjointEigenSolver
,因为这种对称性保证您的真实矩阵是对角线化的,并具有真实的特征值和特征向量。一般的EigenSolver
没有做这个假设,因此在这种情况下不起作用。
这将为您提供本征值和本征向量,可用于构造正交基础矩阵Q。
const MatrixXd Y = 0.5 * (X + X.transpose());
const SelfAdjointEigenSolver<MatrixXd> solver(Y);
const VectorXd D = solver.eigenvalues();
const MatrixXd Q = solver.eigenvectors();
const VectorXd Dplus = D.cwiseMax(0);
const MatrixXd Z = Q * Dplus.asDiagonal() * Q.transpose();
当然,如果您喜欢单线,可以随时将其缩短为
const SelfAdjointEigenSolver<MatrixXd> solver(0.5 * (X + X.transpose()));
const MatrixXd Z = solver.eigenvectors() * solver.eigenvalues().cwiseMax(0).asDiagonal() * solver.eigenvectors().transpose();