Strassen矩阵相乘算法的c++代码实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
B22[i][j]=B[i+n/2][j+n/2];
}
}
int SBaidu Nhomakorabea[64][64];//S1
sub(B12,B22,S1,n/2);
int S2[64][64];//S2
add(A11,A12,S2,n/2);
int S3[64][64];//S3
add(A21,A22,S3,n/2);
int S4[64][64];//S4
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int multiply(int n,int A[64][64],int B[64][64],int C[64][64]);
int sub(int A[64][64],int B[64][64],int C[64][64],int n);
}
cout<<endl;
}
}
int multiply(int n,int A[64][64],int B[64][64],int C[64][64])
{
if(n==2) //进行常规矩阵乘法运算(也可将范围缩小到1)
{
C[0][0]=A[0][0]*B[0][0]+A[0][1]*B[1][0];
C[0][1]=A[0][0]*B[0][1]+A[0][1]*B[1][1];
add(B21,B22,S8,n/2);
int S9[64][64];//S9
sub(A11,A21,S9,n/2);
int S10[64][64];//S10
add(B11,B12,S10,n/2);
int P1[64][64];//P1
multiply(n/2,A11,S1,P1);
int P2[64][64];//P2
{
cout<<C[i][j];
if(j<n-1)
cout<<" "; //输出C
}
cout<<endl;
}
multiply(n,B,A,C); //调用递归函数
for(int i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<C[i][j];
if(j<n-1)
cout<<" "; //输出C
C[1][0]=A[1][0]*B[0][0]+A[1][1]*B[1][0];
C[1][1]=A[1][0]*B[0][1]+A[1][1]*B[1][1];
}
else
{
int A11[64][64];//A11
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
{
B11[i][j]=B[i][j];
}
}
int B21[64][64];//B21
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
{
B21[i][j]=B[i+n/2][j];
sub(B21,B11,S4,n/2);
int S5[64][64];//S5
add(A11,A22,S5,n/2);
int S6[64][64];//S6
add(B11,B22,S6,n/2);
int S7[64][64];//S7
sub(A12,A22,S7,n/2);
int S8[64][64];//S8
{
C[i][j]=A[i][j]+B[i][j];
}
}
}
int add(int A[64][64],int B[64][64],int C[64][64],int n);
int main()
{
int n;
cin>>n;
int i,j;
int C[64][64];
int A[64][64];
for(int i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(int j=0;j<n/2;j++)
{
A12[i][j]=A[i][j+n/2];
}
}
int A22[64][64];//A22
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
{
A22[i][j]=A[i+n/2][j+n/2];
}
}
int B11[64][64];//B11
multiply(n/2,S2,B22,P2);
int P3[64][64];//P3
multiply(n/2,S3,B11,P3);
int P4[64][64];//P4
multiply(n/2,A22,S4,P4);
int P5[64][64];//P5
multiply(n/2,S5,S6,P5);
}
}
int B12[64][64];//B12
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
{
B12[i][j]=B[i][j+n/2];
}
}
int B22[64][64];//B22
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
{
for(int j=0;j<n;j++)
{
R[i][j]=0;
}
}
add(P1,P2,R,n/2);
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
{
C[i][j+n/2]=R[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>A[i][j]; //输入A
}
}
int B[64][64];
for(int i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>B[i][j]; //输入B
}
}
multiply(n,A,B,C); //调用递归函数
for(int i=0;i<n;i++)
{
for(j=0;j<n;j++)
}
}
add(P5,P1,R,n/2);
sub(R,P3,R,n/2);
sub(R,P7,R,n/2);
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
{
C[i+n/2][j+n/2]=R[i][j];
}
}
}}
int sub(int A[64][64],int B[64][64],int C[64][64],int n)
int P6[64][64];//P6
multiply(n/2,S7,S8,P6);
int P7[64][64];//P7
multiply(n/2,S9,S10,P7);
int R[64][64];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
R[i][j]=0;
}
} //初始化第一次
add(P5,P4,R,n/2);
sub(R,P2,R,n/2);
add(R,P6,R,n/2); //加出c11
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
{
C[i][j]=R[i][j];
}
} //赋值
for(int i=0;i<n;i++)
{
R[i][j]=0;
}
}
add(P3,P4,R,n/2);
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
{
C[i+n/2][j]=R[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
R[i][j]=0;
{
A11[i][j]=A[i][j];
}
}
int A21[64][64];//A21
for(int i=0;i<n/2;i++)
{
for(int j=0;j<n/2;j++)
{
A21[i][j]=A[i+n/2][j];
}
}
int A12[64][64];//A12
for(int i=0;i<n/2;i++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
C[i][j]=A[i][j]-B[i][j];
}
}
}
int add(int A[64][64],int B[64][64],int C[64][64],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
相关文档
最新文档