文章目录
前言
记录算法分析作业
学完《数据结构与算法分析(C++版)》(第三版)16.3.3节Strassen矩阵相乘的算法流程后,用C++实现Strassen方法求矩阵乘法
参考了这个博客的思路link
Strassen矩阵相乘的算法,相比起普通算法,只是少了一次乘法,时间复杂度却少很多。由此可见,一个细小的差别说不定就会导致后果差别很大呀。(跑题~~
正文
以下是实现过程
1. 实现矩阵加法功能
//矩阵加法
void Matrix_Sum(int n, int** MatrixA, int** MatrixB, int** MatrixSum) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
MatrixSum[i][j] = MatrixA[i][j] + MatrixB[i][j];
}
2. 实现矩阵减法功能
//矩阵减法
void Matrix_Sub(int n, int** MatrixA, int** MatrixB, int** MatrixSub) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
MatrixSub[i][j] = MatrixA[i][j] - MatrixB[i][j];
}
3. 实现矩阵乘法功能
(这个需要注意一下,相比之下复杂一点,这个也就是我们平常计算矩阵乘法的算法,后续可以用来检验Strassen方法的正确性
//矩阵乘法
void Matrix_Mul(int n, int** MatrixA, int** MatrixB, int** MatrixMul) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
MatrixMul[i][j] = 0;
for (int k = 0; k < n; k++)
MatrixMul[i][j] = MatrixMul[i][j] + MatrixA[i][k] * MatrixB[k][j];
}
}
4. 实现Strassen方法
用几个二维数组来存储数据,主要是各种二维数组的赋值繁琐了一点,写的时候要注意数组名字,思路很简单。
void Strassen(int N, int** MatrixA, int** MatrixB, int** MatrixC ) {
int n = N / 2; //分治思想
//初始化每个小矩阵的大小
//数组的第二维一定要显示指定
int** MatrixA11 = new int* [n];
int** MatrixA12 = new int* [n];
int** MatrixA21 = new int* [n];
int** MatrixA22 = new int* [n];
int** MatrixB11 = new int* [n];
int** MatrixB12 = new int* [n];
int** MatrixB21 = new int* [n];
int** MatrixB22 = new int* [n];
int** MatrixC11 = new int* [n];
int** MatrixC12 = new int* [n];

本文详细介绍了如何用C++实现Strassen算法,通过矩阵加法、减法和传统乘法功能,逐步演示了如何通过分治策略优化矩阵乘法,对比了与常规方法的时间效率。通过实例展示了从矩阵初始化到打印的全过程。
1789

被折叠的 条评论
为什么被折叠?



