矩阵相乘strassen-c++代码实现及运行实例结果
2017-12-16 00:40
791 查看
理论知识参见算法导论第三版以及百度
伪代码
c++代码
运行结果
伪代码
c++代码
#include <iostream> using namespace std; #define N 2//以二维方阵为例 template<typename T>//使用模板保证矩阵可以为不同类型如int,double等 void output(T D ,int n); template<typename T> void strassen(T A ,T B ,T C ,int n); int main() { int A ={1,2,3,4}; cout<<"矩阵A的值"<<endl; output(A,N);//先输出矩阵A的值 int B ={5,6,7,8}; cout<<"矩阵B的值"<<endl; output(B,N);//先输出矩阵B的值 int C ; strassen(A,B,C,N); cout<<"矩阵C的值"<<endl; output(C,N);//输出矩阵C的值 return 0; } template<typename T> void output(T D ,int n) { for(int i=0;i<n;++i) { for(int j=0;j<n;++j) { cout<<D[i][j]<<" "; } cout<<endl; } } template<typename T> void matrixAdd(T a ,T b ,T c ,int n)//定义矩阵加法 { for(int i=0;i<n;++i) for(int j=0;j<n;++j) c[i][j]=a[i][j]+b[i][j]; } template<typename T> void matrixSub(T a ,T b ,T c ,int n)//定义矩阵减法 { for(int i=0;i<n;++i) for(int j=0;j<n;++j) c[i][j]=a[i][j]-b[i][j]; } template<typename T> void matrixMul(T a ,T b ,T c )//定义矩阵乘法 { for(int i=0;i<2;++i)//小于2是因为strassen采用递归,递归结束标志是最终分成二阶矩阵 for(int j=0;j<2;++j) { c[i][j]=0; for(int k=0;k<2;++k) c[i][j]+=a[i][k]*b[k][j]; } } template<typename T> void strassen(T A ,T B ,T C ,int n) { T A11 ,A12 ,A21 ,A22 ;//将矩阵分块 T B11 ,B12 ,B21 ,B22 ; T C11 ,C12 ,C21 ,C22 ; T S1 ,S2 ,S3 ,S4 ,S5 ,S6 ,S7 ;//由strassen定义的7个系数 T temp1 ,temp2 ;//存储中间量 if(n==2)//递归结束标志 matrixMul(A,B,C); else { for(int i=0;i<n/2;++i) for(int j=0;j<n/2;++j) { A11[i][j]=A[i][j];//将矩阵分成相同的4个块 A12[i][j]=A[i][j+n/2]; A21[i][j]=A[i+n/2][j]; A22[i][j]=A[i+n/2][j+n/2]; B11[i][j]=B[i][j]; B12[i][j]=B[i][j+n/2]; B21[i][j]=B[i+n/2][j]; B22[i][j]=B[i+n/2][j+n/2]; } /*S1=(A11+A22)×(B11+B22)*/ matrixAdd(A11,A22,temp1,n/2); matrixAdd(B11,B22,temp2,n/2); strassen(temp1,temp2,S1,n/2); /*S2=(A21+A22)×B11*/ matrixAdd(A21,A22,temp1,n/2); strassen(temp1,B11,S2,n/2); /*S3=A11*(B12+B22)*/ matrixSub(B12,B22,temp1,n/2); strassen(A11,temp1,S3,n/2); /*S4=A22×(B21+B11)*/ 4000 matrixSub(B21,B11,temp1,n/2); strassen(A22,temp1,S4,n/2); /*S5=(A11+A12)×B22*/ matrixAdd(A11,A12,temp1,n/2); strassen(temp1,B22,S5,n/2); /*S6=(A11+A22)×(B11+B22)*/ matrixSub(A21,A11,temp1,n/2); matrixAdd(B11,B12,temp2,n/2); strassen(temp1,temp2,S6,n/2); /*S7=(A12+A22)×(B21+B22)*/ matrixSub(A12,A22,temp1,n/2); matrixAdd(B21,B22,temp2,n/2); strassen(temp1,temp2,S7,n/2); /*C11 = S1+S4-S5+S7*/ matrixAdd(S1,S4,temp1,n/2); matrixSub(S7,S5,temp2,n/2); matrixAdd(temp1,temp2,C11,n/2); /*C12 = S3+S5*/ matrixAdd(S3,S5,C12,n/2); /*C21 = S2+S4*/ matrixAdd(S2,S4,C21,n/2); /*C22 = S1-S2+S3+S6*/ matrixSub(S1,S2,temp1,n/2); matrixAdd(S3,S6,temp2,n/2); matrixAdd(temp1,temp2,C22,n/2); for(int i=0;i<n/2;++i)//逆转化 for(int j=0;j<n/2;++j) { C[i][j]=C11[i][j]; C[i][j+n/2]=C12[i][j]; C[i+n/2][j]=C21[i][j]; C[i+n/2][j+n/2]= C22[i][j]; } } }
运行结果
相关文章推荐
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果