00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "InverseMatrix.hpp"
00025
00026 namespace kn{
00027
00028 Matrix<double> inverseMatrixSVD(const Matrix<double>& m){
00029
00030 if(m.rows() != m.columns())
00031 throw MathException("The input matrix is not a square matrix" ,"inverseMatrixSVD");
00032
00033
00034 Matrix<double> u(m);
00035 Matrix<double> v(m.columns(),m.columns());
00036 Vector<double> d(m.columns());
00037
00038 decompositionSVD(u,d,v);
00039
00040 u.transpose();
00041
00042 const double delta = 1.0e-12;
00043 for(unsigned int i=0; i<d.size(); i++){
00044 if(std::fabs(d[i]) > delta)
00045 d[i] = 1.0/d[i];
00046 else
00047 d[i] = 0.0;
00048 }
00049
00050 Matrix<double> dinverse(d.size(),d.size());
00051 dinverse.setZero();
00052 dinverse.setDiagonal(d);
00053
00054 return v*dinverse*u;
00055 }
00056
00057 Matrix<double> pseudoInverseMatrixSVD(const Matrix<double>& m){
00058
00059 Matrix<double> mtrans(m);
00060 mtrans.transpose();
00061
00062 Matrix<double> inverse(inverseMatrixSVD(mtrans*m));
00063
00064 return inverse*mtrans;
00065 }
00066
00067
00068 Matrix<double> inverseMatrixGaussianElimination(const Matrix<double>& m, const bool total){
00069 kn::Matrix<double> inverse(m.rows(), m.columns());
00070 gaussianEliminationInverseMatrix(m,inverse,total);
00071 return inverse;
00072 }
00073
00074 Matrix<double> pseudoInverseMatrixGaussianElimination(const Matrix<double>& m, const bool total){
00075 Matrix<double> mTranspose(m);
00076 mTranspose.transpose();
00077
00078 Matrix<double> inverse(inverseMatrixGaussianElimination(mTranspose*m, total));
00079
00080 return inverse*mTranspose;
00081 }
00082
00083 }
00084