#ifndef CHOLESKY_H #define CHOLESKY_H #include #include namespace ub = boost::numeric::ublas; struct Cholesky { /// Given a positive definite matrix A, returns A = L.L^t Cholesky(ub::matrix<double>& mat) : _n(mat.size1()), _el(mat) { ub::vector<double> tmp; if (_el.size2() != _n) throw("need square matrix"); for (unsigned int i = 0; i < _n; ++i) { for (unsigned int j = i; j < _n; ++j) { double sum = _el(i, j); for (int k = i - 1; k >= 0; --k) sum -= _el(i, k) * _el(j, k); if (i == j) { if (sum <= 0) throw("need semi positive definite matrix"); _el(i, i) = sqrt(sum); } else _el(j, i) = sum / _el(i, i); } } for (unsigned int i = 0; i < _n; ++i) for (unsigned int j = i; j < _n; ++j) _el(j, i) = 0; } unsigned int _n; ub::matrix<double>& _el; }; #endif //CHOLESKY_H int main() { ub::matrix<double> mat; Cholesky c(mat); return 0; }
#ifndef CHOLESKY_H #define CHOLESKY_H #include #include namespace ub = boost::numeric::ublas; struct Cholesky { /// Given a positive definite matrix A, returns A = L.L^t Cholesky(ub::matrix<double>& mat) : _n(mat.size1()), _el(mat) { ub::vector<double> tmp; if (_el.size2() != _n) throw("need square matrix"); for (unsigned int i = 0; i < _n; ++i) { for (unsigned int j = i; j < _n; ++j) { double sum = _el(i, j); for (int k = i - 1; k >= 0; --k) sum -= _el(i, k) * _el(j, k); if (i == j) { if (sum <= 0) throw("need semi positive definite matrix"); // Penser à lancer une "vraie" exception plutôt qu'un char*... _el(i, i) = sqrt(sum); } else _el(j, i) = sum / _el(i, i); } } for (unsigned int i = 0; i < _n; ++i) for (unsigned int j = i; j < _n; ++j) _el(j, i) = 0; } unsigned int _n; ub::matrix<double>& _el; }; #endif //CHOLESKY_H int main() { ub::matrix<double> mat(2,2); try { Cholesky c(mat); } catch (const char* err) { std::cerr << "Error is: " << err << std::endl; return 1; } return 0; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question#ifndef CHOLESKY_H #define CHOLESKY_H #include <exception> #include #include namespace ub = boost::numeric::ublas; class CholeskyException: public std::exception { public: CholeskyException(const std::string& msg) : _msg(msg) { } virtual ~CholeskyException() throw() { } virtual const char* what() const throw() { return _msg.c_str(); } private: const std::string _msg; }; class Cholesky { public: /// Given a positive definite matrix A, returns A = L.L^t Cholesky(ub::matrix<double>& mat) : _n(mat.size1()), _el(mat) { ub::vector<double> tmp; if (_el.size2() != _n) throw CholeskyException("need square matrix"); for (unsigned int i = 0; i < _n; ++i) { for (unsigned int j = i; j < _n; ++j) { double sum = _el(i, j); for (int k = i - 1; k >= 0; --k) sum -= _el(i, k) * _el(j, k); if (i == j) { if (sum <= 0) throw CholeskyException("need semi positive definite matrix"); _el(i, i) = sqrt(sum); } else _el(j, i) = sum / _el(i, i); } } for (unsigned int i = 0; i < _n; ++i) for (unsigned int j = i; j < _n; ++j) _el(j, i) = 0; } private: unsigned int _n; ub::matrix<double>& _el; }; #endif //CHOLESKY_H int main() { ub::matrix<double> mat(2,2); try { Cholesky c(mat); } catch (const CholeskyException& err) { std::cerr << "Error is: " << err.what() << std::endl; return 1; } return 0; }