strassen矩阵乘法c语言代码,计算机算法:Strassen矩阵乘法
简介
Strassen矩阵乘法是典型的分而治之算法。我们已经见过诸如归并排序,Karatsuba大数乘法的分而治之的算法。让我们再次领略一下分而治之的含义。
与动态编程的“分散”得到子解决方案是为了得到最终的解决方案不同。在这里,我们更多的是谈论如何把子方案拼接起来。一般问题的子问题的解决方案是平等的,以某种方式定义它们的合并。
归并排序算法就是一个典型的例子。归并排序中,有两个有序表,想要把合并为一个有序表。当然,归并排序中最棘手的问题就是合并本身。通过2个有序表A和B,把A,B中的每个子序列合并。说的有点偏离话题了,但是这就是归并排序的弱点,尽管归并排序最坏的时间复杂度是O(n,log(n)),快速排序通常是首选,因为它没有合并。快速排序只是连接两个子数组。注意,在快序排序中子序列的长度是一般情况下是不同的。尽管它的最坏的时间复杂度是O(n ^ 2),通常优于归并排序。
上面这个简单的例子向我们说明了,有时候合并两个子问题的解决方案实际上并不是一项简单的任务。因此在使用任何分而治之方法时,必须小心。
历史
施特拉森,出生于1936年,德国数学家。他有关概率的作品很知名,但是在计算机科学和算法领域中也很知名,因为他的矩阵算法。他的矩阵算法仍然是优于一般矩阵乘法算法主要方法。
1969,拉森第一次公开了这个算法并证明了n ^ 3算法并不是最优的。实际上拉森给出的解决方案只是稍微好一些。但他的贡献是巨大的,因为这引发了更多的关于矩阵乘法的研究,产生了更快的方法,即Coppersmith-Winograd算法,时间复杂度为O(n ^ 2,3737)。
综述
通常情况下,两个矩阵A[NxN]和B[NxN]相乘的算法是相当简单的。尽管这要比两个数相乘难一些,尽管它是不可交换的,但仍然非常简单,,只是算起来缓慢。
我们先来定义一个矩阵 A[NxN]。 当我们谈及NxN的矩阵时,通常认为是一个N行乘N列的正方形网格。在每一个A[i][j]中填入值。
当然,作为开发者,我们可以把矩阵作为二维数组。
// PHP two-dimensional array
$a = array(
0 => array($v1, $v2, $v3, $v4),
1 => array($v5, $v6, $v7, $v8),
2 => array($v9, $v10, $v11, $v12),
);
不要忘记NxN矩阵仅是一个矩阵的例子。同样我们可以建立其他任何大小的矩阵NxM(N < > M)。
然而矩阵相乘中,矩阵的大小是至关重要。为什么呢?
正如我上面所说的矩阵相乘与数字相乘不同。首先,矩阵乘法中两个矩阵是不能交换的。
其次,是矩阵A乘矩阵B的方式
这仅适用于 NxN的矩阵,看一下矩形矩阵相乘的问题。事实上,这是不可能发生,除非矩阵A的第二维度不相等矩阵B的第一个维度。
希望我们现在谈的是平方矩阵都有完全相同的维度。
我们已经知道两个平方矩阵(具有相同维度NxN)如何相乘了,现在让我们评估时间复杂度的通用算法。
仅当如下情况,AB = C:
C[i][j] = sum(A[i][k] * B[k][j]) for k = 0 .. n
有n ^ 3的操作。让我们试着找出一个分而治之的方法。
事实上,在矩阵下,这并不困难,因为我们知道矩阵可以分为较小的子矩阵。
得到如下结果:
再一次,同样的复杂性——我们得到了8个产出和4个和。
当然,为了获得更快的解决方案,我们看一下1969年Strassen所做的。他定义了P1,P2,P3,P4,P5,P6和P7如下图。
复杂度
Strassen的算法比一般矩阵乘法算法稍微快一些。一般的算法的时间复杂度是O(n ^ 3),而Strassen的算法的复杂度是O(n ^ 2.80)。
你可以看到在下面的图表速度只是稍微快一些,即使对于大的n。
应用
尽管比计算机科学,这个算法似乎更接近纯数学。无论在哪使用NxN的数组,我们都可以从矩阵乘法中受益。
另一方面Strassen的算法并不比一般的n ^ 3矩阵乘法算法快多少。维度对于小n(通常是n < 45)的问题,一般算法是更好的选择。然而从图中可以看出,当n > 100以上是,差别还是非常大的。
当我们谈论邻接矩阵图| V | = n时,通常使用NxN数组,一些图表的算法实际上取决于矩阵乘法。
作者:Stoimen
strassen矩阵乘法c语言代码,计算机算法:Strassen矩阵乘法相关推荐
- c语言课程设计 矩阵乘法,C语言课程设计(论文)-矩阵乘法.doc
C语言课程设计(论文)-矩阵乘法 学 号: 课 程 设 计 题 目矩阵乘法 教 学 院计算机学院 专 业09计算机科学与技术 班 级09计科(1)班 姓 名 指导教师 2010年12月25日 课程设计 ...
- C语言求二阶矩阵最小值,C语言科学计算入门之矩阵乘法的相关计算
1.矩阵相乘矩阵相乘应满足的条件: (1) 矩阵A的列数必须等于矩阵B的行数,矩阵A与矩阵B才能相乘: (2) 矩阵C的行数等于矩阵A的行数,矩阵C的列数等于矩阵B的列数: (3) 矩阵C中第i行第j ...
- 卡尔曼滤波算法及c语言代码,卡尔曼滤波算法及C语言代码
卡尔曼滤波算法及C语言代码 卡尔曼滤波简介及其算法实现代码 卡尔曼滤波算法实现代码(C,C++分别实现) 卡尔曼滤波器简介 近来发现有些问题很多人都很感兴趣.所以在这里希望能尽自己能力跟大家讨论一些力 ...
- mpi大规模矩阵乘法C语言,基于MPI的大规模矩阵乘法问题
转载请注明出处. /* Function:基于MPI的大规模矩阵乘法问题; Time: 19/03/25; CodeMan:ZhiHong Cc; */ #include #include #incl ...
- 独立按键和矩阵按键c语言,单片机独立按键与矩阵按键原理图
当前位置:电工之家 > 电工知识 > 单片机 > 正文 单片机独立按键与矩阵按键原理图 时间:2017-02-22 12:40 来源:电工之家 单片机独立按键与矩阵按键原理图 独立按 ...
- c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...
以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...
- 平移变换计算机图形学c语言代码,计算机图形学第一次作业——平移,缩放和旋转...
一. MFC 框架下使用 OpenGL 绘图演示平移.旋转.缩放等操作的具体实现 二. 实现算法 绘制的图形以各种顶点及顶点之间的线.面构成 要想对这些图形进行操作,只需要对各种顶点在坐标系中的坐标进 ...
- C语言布斯乘法算法,布斯Booth算法带符号位的乘法verilog语言实现booth算法
Booth算法的推倒表示看不懂,举例说明:算法的计算过程. 求M*Q的值 M=5,Q=6 按二进制分解M和Q :M3M2M1M0×Q3Q2Q1Q0: 0110×0101 (有符号数用补码表示,最高位表 ...
- 爬山搜索法c语言代码,模拟退火算法和爬山算法 – 算法大全
##一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优 ...
最新文章
- 报告:采用人工智能并不意味着成功
- 聊聊你知道和不知道的相关性系数
- Condition类必须配合Mutex使用,why?
- 注意!这些行为将会影响征信
- Java后端 + 百度SDK实现人脸识别
- 参考的datalist分页helper
- 深度模型不work?这有一份超全的Debug检查清单
- Java-java.util.concurrent.LinkedBlockingQueue
- VS、C#配置R语言开发环境
- 录屏软件|录屏软件下载|录屏软件哪个好用电脑无水印版
- 大一计算机论文_大学计算机论文
- 计算机科学与技术专业哪个大学是王牌,985的大学最好的专业有哪些?附985大学王牌专业一览表...
- flyway命名规范
- 详细解读Latent Diffusion Models:原理和代码
- 莫比乌斯反演学习笔记
- Mybati从持久层到大气层
- php 获取qq头像,php只需要一个QQ号就可以获得用户信息(昵称、头像)
- PageHelper这种情况下有坑
- 2022无线WIFI路由器的不常用功能整理(带USB接口,可插手机卡)适合短期出差、拉有线网络不方便等。
- 行之有效的Golang编码规范
热门文章
- [转]写一个块设备驱动(第六章)
- Ubuntu下minicom的安装与使用
- AI之循环神经网络进阶
- lumia手机邮件hotmail服务器设置,采用Windows10Mobile系统的Lumia手机用户手册-Microsoft.PDF...
- MySQL - java链接mysql8 并兼容链接mysql5 亲测可用
- ES 的 unassigned shards 核心处理方案
- Import Error: from torchtext.data import to_map_style_dataset解决方案
- Python进程池的返回值
- 【操作系统】互斥与同步,吃水果,吃巧克力问题(C++源码)
- Android3.1后Boot_COMPLETED广播不响应的问题