【模板】矩阵
0AND1STORY
2019-11-13 14:05:18
矩阵模板,可用于矩阵加速计算:
头文件:
```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;
}
```