算法导论之四矩阵乘法的Strassen算法

算法导论 — 4.2 矩阵乘法的Strassen算法 笔记 给定两个n×nn×nn×n正方矩阵AAA和BBB,这两个矩阵的乘法定义为          其中          下面是矩阵乘法的伪代码。      很显然,执行SQUARE-MATRIX-MULTIPLY需要花费Θ(n3)Θ(n^3)Θ(n3)时间。然而,有一种方法可以花费更少的时间,这就是Strassen算法,它本质上也是一种分治法,它的时间复杂度为Θ(nlg7)=O(n2.81)Θ(... 阅读详情

实现Strassen矩阵相乘的C++代码如下:

#include <iostream>

using namespace std;

const int N=4;  //常量N用来定义矩阵的大小

void main()

{

         //函数声明部分

         voidstrassen(int n,float A[][N],float B[][N],float C[][N]);

         voidinput(int n,float p[][N]);

         voidoutput(int n,float C[][N]);

 

         //定义三个矩阵A,B,C

         floatA[N][N],B[N][N],C[N][N];

 

         //输入矩阵A,B

         cout<<"现在录入矩阵A[N][N]:"<<endl;

         input(N,A);

         cout<<endl<<"现在录入矩阵B[N][N]:"<<endl;

         input(N,B);

 

         //调用strassen函数计算

         strassen(N,A,B,C);

 

         //输出计算结果

         output(N,C);

}

 

//矩阵输入函数

void input(int n,float p[][N])

{

         inti,j;

         for(i=0;i<n;i++)

         {

                   cout<<"请输入第"<<i+1<<"行"<<endl;

                   for(j=0;j<n;j++)

                   {

                            cin>>p[i][j];

                   }

         }

}

 

//矩阵输出函数

void output(int n,float C[][N])

{

         inti,j;

         cout<<"输出矩阵:"<<endl;

         for(i=0;i<n;i++)

         {

                   cout<<endl;

                   for(j=0;j<n;j++)

                   {

                            cout<<C[i][j]<<"";

                   }

         }

         cout<<endl;

}

 

//按通常的矩阵乘法计算C=AB的子算法(仅作2阶)

void MATRIX_MULTIPLY(float A[][N],floatB[][N],float C[][N])

{

         inti,j,k;

         for(i=0;i<2;i++)

         {

                   for(j=0;j<2;j++)

                   {

                            //计算完一个C[i][j],下一个应重新赋值为零

                            C[i][j]=0;

 

                            for(k=0;k<2;k++)

                            {

                                     C[i][j]=C[i][j]+A[i][k]*B[k][j];

                            }

                   }

         }

}

 

//矩阵加法函数

void MATRIX_ADD(int n,float X[][N],floatY[][N],float Z[][N])

{

         inti,j;

         for(i=0;i<n;i++)

         {

                   for(j=0;j<n;j++)

                   {

                            Z[i][j]=X[i][j]+Y[i][j];

                   }

         }

}

 

//矩阵减法函数

void MATRIX_SUB(int n,float X[][N],floatY[][N],float Z[][N])

{

         inti,j;

         for(i=0;i<n;i++)

         {

                   for(j=0;j<n;j++)

                   {

                            Z[i][j]=X[i][j]-Y[i][j];

                   }

         }

}

 

//strassen函数(递归)

void strassen(int n,float A[][N],floatB[][N],float C[][N])

{

         floatA11[N][N],A12[N][N],A21[N][N],A22[N][N];

         floatB11[N][N],B12[N][N],B21[N][N],B22[N][N];

         floatC11[N][N],C12[N][N],C21[N][N],C22[N][N];

         floatM1[N][N],M2[N][N],M3[N][N],M4[N][N],M5[N][N],M6[N][N],M7[N][N];

         floatAA[N][N],BB[N][N],MM1[N][N],MM2[N][N];

 

         inti,j;

 

         if(n==2)

         {

                   //按通常的矩阵乘法计算C=AB

                  MATRIX_MULTIPLY(A,B,C);

         }

         else

         {

                   //将矩阵A和B分为四块

                   for(i=0;i<n/2;i++)

                   {

                            for(j=0;j<n/2;j++)

                            {

                                     A11[i][j]=A[i][j];

                                     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];

                            }

                   }

 

                   //计算M1,...M7

                   //M1=A11(B12-B22)

                   MATRIX_SUB(n/2,B12,B22,BB);

                   strassen(n/2,A11,BB,M1);

 

                   //M2=(A11+A12)B22

                   MATRIX_ADD(n/2,A11,A12,AA);

                   strassen(n/2,AA,B22,M2);

 

                   //M3=(A21+A22)B11

                   MATRIX_ADD(n/2,A21,A22,AA);

                   strassen(n/2,AA,B11,M3);

 

                   //M4=A22(B21-B11)

                   MATRIX_SUB(n/2,B21,B11,BB);

                   strassen(n/2,A22,BB,M4);

 

                   //M5=(A11+A22)(B11+B22)

                   MATRIX_ADD(n/2,A11,A22,AA);

                   MATRIX_ADD(n/2,B11,B22,BB);

                   strassen(n/2,AA,BB,M5);

 

                   //M6=(A12-A22)(B21+B22)

                   MATRIX_SUB(n/2,A12,A22,AA);

                   MATRIX_ADD(n/2,B21,B22,BB);

                   strassen(n/2,AA,BB,M6);

 

                   //M7=(A11-A21)(B11+B12)

                   MATRIX_SUB(n/2,A11,A21,AA);

                   MATRIX_ADD(n/2,B11,B12,BB);

                   strassen(n/2,AA,BB,M7);

 

                   //计算C11,C12,C21,C22

                   //C11=M5+M4-M2+M6

                   MATRIX_ADD(N/2,M5,M4,MM1);

                   MATRIX_SUB(N/2,M2,M6,MM2);

                   MATRIX_SUB(N/2,MM1,MM2,C11);

 

                   //C12=M1+M2

                   MATRIX_ADD(N/2,M1,M2,C12);

 

                   //C21=M3+M4

                   MATRIX_ADD(N/2,M3,M4,C21);

 

                   //C22=M5+M1-M3-M7

                   MATRIX_ADD(N/2,M5,M1,MM1);

                   MATRIX_ADD(N/2,M3,M7,MM2);

                   MATRIX_SUB(N/2,MM1,MM2,C22);

 

                   //计算结果送回C[N][N]

                   for(i=0;i<n/2;i++)

                   {

                            for(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];

                            }

                   }

         }

}


