/*
Strassen矩阵乘法:
A和B的乘积矩阵C中的元素C[i,j]定义为:C[i][j] = k从1到n 累加A[i][k]*B[k][j]
若依此定义来计算A和B的乘积矩阵C,则每计
算C的一个元素C[i][j],需要做n次乘法和n-1次
加法。因此,算出矩阵C的 个元素所需的计算
时间为O(n3)
分治法:
将矩阵A,B和C中的每一矩阵都分成4个大小相等的子矩阵。可以将方程C=AB重写为:
[C11 C12] = [A11 A12] [B11 B12]
[C21 C22] [A21 A22] [B21 B22]
可以得到
C11 = A11*B11 + A12*B21
C12 = A11*B12 + A12*B22
C21 = A21*B11 + A22*B21
C22 = A21*B12 + A22*B22
为了降低时间复杂度,必须减少乘法的次数:
从8次乘法降为7次,用了7次对于n/2矩阵乘的递归调用和18次n.2矩阵的加减法计算
M1 = A11(B12 - B22)
M2 = (A11+A12)*B22
以下代码是转载的,有空的时候再研究
*/
#include <iostream>
using namespace std;
const int N=4; //常量N用来定义矩阵的大小
void main()
{
void STRASSEN(int n,float A[][N],float B[][N],float C[][N]);
void input(int n,float p[][N]);
void output(int n,float C[][N]); //函数声明部分
float A[N][N],B[N][N],C[N][N]; //定义三个矩阵A,B,C
cout<<"现在录入矩阵A[N][N]:"<<endl<<endl;
input(N,A);
cout<<endl<<"现在录入矩阵B[N]
算法设计与分析:第三章 分治 3.5Strassen矩阵乘法

最新推荐文章于 2024-03-26 10:31:21 发布
