【算法设计与分析】【C++】斯特拉森Strassen矩阵乘法加速

本文介绍了斯特拉森Strassen矩阵乘法的加速原理,通过将普通矩阵乘法的八次乘法减少到七次,实现算法优化。然而,分块和合并操作的计算成本在矩阵尺寸较小时会抵消加速效果,因此选择合适的BORDER_SIZE至关重要,例如128。提供的C++代码适用于2的幂次方大小的n*n矩阵,并在n增大时展示Strassen乘法的速度优势。
摘要由CSDN通过智能技术生成

【算法设计与分析】【C++】斯特拉森Strassen矩阵乘法加速

矩阵乘法加速原理

在这里插入图片描述

  • 简单地来说,就是把普通矩阵的八次乘法优化成七次乘法,我们可以直接按照上面给出的式子
    来写。
  • 但是需要注意的是,进行矩阵分块和矩阵合并也需要消耗计算资源,显然在矩阵非常小时,乘法消耗的时间远小于各种分块后再计算的时间,因此程序中的BORDER_SIZE的选择对于程序的运行影响极大,经过本人测试下来,128是比较的好的数据
  • 接下来上代码(本代码仅限于n*n的矩阵并且n为2的幂次方
/*
author : TheSun
Time : 2022-03-04 00:44:17
*/
#include<bits/stdc++.h>
using namespace std;
const int BORDER_SIZE = 128; //在这个数量下面使用普通乘法,因为此时各种赋值所消耗的时间大于乘法运算的时间
struct Matrix
{
   
    int r, c;
    int **v;
    Matrix(int x=0 , int y=0);
    Matrix(const Matrix& others);
    ~Matrix();
    int* operator[](int n);
    Matrix operator *(Matrix others);//重载为加速矩阵乘法
    inline void setSize(int x , int y);
    inline void operator=(Matrix others);
    void Print();
    inline Matrix operator+(Matrix& others);
    inline Matrix operator-(Matrix& others);
    inline Matrix Muti(Matrix& others); //普通矩阵乘法
    inline void MatrixDiv(Matrix& A_11 , Matrix& A_12 , Matrix& A_21 , Matrix& A_22); // 矩阵分块
    inline Matrix MergeMatrix(Matrix& A_11 , Matrix& A_12 , Matrix& A_21 , Matrix& A_22); //合并矩阵
    //bool oprator==()
};

Matrix::Matrix(const Matrix& others)
{
      
    //if()
    r = others.r , c = others.c;
    v = new int *[r + 1];
    for(int i=0 ; i<=r ; ++i)
        v[i] = new int [c + 1];
    for(int i=1 ; i<=r ; ++i)
        for(int j= 1 ; j<=c ; ++j)
            v[i][j] = 0;
}


Matrix Matrix::operator*(Matrix others)
{
   
    if( r <= BORDER_SIZE && c <= BORDER_SIZE && others.c <= BORDER_SIZE)
    {
   
        return this->Muti(others);
    }
    else
    {
   
        Matrix A_11(r/2 , c/2) , A_12(r/2 , c/2) , A_21(r/2 , c/2) , A_22(r/2 , c/2),
               B_11(others.r/2 , others.c/2) , B_12(others.r
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值