Advertisement
MaximCherchuk

Matrices

May 14th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.12 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. class matrix {
  7. public:
  8.     matrix();
  9.     matrix(const matrix &orig);
  10.    
  11.     int first_dimension();
  12.     int second_dimension();
  13.    
  14.     bool can_multiply(matrix &cpy);
  15.     bool can_add(matrix &cpy);
  16.     bool can_subtract(matrix &cpy);
  17.    
  18.     void multiply(matrix &cpy);
  19.     void multiply_by_scalar(const double c);
  20.     void add(matrix &cpy);
  21.     void subtract(matrix &cpy);
  22.     // debug
  23.     void input();
  24.     void output();
  25. private:
  26.     vector<vector<double> > m;
  27. };
  28.  
  29. void matrix::input() {
  30.     int x, y;
  31.     cin >> x >> y;
  32.     m.resize(x, vector<double>(y));
  33.     for(int i = 0; i < x; ++i) {
  34.         for(int j = 0; j < y; ++j) {
  35.             cin >> m[i][j];
  36.         }
  37.     }
  38. }
  39.  
  40. void matrix::output() {
  41.     for(int i = 0; i < first_dimension(); ++i) {
  42.         for(int j = 0; j < second_dimension(); ++j) {
  43.             cout << m[i][j] << ' ';
  44.         }
  45.         cout << endl;
  46.     }
  47. }
  48.  
  49. matrix::matrix() {}
  50.  
  51. matrix::matrix(const matrix &orig) {
  52.     this->m = orig.m;
  53. }
  54.  
  55. int matrix::first_dimension() {
  56.     return m.size();
  57. }
  58.  
  59. int matrix::second_dimension() {
  60.     return m[0].size();
  61. }
  62.  
  63. bool matrix::can_multiply(matrix &cpy) {
  64.     if(m[0].size() == cpy.first_dimension()) {
  65.         return true;
  66.     }
  67.     return false;
  68. }
  69.  
  70. bool matrix::can_add(matrix &cpy) {
  71.     if(m.size() == cpy.first_dimension()
  72.        && m[0].size() == cpy.second_dimension()) {
  73.         return true;
  74.     }
  75.     return false;
  76. }
  77.  
  78. bool matrix::can_subtract(matrix &cpy) {
  79.     if(m.size() == cpy.first_dimension()
  80.        && m[0].size() == cpy.second_dimension()) {
  81.         return true;
  82.     }
  83.     return false;
  84. }
  85.  
  86. void matrix::multiply_by_scalar(const double c) {
  87.     for(int i = 0; i < m.size(); ++i) {
  88.         for(int j = 0; j < m[i].size(); ++j) {
  89.             m[i][j] *= c;
  90.         }
  91.     }
  92. }
  93.  
  94. void matrix::add(matrix &cpy) {
  95.     if(m.size() != cpy.first_dimension() || m[0].size() != cpy.second_dimension()) {
  96.         cerr << "Entfin can happen C:";
  97.         return;
  98.     }
  99.     for(int i = 0; i < m.size(); ++i) {
  100.         for(int j = 0; j < m[i].size(); ++j) {
  101.             m[i][j] += cpy.m[i][j];
  102.         }
  103.     }
  104. }
  105.  
  106. void matrix::subtract(matrix &cpy) {
  107.     if(m.size() != cpy.first_dimension() || m[0].size() != cpy.second_dimension()) {
  108.         cerr << "Entfin can happen C:";
  109.         return;
  110.     }
  111.     for(int i = 0; i < m.size(); ++i) {
  112.         for(int j = 0; j < m[i].size(); ++j) {
  113.             m[i][j] -= cpy.m[i][j];
  114.         }
  115.     }
  116. }
  117.  
  118. void matrix::multiply(matrix &cpy) {
  119.     if(!this->can_multiply(cpy)) {
  120.         cerr << "Entfin can happen C:";
  121.         return;
  122.     }
  123.     vector<vector<double> > newm(m.size(), vector<double>(cpy.m[0].size()));
  124.     for(int i = 0; i < m.size(); ++i) {
  125.         for(int j = 0; j < cpy.m[0].size(); ++j) {
  126.             for(int k = 0; k < m[i].size(); ++k) {
  127.                 newm[i][j] += m[i][k] * cpy.m[k][j];
  128.             }
  129.         }
  130.     }
  131.     m = newm;
  132. }
  133.  
  134. int main() {
  135.     // usage example
  136.     matrix a;
  137.     matrix e;
  138.     a.input();
  139.     e.input();
  140.     a.subtract(e);
  141.     a.output();
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement