第四章-矩阵乘法的Strassen算法

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Ma
{
    int n;
    int a[4][4];
    Ma(int nn){
        n = nn;
    }
};
int a[4][4] = {1,2,3,4,
               5,6,7,8,
               9,10,11,12,
               13,14,15,16};
void Pr(Ma m)//输出
{
    for(int i = 0;i < m.n;i++){
        for(int j = 0;j < m.n;j++){
            printf("%d ",m.a[i][j]);
        }
        printf("\n");
    }
}
Ma Cp(Ma A,int x,int y)//复制函数
{
    x--;y--;
    Ma B = Ma(A.n / 2);
    for(int i = 0;i < B.n;i++){
        for(int j = 0;j < B.n;j++){
            B.a[i][j] = A.a[i + x * B.n][j + y * B.n];
        }
    }
    return B;
}
Ma Ad(Ma A,Ma B,int x)//加,减法
{
    Ma C = Ma(A.n);
    for(int i = 0;i < C.n;i++){
        for(int j = 0;j < C.n;j++){
            C.a[i][j] = A.a[i][j] + x * B.a[i][j];
        }
    }
    return C;
}
Ma f(Ma A,Ma B)
{
    int n = A.n;
    if(n == 1){
        Ma C = Ma(1);
        C.a[0][0] = A.a[0][0] * B.a[0][0];
        return C;
    }
    Ma a11 = Cp(A,1,1);
    Ma a12 = Cp(A,1,2);
    Ma a21 = Cp(A,2,1);
    Ma a22 = Cp(A,2,2);
    Ma b11 = Cp(B,1,1);
    Ma b12 = Cp(B,1,2);
    Ma b21 = Cp(B,2,1);
    Ma b22 = Cp(B,2,2);

    Ma s1 = Ad(b12,b22,-1);
    Ma s2 = Ad(a11,a12,1);
    Ma s3 = Ad(a21,a22,1);
    Ma s4 = Ad(b21,b11,-1);
    Ma s5 = Ad(a11,a22,1);
    Ma s6 = Ad(b11,b22,1);
    Ma s7 = Ad(a12,a22,-1);
    Ma s8 = Ad(b21,b22,1);
    Ma s9 = Ad(a11,a21,-1);
    Ma s10 = Ad(b11,b12,1);

    Ma p1 = f(a11,s1);
    Ma p2 = f(s2,b22);
    Ma p3 = f(s3,b11);
    Ma p4 = f(a22,s4);
    Ma p5 = f(s5,s6);
    Ma p6 = f(s7,s8);
    Ma p7 = f(s9,s10);

    Ma c11 = Ad(Ad(Ad(p5,p4,1),p6,1),p2,-1);
    Ma c12 = Ad(p1,p2,1);
    Ma c21 = Ad(p3,p4,1);
    Ma c22 = Ad(Ad(Ad(p5,p1,1),p3,-1),p7,-1);

    Ma C = Ma(n);
    for(int i = 0;i < n;i++){
        for(int j = 0;j < n;j++){
            if(i < n / 2 && j < n / 2){
                C.a[i][j] = c11.a[i][j];
            }
            else if(i < n / 2 && j >= n / 2){
                C.a[i][j] = c12.a[i][j - n / 2];
            }
            else if(i >= n / 2 && j < n / 2){
                C.a[i][j] = c21.a[i - n / 2][j];
            }
            else{
                C.a[i][j] = c22.a[i - n / 2][j - n / 2];
            }
        }
    }
    return C;
}
int main()
{
    Ma m1 = Ma(4);
    for(int i = 0;i < m1.n;i++){
        for(int j = 0;j < m1.n;j++){
            m1.a[i][j] = a[i][j];
        }
    }
    Ma m2 = Ma(4);
    for(int i = 0;i < m1.n;i++){
        for(int j = 0;j < m1.n;j++){
            m2.a[i][j] = a[i][j];
        }
    }
    Ma C = f(m1,m2);
    Pr(C);
    return 0;
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值