简介

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矩阵乘法相关推荐

  1. c语言课程设计 矩阵乘法,C语言课程设计(论文)-矩阵乘法.doc

    C语言课程设计(论文)-矩阵乘法 学 号: 课 程 设 计 题 目矩阵乘法 教 学 院计算机学院 专 业09计算机科学与技术 班 级09计科(1)班 姓 名 指导教师 2010年12月25日 课程设计 ...

  2. C语言求二阶矩阵最小值,C语言科学计算入门之矩阵乘法的相关计算

    1.矩阵相乘矩阵相乘应满足的条件: (1) 矩阵A的列数必须等于矩阵B的行数,矩阵A与矩阵B才能相乘: (2) 矩阵C的行数等于矩阵A的行数,矩阵C的列数等于矩阵B的列数: (3) 矩阵C中第i行第j ...

  3. 卡尔曼滤波算法及c语言代码,卡尔曼滤波算法及C语言代码

    卡尔曼滤波算法及C语言代码 卡尔曼滤波简介及其算法实现代码 卡尔曼滤波算法实现代码(C,C++分别实现) 卡尔曼滤波器简介 近来发现有些问题很多人都很感兴趣.所以在这里希望能尽自己能力跟大家讨论一些力 ...

  4. mpi大规模矩阵乘法C语言,基于MPI的大规模矩阵乘法问题

    转载请注明出处. /* Function:基于MPI的大规模矩阵乘法问题; Time: 19/03/25; CodeMan:ZhiHong Cc; */ #include #include #incl ...

  5. 独立按键和矩阵按键c语言,单片机独立按键与矩阵按键原理图

    当前位置:电工之家 > 电工知识 > 单片机 > 正文 单片机独立按键与矩阵按键原理图 时间:2017-02-22 12:40 来源:电工之家 单片机独立按键与矩阵按键原理图 独立按 ...

  6. c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...

    以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...

  7. 平移变换计算机图形学c语言代码,计算机图形学第一次作业——平移,缩放和旋转...

    一. MFC 框架下使用 OpenGL 绘图演示平移.旋转.缩放等操作的具体实现 二. 实现算法 绘制的图形以各种顶点及顶点之间的线.面构成 要想对这些图形进行操作,只需要对各种顶点在坐标系中的坐标进 ...

  8. C语言布斯乘法算法,布斯Booth算法带符号位的乘法verilog语言实现booth算法

    Booth算法的推倒表示看不懂,举例说明:算法的计算过程. 求M*Q的值 M=5,Q=6 按二进制分解M和Q :M3M2M1M0×Q3Q2Q1Q0: 0110×0101 (有符号数用补码表示,最高位表 ...

  9. 爬山搜索法c语言代码,模拟退火算法和爬山算法 – 算法大全

    ##一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优 ...

最新文章

  1. 报告:采用人工智能并不意味着成功
  2. 聊聊你知道和不知道的相关性系数
  3. Condition类必须配合Mutex使用,why?
  4. 注意!这些行为将会影响征信
  5. Java后端 + 百度SDK实现人脸识别
  6. 参考的datalist分页helper
  7. 深度模型不work?这有一份超全的Debug检查清单
  8. Java-java.util.concurrent.LinkedBlockingQueue
  9. VS、C#配置R语言开发环境
  10. 录屏软件|录屏软件下载|录屏软件哪个好用电脑无水印版
  11. 大一计算机论文_大学计算机论文
  12. 计算机科学与技术专业哪个大学是王牌,985的大学最好的专业有哪些?附985大学王牌专业一览表...
  13. flyway命名规范
  14. 详细解读Latent Diffusion Models:原理和代码
  15. 莫比乌斯反演学习笔记
  16. Mybati从持久层到大气层
  17. php 获取qq头像,php只需要一个QQ号就可以获得用户信息(昵称、头像)
  18. PageHelper这种情况下有坑
  19. 2022无线WIFI路由器的不常用功能整理(带USB接口,可插手机卡)适合短期出差、拉有线网络不方便等。
  20. 行之有效的Golang编码规范

热门文章

  1. [转]写一个块设备驱动(第六章)
  2. Ubuntu下minicom的安装与使用
  3. AI之循环神经网络进阶
  4. lumia手机邮件hotmail服务器设置,采用Windows10Mobile系统的Lumia手机用户手册-Microsoft.PDF...
  5. MySQL - java链接mysql8 并兼容链接mysql5 亲测可用
  6. ES 的 unassigned shards 核心处理方案
  7. Import Error: from torchtext.data import to_map_style_dataset解决方案
  8. Python进程池的返回值
  9. 【操作系统】互斥与同步,吃水果,吃巧克力问题(C++源码)
  10. Android3.1后Boot_COMPLETED广播不响应的问题