fork(2) download
  1. #include <iostream>
  2. #include <array>
  3.  
  4. template <size_t N, size_t M>
  5. struct Matrix {
  6. std::array<std::array<double, M>, N> data_;
  7.  
  8. std::array<double, M>& operator [] (size_t index) {
  9. return data_[index];
  10. }
  11. std::array<double, M> operator [] (size_t index) const {
  12. return const_cast<Matrix&>(*this)[index];
  13. }
  14.  
  15. template <size_t I, size_t J, size_t K>
  16. friend Matrix<I,K> operator* (const Matrix<I,J>&, const Matrix<J,K>&);
  17. };
  18.  
  19. template <size_t Size>
  20. struct Vector : public Matrix <1,Size> {
  21. double& operator [] (size_t index) {
  22. return Matrix<1,Size>::data_[0][index];
  23. }
  24. double operator [] (size_t index) const {
  25. return const_cast<Vector&>(*this)[index];
  26. }
  27. };
  28.  
  29. template <size_t I, size_t J, size_t K>
  30. Matrix<I,K> operator* (const Matrix<I,J>& lhs, const Matrix<J,K>& rhs) {
  31. Matrix<I,K> r;
  32. for (size_t i=0; i < I; ++i)
  33. for (size_t k=0; k < K; ++k) {
  34. r[i][k]=0;
  35. for (size_t j=0; j < J; ++j)
  36. r[i][k] += lhs[i][j]*rhs[j][k];
  37. }
  38.  
  39. return r;
  40. }
  41.  
  42. template <typename T, size_t N>
  43. std::ostream& operator <<(std::ostream& os, const std::array<T,N>& a) {
  44. os << '(';
  45. size_t i=0;
  46. for (auto x: a) {
  47. if (i++ != 0) os << ',';
  48. os << x;
  49. }
  50. os << ')';
  51. return os;
  52. }
  53.  
  54. template <size_t N, size_t M>
  55. std::ostream& operator <<(std::ostream& os, const Matrix<N,M>& m) {
  56. return os << m.data_;
  57. }
  58.  
  59. int main() {
  60. Vector<3> v;
  61. v[0] = 1; v[1] = 2; v[2] = 3;
  62. std::cout << "v=" << v << std::endl;
  63.  
  64. Matrix<3,2> m;
  65. m[0][0]=1;m[0][1]=2;
  66. m[1][0]=3;m[1][1]=4;
  67. m[2][0]=5;m[2][1]=6;
  68. std::cout << "m=" << m << std::endl;
  69.  
  70. Matrix<2,4> m1;
  71. m1[0][0]=1;m1[0][1]=2;m1[0][2]=3;m1[0][3]=4;
  72. m1[1][0]=5;m1[1][1]=6;m1[1][2]=7;m1[1][3]=8;
  73. std::cout << "m1=" << m1 << std::endl;
  74.  
  75. std::cout << "m*m1=" << m*m1 << std::endl;
  76. std::cout << "v*m=" << v*m << std::endl;
  77. }
Success #stdin #stdout 0s 3344KB
stdin
Standard input is empty
stdout
v=((1,2,3))
m=((1,2),(3,4),(5,6))
m1=((1,2,3,4),(5,6,7,8))
m*m1=((11,14,17,20),(23,30,37,44),(35,46,57,68))
v*m=((22,28))