matrix.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "matrix.hpp"
  2. void
  3. Matrix::init(size_t nrow,size_t ncol){
  4. if(data!=nullptr) delete[] data;
  5. nr=nrow;
  6. nc=ncol;
  7. data=new Reel[nr*nc];
  8. }
  9. //---------------
  10. // Matrix::clear
  11. //---------------
  12. void
  13. Matrix::clear(){
  14. for(size_t i=0;i<nr*nc;++i){
  15. data[i]=0;
  16. }
  17. }
  18. void
  19. Matrix::display() const{
  20. /*for(size_t i=0;i<nr;++i){
  21. for(size_t j=0;j<nc;++j){
  22. cout<<get(i,j)<<'\t';
  23. }
  24. cout<<endl;
  25. }*/
  26. }
  27. void
  28. Matrix::swap_lines(size_t i,size_t j){
  29. for(size_t k=0;k<nc;++k){
  30. swap(data[i*nc+k],data[j*nc+k]);
  31. }
  32. }
  33. void
  34. Matrix::mul_line(size_t i,Reel a){
  35. for(size_t k=0;k<nc;++k){
  36. data[i*nc+k]*=a;
  37. }
  38. }
  39. void
  40. Matrix::add_mul_line(size_t i,size_t j,Reel a){
  41. for(size_t k=0;k<nc;++k){
  42. data[i*nc+k]+=a*data[j*nc+k];
  43. }
  44. }
  45. Reel
  46. Matrix::Gauss(){
  47. Reel det=1;
  48. size_t np=0; //np=0
  49. for(size_t j=0;j<nc;++j){
  50. for(size_t p=np;p<nr;++p){
  51. Reel c=get(p,j);
  52. if(c!=0){
  53. det*=c;
  54. mul_line(p,1.0/c);
  55. for(size_t k=0;k<nr;++k){
  56. if(k!=p){
  57. add_mul_line(k,p,-get(k,j));
  58. }
  59. }
  60. if(p!=np){
  61. swap_lines(np,p);
  62. det*=-1;
  63. }
  64. ++np;
  65. break;
  66. }
  67. }
  68. }
  69. return det;
  70. }
  71. Reel
  72. Matrix::get_diag_square_sym(size_t i) const{
  73. Reel res=0;
  74. for(size_t k=0;k<nc;++k){
  75. res+=get(i,k);
  76. }
  77. return res;
  78. }