矩阵相乘 C++

#include<iostream>  
#include<vector>  
using namespace std;

vector<vector<int>> matrix_multiply(vector<vector<int>> arrA, vector<vector<int>> arrB)
{
	//矩阵arrA的行数  
	int rowA = arrA.size();
	//矩阵arrA的列数  
	int colA = arrA[0].size();
	//矩阵arrB的行数  
	int rowB = arrB.size();
	//矩阵arrB的列数  
	int colB = arrB[0].size();
	//相乘后的结果矩阵  
	vector<vector<int>>  res;
	if (colA != rowB)//如果矩阵arrA的列数不等于矩阵arrB的行数。则返回空  
	{
		return res;
	}
	else
	{
		//设置结果矩阵的大小,初始化为为0  
		res.resize(rowA);
		for (int i = 0; i < rowA; ++i)
		{
			res[i].resize(colB);
		}

		//矩阵相乘  
		for (int i = 0; i < rowA; ++i)
		{
			for (int j = 0; j < colB; ++j)
			{
				for (int k = 0; k < colA; ++k)
				{
					res[i][j] += arrA[i][k] * arrB[k][j];
				}
			}
		}
	}
	return res;
}

int main(void)
{
	vector<vector<int>> arrA = { { 1, 0, 0 },{ 0, 1, 0 },{ 0, 0, 1 } };
	vector<vector<int>> arrB = { { 1, 2, 3 },{ 4, 5, 6 },{ 7, 8, 9 } };
	//vector<vector<int>> arrA = { { 1, 2, 3 }, { 4, 5, 6 } };  
	//vector<vector<int>> arrB = { { 1, 4 }, { 2, 5 }, { 3, 6 } };  
	vector<vector<int>> res = matrix_multiply(arrA, arrB);
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
矩阵相乘的递归方法也称为 Strassen 矩阵相乘算法,其时间复杂度为 $O(n^{log_2{7}})$,比普通矩阵相乘的时间复杂度 $O(n^3)$ 更优秀。 假设有两个 $n\times n$ 的矩阵 $A$ 和 $B$,它们的乘积 $C=AB$ 可以递归地分解为: $$ C = \begin{bmatrix}C_{11} & C_{12}\\ C_{21} & C_{22}\end{bmatrix} = \begin{bmatrix}A_{11} & A_{12}\\ A_{21} & A_{22}\end{bmatrix}\begin{bmatrix}B_{11} & B_{12}\\ B_{21} & B_{22}\end{bmatrix} $$ 其中 $C_{11},C_{12},C_{21},C_{22}$ 均为 $\frac{n}{2}\times\frac{n}{2}$ 的矩阵,它们的计算公式为: $$ \begin{aligned} C_{11} &= M_1 + M_4 - M_5 + M_7\\ C_{12} &= M_3 + M_5\\ C_{21} &= M_2 + M_4\\ C_{22} &= M_1 - M_2 + M_3 + M_6\\ \end{aligned} $$ 其中 $M_1\sim M_7$ 均为 $\frac{n}{2}\times\frac{n}{2}$ 的矩阵,它们的计算公式为: $$ \begin{aligned} M_1 &= (A_{11}+A_{22})(B_{11}+B_{22})\\ M_2 &= (A_{21}+A_{22})B_{11}\\ M_3 &= A_{11}(B_{12}-B_{22})\\ M_4 &= A_{22}(B_{21}-B_{11})\\ M_5 &= (A_{11}+A_{12})B_{22}\\ M_6 &= (A_{21}-A_{11})(B_{11}+B_{12})\\ M_7 &= (A_{12}-A_{22})(B_{21}+B_{22})\\ \end{aligned} $$ 下面是递归方法求矩阵相乘的 Python 代码实现: ```python def matrix_multiply_recursive(A, B): n = len(A) # base case if n == 1: return [[A[0][0] * B[0][0]]] # divide A11 = [A[i][:n//2] for i in range(n//2)] A12 = [A[i][n//2:] for i in range(n//2)] A21 = [A[i][:n//2] for i in range(n//2, n)] A22 = [A[i][n//2:] for i in range(n//2, n)] B11 = [B[i][:n//2] for i in range(n//2)] B12 = [B[i][n//2:] for i in range(n//2)] B21 = [B[i][:n//2] for i in range(n//2, n)] B22 = [B[i][n//2:] for i in range(n//2, n)] # conquer M1 = matrix_multiply_recursive(matrix_add(A11, A22), matrix_add(B11, B22)) M2 = matrix_multiply_recursive(matrix_add(A21, A22), B11) M3 = matrix_multiply_recursive(A11, matrix_sub(B12, B22)) M4 = matrix_multiply_recursive(A22, matrix_sub(B21, B11)) M5 = matrix_multiply_recursive(matrix_add(A11, A12), B22) M6 = matrix_multiply_recursive(matrix_sub(A21, A11), matrix_add(B11, B12)) M7 = matrix_multiply_recursive(matrix_sub(A12, A22), matrix_add(B21, B22)) C11 = matrix_add(matrix_sub(matrix_add(M1, M4), M5), M7) C12 = matrix_add(M3, M5) C21 = matrix_add(M2, M4) C22 = matrix_add(matrix_add(matrix_sub(M1, M2), M3), M6) # combine C = [[0] * n for _ in range(n)] for i in range(n//2): C[i][:n//2] = C11[i] C[i][n//2:] = C12[i] for i in range(n//2, n): C[i][:n//2] = C21[i-n//2] C[i][n//2:] = C22[i-n//2] return C def matrix_add(A, B): return [[A[i][j] + B[i][j] for j in range(len(A[0]))] for i in range(len(A))] def matrix_sub(A, B): return [[A[i][j] - B[i][j] for j in range(len(A[0]))] for i in range(len(A))] # 测试 A = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] B = [[17, 18, 19, 20], [21, 22, 23, 24], [25, 26, 27, 28], [29, 30, 31, 32]] C = matrix_multiply_recursive(A, B) for row in C: print(row) ``` 输出结果为: ``` [250, 260, 270, 280] [618, 644, 670, 696] [986, 1028, 1070, 1112] [1354, 1412, 1470, 1528] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值