Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _USE_MATH_DEFINES
- #include <cmath>
- #include <iostream>
- #include <iomanip>
- #include <vector>
- using namespace std;
- template <int n>
- class Matrix
- {
- public:
- Matrix(int val = 0)
- {
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++)
- elements[i][j] = val;
- }
- // конструктор копирования. Особый конструктор для случаем такого типа:
- // Matrix a(5, 2);
- // Matrix b(a); - будет вызван конструктор копирования
- // Конструктор копирования всегда принимает константную ссылку на объект
- Matrix(const Matrix & other)
- {
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++)
- elements[i][j] = other.elements[i][j];
- }
- int & at(int i, int j)
- {
- return elements[i][j];
- }
- int at(int i, int j) const
- {
- return elements[i][j];
- }
- // Оператор = возвращает ссылку на сам объект. Это нужно для обработки выражений вида
- // a = b = c;
- // Сначала будет обработан вызов b.operator=(c), который вернёт при этом новое значение b,
- // Которое послужит аргументом в вызове a.operator=( b.operator=(c) );
- Matrix & operator =(const Matrix & right)
- {
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++)
- elements[i][j] = right.elements[i][j];
- return *this;
- }
- Matrix operator +(const Matrix & a) const
- {
- Matrix res;
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++)
- res.elements[i][j] = a.elements[i][j] + elements[i][j];
- return res; // в этот момент будет использован оператор = для Matrix
- }
- Matrix operator *(const Matrix & a) const
- {
- Matrix res;
- for (int i = 0; i < n; i++) // строки
- for (int j = 0; j < n; j++) //столбцы
- for (int k = 0; k < n; k++) //элементы
- res.elements[i][j] += elements[i][k] * a.elements[k][j];
- return res; // в этот момент будет использован оператор = для Matrix
- }
- vector<int> operator *(const vector<int> v) const
- {
- vector<int> res(n);
- for (int i = 0; i < n; i++) // строки
- for (int k = 0; k < n; k++) //элементы
- res[i] += elements[i][k] * v[k];
- return res;
- }
- class MatrixString
- {
- public:
- MatrixString (int * p, int n) : p(p), n(n) {}
- int & operator [](int i)
- {
- if (i >= n)
- throw exception("Wrong index");
- return p[i];
- }
- int operator [](int i) const
- {
- if (i >= n)
- throw exception("Wrong index");
- return p[i];
- }
- private:
- int * p, n;
- };
- MatrixString operator [](int i)
- {
- if (i >= n)
- throw exception("Wrong index");
- return MatrixString( (int*)elements + i*n, n );
- }
- template <int n>
- friend Matrix pow(const Matrix <n> & a, int p)
- {
- Matrix <n> res;
- for (int i = 0; i < n; i++)
- res.elements[i][i] = 1;
- Matrix current(a); // будет вызван конструктор копирования
- while (p)
- {
- if (p & 1)
- {
- res = res * current;
- }
- current = current * current;
- p >>= 1;
- }
- return res; // в этот момент будет использован оператор = для Matrix
- }
- private:
- int elements[n][n];
- };
- int main()
- {
- Matrix<2> a;
- try
- {
- a[0][2] = 1;
- a[0][1] = 1;
- a[1][0] = 1;
- }
- catch (const exception & e)
- {
- cout << e.what();
- return 1;
- }
- for (int i = 0; i <= 20; i++)
- {
- Matrix<2> b = pow(a, i);
- vector <int> fib(2, 1);
- fib = b * fib;
- cout << "F[" << i << "] = " << fib[1] << endl;
- // в этот момент вызывается деструктор матрицы b
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement