【模板】矩阵

0AND1STORY

2019-11-13 14:05:18

Personal

矩阵模板,可用于矩阵加速计算: 头文件: ```cpp #ifndef _MATRIX_H_ #define _MATRIX_H_ #include <cstdio> #include <algorithm> template<typename T, size_t _n, size_t _m> class Matrix { public: T _arr[_n][_m]; Matrix(): _arr() {} ~Matrix() {} Matrix(T __arr[_n][_m]): _arr() { for (register size_t i = 0; i < _n; i ++) for (register size_t j = 0; j < _m; j ++) _arr[i][j] = __arr[i][j]; } inline const Matrix& operator=(const Matrix& __cpy) { for (register size_t i = 0; i < _n; i ++) for (register size_t j = 0; j < _m; j ++) _arr[i][j] = __cpy[i][j]; return *this; } inline T* operator[](const size_t& __i) const { return (T*)_arr[__i]; } inline Matrix operator+(const Matrix& __x) { Matrix<T, _n, _m> res; for (register size_t i = 0; i < _n; i ++) for (register size_t j = 0; j < _m; j ++) res[i][j] = _arr[i][j] + __x[i][j]; return res; } inline Matrix operator*(const Matrix& __x) { Matrix<T, _n, _m> res; for (register size_t i = 0; i < _n; i ++) for (register size_t j = 0; j < _m; j ++) for (register size_t k = 0; k < _n; k ++) res[i][j] += _arr[i][k] * __x[k][j]; return res; } inline Matrix operator*(const T& __x) { Matrix<T, _n, _m> res; for (register size_t i = 0; i < _n; i ++) for (register size_t j = 0; j < _m; j ++) res[i][j] = _arr[i][j] * __x; return res; } inline Matrix operator^(register T __k) { Matrix<T, _n, _n> res, base = *this; for (register size_t i = 0; i < _n; i ++) res[i][i] = 1; while (__k) { if (__k & 0x1) res = res * base; base = base * base; __k >>= 1; } return res; } inline const std::pair<size_t, size_t> size() const { return std::make_pair(_n, _m); } inline const Matrix& input() { for (register size_t i = 0; i < _n; i ++) for (register size_t j = 0; j < _m; j ++) scanf("%d", &_arr[i][j]); return *this; } inline const Matrix& output() { for (register size_t i = 0; i < _n; i ++, printf("\n")) for (register size_t j = 0; j < _m; j ++) printf("%d ", _arr[i][j]); return *this; } }; #endif // _MATRIX_H_ ``` 使用方法: ```cpp #include "Matrix.h" using namespace std; Matrix<int, 2, 2> a, b, c, d; int main() { a.input(); b.input(); c = a + b; d = a * b; c.output(); d.output(); return 0; } ```