设为的矩阵,为的矩阵,那么称的矩阵为矩阵与的乘积,其中的第行第列元素可以表示为:
注意点:
- 只有矩阵的列数和矩阵的行数相同的时候,两个矩阵才能进行乘法
- 矩阵的行数等于矩阵的行数,的列数等于的列数。
- 乘积的第行第列的元素等于矩阵的第行的元素与矩阵的第列对应元素乘积之和。
例:
首先,每个位置i,j都要计算一次结果,所以先要有两层循环来控制,然后对于每个位置的结果,需要循环p次,
c++
class Solution { public: vector<vector<int> > solve(vector<vector<int> >& a, vector<vector<int> >& b) { int m = a.size();//A的行数 int p = a[0].size();//A的列数=B的行数 int n = b[0].size();//B的行数 vector<vector<int>> ans(m); for(int i = 0 ; i < m ; i++) { for(int j = 0 ; j < n ; j++) { int t = 0; for(int k = 0 ; k < p ; k++) { t+=a[i][k]*b[k][j]; } ans[i].push_back(t); } } return ans; } };
java
import java.util.*; public class Solution { public int[][] solve (int[][] a, int[][] b) { // write code here int m = a.length;//A的行数 int p = a[0].length;//A的列数=B的行数 int n = b[0].length;//B的行数 int[][] ans = new int[m][n]; for(int i = 0 ; i < m ; i++) { for(int j = 0 ; j < n ; j++) { int t = 0; for(int k = 0 ; k < p ; k++) { t+=a[i][k]*b[k][j]; } ans[i][j]=t; } } return ans; } }
python
class Solution: def solve(self , a , b ): m = len(a) p = len(a[0]) n = len(b[0]) ans=[[[] for i in range(m)] for j in range(n)] for i in range(m): for j in range(n): t = 0 for k in range(p): t=t+a[i][k]*b[k][j] ans[i][j]=t return ans;
(python numpy模块有相应的函数,不过本题不允许使用
import numpy as np class Solution: def solve(self, a, b): a = np.array(a) b = np.array(b) r = np.dot(a, b) return r.tolist()
以上是矩阵乘法的通解,本题是两个n*n的矩阵,也可以把m、p都用n代替(少些几行代码,不过感觉也没必要)
class Solution { public: vector<vector<int> > solve(vector<vector<int> >& a, vector<vector<int> >& b) { int n = a.size(); vector<vector<int>> ans(n); for(int i = 0 ; i < n ; i++) { for(int j = 0 ; j < n ; j++) { int t = 0; for(int k = 0 ; k < n ; k++) { t+=a[i][k]*b[k][j]; } ans[i].push_back(t); } } return ans; } };