固定大小的矩阵乘法
固定大小的矩阵乘法
#include <bits/stdc++.h>
using namespace std;
template <size_t N, size_t M>
using matrix = array<array<int, M>, N>;
template <size_t N, size_t M, size_t R>
matrix<N, R> operator*(const matrix<N, M>& lhs, const matrix<M, R>& rhs) {
matrix<N, R> res = {};
for (size_t i = 0; i < N; i++) {
for (size_t k = 0; k < R; k++) {
for (size_t j = 0; j < M; j++) {
res[i][k] += lhs[i][j] * rhs[j][k];
}
}
}
return res;
}
template <size_t N, class T>
matrix<N, N> qpow(matrix<N, N> a, T b) {
matrix<N, N> res = {};
for (size_t i = 0; i < N; i++) res[i][i] = 1;
while (b) {
if (b & 1) res = res * a;
if (b >>= 1) a = a * a;
}
return res;
}
int main() {
matrix<3, 3> a = {{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
}};
matrix<3, 3> c = {
-1, -2, -3,
-4, -5, -6,
-7, -8, -9
};
auto b = qpow(a, 5) * c;
return 0;
}
有几个注意事项:
- 如果用别名声明
matrix,注意template <size_t N, size_t M> using matrix = array<array<int, M>, N>;这里面的两个size_t都是必要的,不能改成int。 - 如果用别名声明
matrix,那么不要把它们封到命名空间里,否则 ADL 不会查找命名空间里的函数,因为那是别名,不是新类型。 - 构造矩阵的时候,要么在外层额外加一层花括号(
a),要么只加一层花括号(c)。 - 构造矩阵的时候,可以只写某一行的前几项,剩下的都会是零,但这样就要用
a那种写法。特别地,= {}就是全零矩阵。
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/19143751
浙公网安备 33010602011771号