matrix.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "matrix.hpp"
  2. void
  3. Matrix::init(size_t nrow,size_t ncol){
  4. if(data!=nullptr){
  5. for(size_t i=0;i<nr*nc;++i) mpfr_clear(data[i]);
  6. delete[] data;
  7. }
  8. nr=nrow;
  9. nc=ncol;
  10. data=new mpfr_t[nr*nc];
  11. for(size_t i=0;i<nr*nc;++i) mpfr_init2(data[i],prec);
  12. }
  13. Matrix::~Matrix(){
  14. if(data!=nullptr){
  15. for(size_t i=0;i<nr*nc;++i) mpfr_clear(data[i]);
  16. delete[] data;
  17. }
  18. }
  19. //---------------
  20. // Matrix::clear
  21. //---------------
  22. void
  23. Matrix::clear(){
  24. for(size_t i=0;i<nr*nc;++i) mpfr_set_zero(data[i],0);
  25. }
  26. void
  27. Matrix::swap_lines(size_t i,size_t j){
  28. for(size_t k=0;k<nc;++k){
  29. mpfr_swap(data[i*nc+k],data[j*nc+k]);
  30. }
  31. }
  32. void
  33. Matrix::mul_line(size_t i,mpfr_t x){
  34. for(size_t k=0;k<nc;++k){
  35. mpfr_mul(data[i*nc+k],data[i*nc+k],x,MPFR_RNDN);
  36. }
  37. }
  38. void
  39. Matrix::add_mul_line(size_t i,size_t j,mpfr_t x){
  40. for(size_t k=0;k<nc;++k){
  41. mpfr_fma(data[i*nc+k],data[j*nc+k],x,data[i*nc+k],MPFR_RNDN);
  42. }
  43. }
  44. void
  45. Matrix::Gauss(mpfr_t det){
  46. mpfr_set_ui(det,1,MPFR_RNDN);
  47. mpfr_t c;
  48. mpfr_init2(c,prec);
  49. size_t np=0; //np=0
  50. for(size_t j=0;j<nc;++j){
  51. for(size_t p=np;p<nr;++p){
  52. mpfr_set(c,get(p,j),MPFR_RNDN);
  53. if(mpfr_zero_p(c)==0){
  54. mpfr_mul(det,det,c,MPFR_RNDN);
  55. mpfr_ui_div(c,1,c,MPFR_RNDN);
  56. mul_line(p,c);
  57. for(size_t k=0;k<nr;++k){
  58. if(k!=p){
  59. mpfr_neg(c,get(k,j),MPFR_RNDN);
  60. add_mul_line(k,p,c);
  61. }
  62. }
  63. if(p!=np){
  64. swap_lines(np,p);
  65. mpfr_neg(det,det,MPFR_RNDN);
  66. }
  67. ++np;
  68. break;
  69. }
  70. }
  71. }
  72. }