Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "ldl_solver_eigen.hpp"
00023
00024 namespace KDL{
00025
00026 int ldl_solver_eigen(const Eigen::MatrixXd& A, const Eigen::VectorXd& v, Eigen::MatrixXd& L, Eigen::VectorXd& D, Eigen::VectorXd& vtmp, Eigen::VectorXd& q)
00027 {
00028 const int n = A.rows();
00029 int error=SolverI::E_NOERROR;
00030
00031
00032 if(A.cols()!=n || v.rows()!=n || L.rows()!=n || L.cols()!=n || D.rows()!=n || vtmp.rows()!=n || q.rows()!=n)
00033 return (error = SolverI::E_SIZE_MISMATCH);
00034
00035 for(int i=0;i<n;++i) {
00036 D(i)=A(i,i);
00037 if(i>0) {
00038 for(int j=0;j<=i-1;++j)
00039 D(i) -= D(j)*L(i,j)*L(i,j);
00040 }
00041 for(int j=1;j<n;++j) {
00042 if(j>i) {
00043 L(j,i)=A(i,j)/D(i);
00044 if(i>0) {
00045 for(int k=0;k<=i-1;++k)
00046 L(j,i) -= L(j,k)*L(i,k)*D(k)/D(i);
00047 }
00048 }
00049 }
00050 }
00051 for(int i=0;i<n;++i) {
00052 vtmp(i)=v(i);
00053 if(i>0) {
00054 for(int j=0;j<=i-1;++j)
00055 vtmp(i) -= L(i,j)*vtmp(j);
00056 }
00057 }
00058 for(int i=n-1;i>=0;--i) {
00059 q(i)=vtmp(i)/D(i);
00060 if(i<n-1) {
00061 for(int j=i+1;j<n;++j)
00062 q(i) -= L(j,i)*q(j);
00063 }
00064 }
00065
00066
00067 for(int i=0;i<n;++i) {
00068 L(i,i) = 1.;
00069 }
00070
00071
00072 if ( n > 1 )
00073 {
00074 for(int i=0;i<n;++i) {
00075 for(int j=i+1;j<n;++j) {
00076 L(i,j) = 0.0;
00077 }
00078 }
00079 }
00080 return(error);
00081 }
00082 }