【分治算法】【Python实现】Strassen矩阵乘法 阅读详情

相关推荐

Strassen’s 矩阵乘法—分治法实现

内容会持续更新,有错误的地方欢迎指正,谢谢!前言:博主最近正在学习《算法》这门专业课程,这是该课程的第二次上机题目,我把自己的解题方法分享给大家,欢迎讨论!题目: 1.比较数学定义的矩阵乘法算法和Strassen’s 矩阵乘法算法的效率; 2.自主生成两个16*16的矩阵,输出Strassen’s 矩阵乘法算法结果。数学定义的矩阵乘法算法:利用三个for循环来解决,时间复杂度为O(n^3)。数学

陈云佳的专栏 6063

Strassen矩阵乘法

Strassen矩阵乘法矩阵乘法是线性代数中最常见的运算之一,它在数值计算中有广泛的应用。若A和B是2个n×n的矩阵,则它们的乘积C=AB同样是一个n×n的矩阵。A和B的乘积矩阵C中的元素C[i,j]定义为: 若依此定义来计算A和B的乘积矩阵C,则每计算C的一个元素C[i,j],需要做n个乘法和n-1次加法。因此,求出矩阵C的n2个元素所需的计算时间为0(n3)。60年代末

Ben的专栏 2258

1.2 矩阵乘法Strassen算法

亲自用python实现了Strassen算法,并做了大矩阵分治。

你的指尖有改变世界的力量 3210

strassen算法(矩阵乘法)

#include #include using namespace std; class Matrix { public:      Matrix(int);      Matrix(const Matrix&);      Matrix& operator=(const Matrix&);      int operator()(int,int) const;

YueXiaMenTui的专栏 982

矩阵相乘的Strassen算法

LZ是菜鸟一枚,非计算机专业学生,正在学习算法导论这本书,希望养成学习完一个问题之后进行归纳整理的习惯,所以开始了博客之路,内容都是最基础的笔记,如果发现错误希望你能慷慨的帮我指出来,这样我才能改正并进步哦。 话不多说 下面是第二次记录么么哒问题描述实现两个nn维方阵A=(aij)n×nA=(a_{ij})_{n\times n}和B=(bij)n×nB=(b_{ij})_{n\times n}的

