SHARE
TWEET

Matrix

a guest Feb 15th, 2015 25 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. class Matrix
  7. {
  8. public:
  9.     Matrix(int n = 2, int val = 0) : n(n)
  10.     {
  11.         elements = new int*[n];
  12.         for (int i = 0; i < n; i++)
  13.         {
  14.             elements[i] = new int[n];
  15.             for (int j = 0; j < n; j++)
  16.                 elements[i][j] = val;
  17.         }
  18.     }
  19.  
  20.     // конструктор копирования. Особый конструктор для случаем такого типа:
  21.     // Matrix a(5, 2);
  22.     // Matrix b(a); - будет вызван конструктор копирования
  23.     // Конструктор копирования всегда принимает константную ссылку на объект
  24.     Matrix(const Matrix & other) : n(other.n)
  25.     {
  26.         elements = new int*[n];
  27.         for (int i = 0; i < n; i++)
  28.         {
  29.             elements[i] = new int[n];
  30.             for (int j = 0; j < n; j++)
  31.                 elements[i][j] = other.elements[i][j];
  32.         }
  33.     }
  34.  
  35.     ~Matrix()
  36.     {
  37.         for (int i = 0; i < n; i++)
  38.             delete [] elements[i];
  39.         delete [] elements;
  40.     }
  41.  
  42.     int getN() const
  43.     {
  44.         return n;
  45.     }
  46.  
  47.     int & at(int i, int j)
  48.     {
  49.         return elements[i][j];
  50.     }
  51.  
  52.     int at(int i, int j) const
  53.     {
  54.         return elements[i][j];
  55.     }
  56.  
  57.     // Оператор = возвращает ссылку на сам объект. Это нужно для обработки выражений вида
  58.     // a = b = c;
  59.     // Сначала будет обработан вызов b.operator=(c), который вернёт при этом новое значение b,
  60.     // Которое послужит аргументом в вызове a.operator=( b.operator=(c) );
  61.     Matrix & operator =(const Matrix & right)
  62.     {
  63.         for (int i = 0; i < n; i++)
  64.             for (int j = 0; j < n; j++)
  65.                 elements[i][j] = right.elements[i][j];
  66.         return *this;
  67.     }
  68.  
  69.     Matrix operator +(const Matrix & a) const
  70.     {
  71.         Matrix res(a.n);
  72.         for (int i = 0; i < n; i++)
  73.             for (int j = 0; j < n; j++)
  74.                 res.elements[i][j] = a.elements[i][j] + elements[i][j];
  75.         return res; // в этот момент будет использован оператор = для Matrix
  76.     }
  77.  
  78.     Matrix operator *(const Matrix & a) const
  79.     {
  80.         Matrix res(a.n);
  81.         for (int i = 0; i < n; i++) // строки
  82.             for (int j = 0; j < n; j++) //столбцы
  83.                 for (int k = 0; k < n; k++) //элементы
  84.                     res.elements[i][j] += elements[i][k] * a.elements[k][j];
  85.         return res; // в этот момент будет использован оператор = для Matrix
  86.     }
  87.  
  88.     vector<int> operator *(const vector<int> v) const
  89.     {
  90.         vector<int> res(n);
  91.         for (int i = 0; i < n; i++) // строки
  92.             for (int k = 0; k < n; k++) //элементы
  93.                 res[i] += elements[i][k] * v[k];
  94.         return res;
  95.     }
  96.  
  97.     friend Matrix pow(const Matrix & a, int p);
  98.  
  99. private:
  100.     int n;
  101.     int **elements;
  102. };
  103.  
  104.  
  105. Matrix pow(const Matrix & a, int p)
  106. {
  107.     Matrix res(a.n);
  108.     for (int i = 0; i < a.n; i++)
  109.         res.elements[i][i] = 1;
  110.  
  111.     Matrix current(a); // будет вызван конструктор копирования
  112.  
  113.     while (p)
  114.     {
  115.         if (p & 1)
  116.         {
  117.             res = res * current;
  118.         }
  119.  
  120.         current = current * current;
  121.  
  122.         p >>= 1;
  123.     }
  124.  
  125.     return res; // в этот момент будет использован оператор = для Matrix
  126. }
  127.  
  128.  
  129. int main()
  130. {
  131.     Matrix a(2);
  132.     a.at(0, 0) = 1;
  133.     a.at(0, 1) = 1;
  134.     a.at(1, 0) = 1;
  135.  
  136.     for (int i = 0; i <= 20; i++)
  137.     {
  138.         Matrix b = pow(a, i);
  139.  
  140.         vector <int> fib(2, 1);
  141.         fib = b * fib;
  142.  
  143.         cout << "F[" << i << "] = " << fib[1] << endl;
  144.  
  145.         // в этот момент вызывается деструктор матрицы b
  146.     }
  147.  
  148.     return 0;
  149. }
RAW Paste Data
Top