固定大小的矩阵乘法

固定大小的矩阵乘法

#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;
}

有几个注意事项:

  1. 如果用别名声明 matrix,注意 template <size_t N, size_t M> using matrix = array<array<int, M>, N>; 这里面的两个 size_t 都是必要的,不能改成 int
  2. 如果用别名声明 matrix,那么不要把它们封到命名空间里,否则 ADL 不会查找命名空间里的函数,因为那是别名,不是新类型。
  3. 构造矩阵的时候,要么在外层额外加一层花括号(a),要么只加一层花括号(c)。
  4. 构造矩阵的时候,可以只写某一行的前几项,剩下的都会是零,但这样就要用 a 那种写法。特别地,= {} 就是全零矩阵。
posted @ 2025-10-15 16:50  caijianhong  阅读(29)  评论(0)    收藏  举报