使用本征查找最近的正定矩阵

问题描述 投票:0回答:1

我想找到与某个X矩阵最接近的正定矩阵。

我在这里看到了这个答案:https://scicomp.stackexchange.com/questions/30631/how-to-find-the-nearest-a-near-positive-definite-from-a-given-matrix

但是我很难将其翻译成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();

这给了我一个复杂问题的错误,但这是否与链接的答案所暗示的内容一致?

c++ matrix eigen
1个回答
0
投票

这非常简单。由于矩阵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();
© www.soinside.com 2019 - 2024. All rights reserved.