winnerlyn的博客 5131

strassen矩阵乘法

Strassen矩阵乘法简要解析 Strassen矩阵乘法具体描述如下: 两个n×n 阶的矩阵A与B的乘积是另一个n×n 阶矩阵C,C可表示为假如每一个C(i, j) 都用此公式计算,则计算C所需要的操作次数为n3 m+n2 (n- 1) a,其中m表示一次乘法,a 表示一次加法或减法。 为了使讨论简便,假设n 是2的幂(也就是说, n是1,2,4,8,1 6,...)。 首先,假

chenglinhust的专栏 5394

《算法导论》第四章-矩阵乘法的Strassen算法(含C++代码)

本文为《算法导论》第四章-4.2-矩阵乘法的Strassen方法笔记,欢迎大家参考。

Toby的博客 2927

Strassen矩阵乘法的C语言算法实现

矩阵乘法是高等代数中的重要基本运算,本文将介绍Strassen矩阵乘法的基本原理和用C语言进行算法实现的过程。

fufufunny的博客 2844

4*4矩阵运算

/Keypad connection: #define col0 PIN_B3 #define col1 PIN_B2 #define col2 PIN_B1 #define col3 PIN_B0 #define row0 PIN_B7 #define row1 PIN_B6 #define row2 PIN_B5 #define row3 PIN_B4 #define num_col 4 // Keypad layout: char const KEYS[4][4] = {{1,2,3,13},

xinshuwei的博客 7451

矩阵相乘的strassen算法c语言实现

矩阵相乘,普通算法的时间界是10的3此方,而采用strassen算法可提高运算效率。

【STM32/GD32】Keil uVision生成bin文件:从编译选项到Bootloader升级实战

本文详细讲解了如何在Keil uVision中配置STM32/GD32工程,使其在编译后自动生成Bootloader升级所需的bin文件。通过解析fromelf工具的使用、构建后命令的配置以及内存布局规划,深入阐述了bin文件在固件升级中的核心作用,并提供了串口Bootloader的实战框架与常见问题解决方案。

weixin_29190169的博客 391

《算法导论》学习(四)---- 矩阵乘法的Strassen(斯特拉森)算法

矩阵乘法可以采用分治的策略。这里提供了两个分治策略的解决n∗nn*nn∗n矩阵之间乘法的算法1.矩阵乘法的普通递归方法2.矩阵乘法的Strassen(斯特拉森)方法但是着两个方法的缺点是只能是两个n∗nn*nn∗n矩阵的乘法,同时n必须为2的幂之后也对这两个算法进行了时间复杂度上的分析。......

weixin_52042488的博客 5959

Python Selenium自动化浏览器实战:从环境搭建到高级技巧

浏览器自动化是现代软件开发与数据处理中的关键技术,它通过程序模拟用户操作,实现网页交互的自动化执行。其核心原理是基于WebDriver协议,通过驱动程序与浏览器进行通信,从而控制浏览器的各种行为。这项技术的价值在于能够将重复性高、耗时长的Web操作转化为可编程、可复用的脚本,极大提升工作效率和准确性。在应用场景上,它广泛覆盖了Web自动化测试、数据采集与爬虫、日常办公流程自动化以及RPA(机器人流程自动化)等多个领域。本文聚焦于Python环境下Selenium这一经典工具,深入讲解其环境配置、八大元素定位

anwenzhao0749的博客 445

详解矩阵乘法中的Strassen算法

机器学习中需要训练大量数据,涉及大量复杂运算,例如卷积、矩阵等。这些复杂运算不仅多,而且每次计算的数据量很大,如果能针对这些运算进行优化,可以大幅提高性能。 一、矩阵乘法 如下图所示: Figure 1 Matrix Multiplication 二、Strassen算法 Figure 2 x^3 vs. x^2.807 三、Strassen原理详解 Strassen算法正是从这个角度出发,实现了降低算法复杂度! 实现步骤可以分为以下4步: 3.1 S...

u011250186的博客 8964

90+个各种疾病相关医疗数据集

含新冠、传染病、医学图像等

2万+

