| [eigen] Problem with LU and Cholesky inversion |
[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]
|
Hello list, after running into numerical trouble when implementing a convex optimizer, I wrote this small test (see attachment). It inverses a positive semidefinite matrix using all the methods available in eigen. Can you tell me if I am doing a mistake here or if it exposes a bug in LU and Cholesky modules? Thanks in advance Tim Hunter -- Timothy Hunter Student (Stanford University) T. 404 421 3075 |
#include <Eigen/Core>
#include <Eigen/LU>
#include <Eigen/QR>
#include <Eigen/Cholesky>
#include <Eigen/Array>
#include <Eigen/SVD>
#include <iostream>
using namespace Eigen;
using namespace std;
template<typename Scalar, int N, int M>
void testLU1(int n, int m)
{
typedef Matrix<Scalar, N, 1> VectorType;
typedef Matrix<Scalar, N, N> MatrixType;
typedef Matrix<Scalar, M, 1> CVectorType;
typedef Matrix<Scalar, M, N> CMatrixType;
typedef Matrix<Scalar, N, M> DMatrixType;
MatrixType hessian=MatrixType::Random(n,n);
hessian*=hessian.transpose();
CMatrixType A=CMatrixType::Random(m,n);
DMatrixType V1(n,m);
Eigen::LU<MatrixType> hessianLU(hessian);
hessianLU.solve(A.transpose(),&V1);
std::cout<<"\nLU-------\n"<<hessian*V1-A.transpose()<<"\n-------\n";
DMatrixType V2(n,m);
Eigen::CholeskyWithoutSquareRoot<MatrixType> hessianChol(hessian);
V2=hessianChol.solve(A.transpose());
std::cout<<"\nChol-------\n"<<hessian*V2-A.transpose()<<"\n-------\n";
DMatrixType V3=hessian.inverse()*A.transpose();
std::cout<<"\nINV-------\n"<<hessian*V3-A.transpose()<<"\n-------\n";
DMatrixType V4(n,m);
Eigen::SVD<MatrixType> hessianSVD(hessian);
hessianSVD.solve(A.transpose(),&V4);
std::cout<<"\nSVD-------\n"<<hessian*V4-A.transpose()<<"\n-------\n";
std::cout<<"\n-------\n"<<V3-V2<<"\n-------\n";
}
template<typename Scalar, int N, int M>
void testChol1(int n, int m)
{
typedef Matrix<Scalar, N, 1> VectorType;
typedef Matrix<Scalar, N, N> MatrixType;
typedef Matrix<Scalar, M, 1> CVectorType;
typedef Matrix<Scalar, M, N> CMatrixType;
typedef Matrix<Scalar, N, M> DMatrixType;
MatrixType hessian=MatrixType::Random(n,n);
hessian*=hessian.transpose();
CMatrixType A=CMatrixType::Random(m,n);
DMatrixType V2(n,m);
Eigen::CholeskyWithoutSquareRoot<MatrixType> hessianChol(hessian);
std::cout<<"\nChol-------\n"<<hessianChol.matrixL()<<"\n-------\n";
std::cout<<"\nChol-------\n"<<hessianChol.vectorD()<<"\n-------\n";
MatrixType chol2=hessianChol.matrixL()*(hessianChol.vectorD().asDiagonal())*hessianChol.matrixL().transpose();
std::cout<<"\nChol-------\n"<<hessian-chol2<<"\n-------\n";
V2=hessianChol.solve(A.transpose());
std::cout<<"\nChol-------\n"<<hessian*V2-A.transpose()<<"\n-------\n";
}
int main(int argc, char **argv)
{
std::cout<<"##Static (10,2)##\n";
testChol1<double, 10, 2>(10,2);
std::cout<<"##Dynamic (10,2)##\n";
testChol1<double, Eigen::Dynamic, Eigen::Dynamic>(10,2);
std::cout<<"##Static (10,2)##\n";
testLU1<double, 10, 2>(10,2);
std::cout<<"##Dynamic (10,2)##\n";
testLU1<double, Eigen::Dynamic, Eigen::Dynamic>(10,2);
/* std::cout<<"##Static (5,2)##\n";
testLU1<double, 5, 2>(5,2);
std::cout<<"##Dynamic (5,2)##\n";
testLU1<double, Eigen::Dynamic, Eigen::Dynamic>(5,2);*/
return 0;
}
| Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |