strassen算法

#include <iostream>


using namespace std;


struct matrix{
    int x;
    int y;
    int num;
};


int ** SQUARE_MATRIX_MULTIPLY_RECURSIVE(int **&A,int **&B,int num);


int main()
{
    int num;
    cout<<"请输入你想要相乘的两个矩阵的阶数:"<<endl;
    cin>>num;
    int **A=new int*[num];
    int **B=new int*[num];
    int **conclusion=new int* [num];
    for(int i=0;i<num;i++){
        A[i]=new int[num];
        B[i]=new int[num];
        conclusion[i]=new int[num];
    }
    cout<<"请输入A矩阵:"<<endl;
    for (int m=0;m<num;m++){
        for (int n=0;n<num;n++){
            cin>>A[m][n];
        }
    }
     cout<<"请输入B矩阵:"<<endl;
     for (int m=0;m<num;m++){
        for (int n=0;n<num;n++){
            cin>>B[m][n];
        }
    }
    conclusion=SQUARE_MATRIX_MULTIPLY_RECURSIVE(A,B,num);
    for (int m=0;m<num;m++){
        for (int n=0;n<num;n++){
            cout<<conclusion[m][n]<<" ";
        }
        cout<<endl;
    }
}




int ** SQUARE_MATRIX_MULTIPLY_RECURSIVE(int **&A,int **&B,int n){
    if (n==1){
        int **one=new int*[1];
        one[0]=new int [1];
        one[0][0]=A[0][0]*B[0][0];
        return one;
    }else{
        int **S1=new int* [n/2];
        int **S2=new int* [n/2];
        int **S3=new int* [n/2];
        int **S4=new int* [n/2];
        int **S5=new int* [n/2];
        int **S6=new int* [n/2];
        int **S7=new int* [n/2];
        int **S8=new int* [n/2];
        int **S9=new int* [n/2];
        int **S10=new int* [n/2];
        int **P1=new int* [n/2];
        int **P2=new int* [n/2];
        int **P3=new int* [n/2];
        int **P4=new int* [n/2];
        int **P5=new int* [n/2];
        int **P6=new int* [n/2];
        int **P7=new int* [n/2];
        int **A11=new int* [n/2];
        int **A22=new int* [n/2];
        int **B11=new int* [n/2];
        int **B22=new int* [n/2];
        for(int i=0;i<n/2;i++){
            S1[i]=new int[n/2];
            S2[i]=new int[n/2];
            S3[i]=new int[n/2];
            S4[i]=new int[n/2];
            S5[i]=new int[n/2];
            S6[i]=new int[n/2];
            S7[i]=new int[n/2];
            S8[i]=new int[n/2];
            S9[i]=new int[n/2];
            S10[i]=new int[n/2];
            P1[i]=new int[n/2];
            P2[i]=new int[n/2];
            P3[i]=new int[n/2];
            P4[i]=new int[n/2];
            P5[i]=new int[n/2];
            P6[i]=new int[n/2];
            P7[i]=new int[n/2];
            A11[i]=new int[n/2];
            B11[i]=new int[n/2];
            A22[i]=new int[n/2];
            B22[i]=new int[n/2];
        }
        for (int i=0;i<n/2;i++){
            for (int m=0;m<n/2;m++){
                S1[i][m]=B[0+i][n/2+m]-B[n/2+i][n/2+m];
            }
        }
        for (int i=0;i<n/2;i++){
            for (int m=0;m<n/2;m++){
                S2[i][m]=A[0+i][0+m]+A[i+0][n/2+m];
            }
        }
        for (int i=0;i<n/2;i++){
            for (int m=0;m<n/2;m++){
                S3[i][m]=A[n/2+i][0+m]+A[n/2+i][n/2+m];
            }
        }
        for (int i=0;i<n/2;i++){
            for (int m=0;m<n/2;m++){
                S4[i][m]=B[n/2+i][0+m]-B[0+i][0+m];
            }
        }
        for (int i=0;i<n/2;i++){
            for (int m=0;m<n/2;m++){
                S5[i][m]=A[0+i][0+m]+A[n/2+i][n/2+m];
            }
        }
        for (int i=0;i<n/2;i++){
            for (int m=0;m<n/2;m++){
                S6[i][m]=B[0+i][0+m]+B[n/2+i][n/2+m];
            }
        }
        for (int i=0;i<n/2;i++){
            for (int m=0;m<n/2;m++){
                S7[i][m]=A[0+i][n/2+m]-A[n/2+i][n/2+m];
            }
        }
        for (int i=0;i<n/2;i++){
            for (int m=0;m<n/2;m++){
                S8[i][m]=B[n/2+i][0+m]+B[n/2+i][n/2+m];
            }
        }
        for (int i=0;i<n/2;i++){
            for (int m=0;m<n/2;m++){
                S9[i][m]=A[0+i][0+m]-A[n/2+i][0+m];
            }
        }
        for (int i=0;i<n/2;i++){
            for (int m=0;m<n/2;m++){
                A11[i][m]=A[0+i][0+m];
                A22[i][m]=A[n/2+i][n/2+m];
                B11[i][m]=B[0+i][0+m];
                B22[i][m]=B[n/2+i][n/2+m];
            }
        }
        P1=SQUARE_MATRIX_MULTIPLY_RECURSIVE(A11,S1,n/2);
        P2=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S2,B22,n/2);
        P3=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S3,B11,n/2);
        P4=SQUARE_MATRIX_MULTIPLY_RECURSIVE(A22,S4,n/2);
        P5=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S5,S6,n/2);
        P6=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S7,S8,n/2);
        P7=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S9,S10,n/2);
        //如果是强行使用的是我们平时所使用的计算矩阵乘法的方法的话,那么所得到的
        int ** conclusion=new int*[n];
        for (int i=0;i<n;i++)
            conclusion[i]=new int[n];
        for (int i=0;i<n/2;i++){
            for (int m=0;m<n/2;m++){
                conclusion[0+i][0+m]=P5[i][m]+P4[i][m]-P2[i][m]+P6[i][m];
                conclusion[0+i][n/2+m]=P1[i][m]+P2[i][m];
                conclusion[n/2+i][0+m]=P3[i][m]+P4[i][m];
                conclusion[n/2+i][n/2+m]=P1[i][m]+P5[i][m]-P3[i][m]-P7[i][m];
            }
        }
        return conclusion;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值