一般矩阵乘法

struct Matrix {
vector<vector<int>> M;
Matrix(int n, int m) {
M.assign(n, vector<int>(m, 0));
}
void read() {
int n = M.size(), m = M[0].size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> M[i][j];
}
}
}
Matrix T() {
int n = M.size(), m = M[0].size();
Matrix t(m, n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
t.M[j][i] = M[i][j];
}
}
return t;
}
void print() {
int n = M.size(), m = M[0].size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << M[i][j] << " \n"[j == m - 1];
}
}
}
};
Matrix operator * (const Matrix &a, const Matrix &b) {
int n = a.M.size(), m = a.M[0].size(), d = b.M[0].size();
assert(m == b.M.size());
Matrix c(n, d);
for (int i = 0; i < n; i++) {
for (int j = 0; j < d; j++) {
for (int k = 0; k < m; k++) {
c.M[i][j] += a.M[i][k] * b.M[k][j];
}
}
}
return c;
}