ABAP CDS SELECT, parameters 全面解析:把参数化视图玩明白(含可运行示例)

这篇技术博客介绍了ABAP CDS中参数化视图的用法与实践。文章从业务需求出发,解释了参数化视图的必要性,并详细说明了语法规则、参数类型匹配、视图内部参数引用等关键点。重点展示了在JOIN和ASSOCIATION中传递参数的写法,提供了航线分析的完整业务案例和可运行代码示例。文章还总结了视图实体与DDIC视图的差异、会话变量使用技巧等实践要点,特别强调了JOIN中必须显式传参的语法要求。通过真实场景演示,帮助开发者掌握参数化CDS的高效应用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 362

C语言经典算法之Strassen矩阵乘法

Strassen矩阵乘法是一种利用分治策略优化传统矩阵乘法算法的方法,由Volker Strassen于1969年提出。这种方法通过递归地将矩阵分解成更小的块,并运用特定的公式减少乘法操作的数量,从而降低了计算大型矩阵乘积的时间复杂度。然而,由于分治和合并过程引入了额外的开销,对于较小的矩阵,Strassen算法可能不如直接乘法有效率。

weixin_56154577的博客 1742

Linux加密框架中的算法和算法模式(1)——算法介绍

算法和算法模式

yangguoyu8023的博客 2031

Strassen矩阵乘法——C++

基于分治法的矩阵快速乘法---C++实现

stu_kk的博客 2097

【Unity工具篇】| 使用YooAsset接入自己的游戏项目,实现完整热更新流程

前面文章介绍了YooAsset的原理和接入官方示例文档的文章介绍,本文使用YooAsset接入自己的游戏项目做示例。 【Unity工具篇】| 资源管理插件YooAsset,原理及相关配置 【Unity工具篇】| 游戏完整资源热更新流程,YooAsset官方示例项目 具体接入方法有很多种,本文会参照官方示例 Space Shooter 太空战机DEMO 用到的方式接入自己的游戏项目。

努力前行,总会成为自己心中的那道光 1万+

解决gradle下载慢的问题

allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。而子项目可以配置自己的repositories以获取自己独需的依赖包。buildScript块的repositories主要是为了Gradle脚本自身的执行,获取脚本依赖插件。根级别的repositories主要是为了当前项目提供所需依赖包。慢的问题在于下载时链接的是官网,而官网下载速度太慢;1、解决gradle不同版本下载慢的问题。但是这个镜像站的版本不全,低版本可以用;有公司做的国内镜像站;

weixin_42551921的博客 2050

算法设计——strassen矩阵乘法(分治)

问题 求两个矩阵相乘的结果 思路 传统矩阵相乘 Strassen矩阵乘法 我们可以不断把规模大的矩阵缩小为一半的矩阵,由此减小了规模 通过减小规模,我们成功把时间复杂度为O(n^3) 降到了O(n^log7) 即O(n^2.81) 代码实现 这里我们只考虑矩阵规模为2的倍数的矩阵乘法 #include<stdio.h> #include<stdlib.h> #incl...

Doro_的博客 5966

YOLOv5源码逐行超详细注释与解读(3)——训练部分train.py

全网最详细的YOLOv5项目源码解读之训练部分train. py。全文近5万字!代码逐行注释,逐段讲解,小白入门必备!

路人贾的博客 3万+

算法重拾之路——strassen矩阵乘法

算法重拾之路——strassen矩阵乘法

继续激情,继续奋斗。 4209

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【算法设计与分析】(四)Strassen 矩阵

在矩阵运算领域,传统矩阵乘法时间复杂度为O3处理大规模矩阵时效率低下。Strassen 矩阵乘法采用分治策略,将大矩阵乘法分解为小矩阵运算,通过计算 7 个中间矩阵,减少乘法次数,将时间复杂度降至O(n log 2 7)≈O(n 2.807)。该算法在计算机图形学、科学计算、机器学习等领域应用广泛,可提升图形渲染、科学研究计算及模型训练速度。不过,它在矩阵规模小时效率欠佳,且实现复杂、内存需求大。为此,后续出现多种改进策略优化其性能 。

2402_83322742的博客 2187

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 算法导论之三最大子数组问题
下一篇: 算法导论之六栈与队列
mengrennwpu
博客等级 码龄15年 262粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mengrennwpu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值