fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. class Matrix {
  5. private:
  6. int row;
  7. int column;
  8. std::shared_ptr<double> content;
  9. public:
  10.  
  11. Matrix() : row(0), column(0), content(nullptr) {}
  12.  
  13. template<class... A> void set(int row, int column, A... args) {
  14. double *array_content = new double[row * column];
  15. double *p = array_content;
  16. int n = 0;
  17. for (double x : std::initializer_list<double>{args...}) {
  18. *p = x;
  19. p++; n++;
  20. }
  21. while (n < row * column) {
  22. *p = 0.0;
  23. p++; n++;
  24. }
  25. this->content.reset(array_content);
  26. this->row = row;
  27. this->column = column;
  28. }
  29.  
  30. friend std::ostream &operator<<(std::ostream &os, Matrix &m) {
  31. for (int r = 0; r < m.row; r++) {
  32. for (int c = 0; c < m.column; c++) {
  33. os << *(m.content.get() + r * m.column + c) << " ";
  34. }
  35. if (r < m.row - 1) os << std::endl;
  36. }
  37. return os;
  38. }
  39.  
  40. friend Matrix operator*(Matrix &a, Matrix &b) {
  41. Matrix m;
  42. if (a.column != b.row)
  43. return m;
  44. m.row = a.row;
  45. m.column = b.column;
  46. double *array_content = new double[m.row * m.column];
  47. for (int r = 0; r < m.row; r++) {
  48. for (int c = 0; c < m.column; c++) {
  49. double s = 0.0;
  50. for (int k = 0; k < a.column; k++)
  51. s += (*(a.content.get() + r * a.column + k) * *(b.content.get() + k * b.column + c));
  52. *(array_content + r * m.column + c) = s;
  53. }
  54. }
  55. m.content.reset(array_content);
  56. return m;
  57. }
  58.  
  59.  
  60. ~Matrix() {}
  61. };
  62.  
  63. int main() {
  64. Matrix a, b, m;
  65. a.set(2, 2, 1.0, -2.0, 2.0, 3.0);
  66. b.set(2, 2, -2.0, 1.0, 3.0, -1.0);
  67.  
  68. std::cout << a << std::endl;
  69. std::cout << "-------------------------" << std::endl;
  70. std::cout << b << std::endl;
  71. std::cout << "-------------------------" << std::endl;
  72.  
  73. m = a * b;
  74.  
  75. std::cout << m << std::endl;
  76. std::cout << "-------------------------" << std::endl;
  77.  
  78. m = b * a;
  79.  
  80. std::cout << m << std::endl;
  81. std::cout << "-------------------------" << std::endl;
  82.  
  83. return 0;
  84. }
  85. /* end */
  86.  
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
1 -2 
2 3 
-------------------------
-2 1 
3 -1 
-------------------------
-8 3 
5 -1 
-------------------------
0 7 
1 -9 
-------------------------