矩阵Strassen 算法

ops/2025/1/16 0:08:46/

Strassen 算法
不要与多项式乘法的 Schönhage-Strassen 算法混淆。
线性代数中,以 Volker Strassen 命名的 Strassen 算法是一种矩阵乘法算法。对于大型矩阵,它比标准矩阵乘法算法更快,具有更好的渐近复杂度,尽管朴素算法通常更适合较小的矩阵。对于极大矩阵,Strassen 算法比已知最快的算法慢,但这种银河算法在实践中没有用,因为它们对于实际大小的矩阵要慢得多。对于小矩阵,存在更快的算法
Strassen 算法适用于任何环,例如加/乘,但不适用于所有半环,例如最小加或布尔代数,其中朴素算法仍然有效,以及所谓的组合矩阵乘法。
历史
Volker Strassen 在 1969 年首次发布了这个算法,从而证明了n3通用矩阵乘法算法不是最佳的。Strassen 算法的发布导致了对矩阵乘法的更多研究,这导致了渐近下界和改进的计算上限。

算法
在这里插入图片描述

让AB是环上的两个方形矩阵R,例如,其项为整数或实数的矩阵矩阵乘法的目标是计算矩阵乘积C=AB。以下算法说明假定所有这些矩阵的大小都是 2 的幂
在这里插入图片描述

但这只是概念上必要的 — 如果矩阵A,B不是类型2nX2n,“缺失的”行和列可以用零填充以获得大小为 2 的幂的矩阵 — 尽管该算法的实际实现在实践中不会这样做。
Strassen 算法分区A,B和C转换为大小相等的块矩阵
在这里插入图片描述

在这里插入图片描述
。朴素的算法为:
在这里插入图片描述

这种构造不会减少乘法的次数:仍然需要 8 次矩阵块的乘法来计算Cij矩阵,则使用标准矩阵乘法时所需的乘法次数相同。
Strassen 算法定义了新值:
在这里插入图片描述

仅使用 7 次乘法(每次 1 次Mk) 而不是 8。我们现在可以将Cij在Mk:
在这里插入图片描述

我们递归迭代这个除法过程,直到子矩阵退化为数字(环的元素R). 如上所述,如果原始矩阵的大小不是 2 的幂,则生成的乘积将具有零行和零列,就像A和B,然后这些将在此时被剥离以获得(更小的)矩阵C我们真的很想要。
Strassen 算法的实际实现对于足够小的子矩阵切换到标准的矩阵乘法方法,这些算法的效率更高。Strassen 算法更有效的特定交叉点取决于特定的实现和硬件。早期的作者估计,Strassen 算法对于宽度为 32 到 128 的矩阵,可以优化实现。然而,据观察,这个交叉点近年来一直在增加,2010 年的一项研究发现,与高度优化的传统乘法相比,即使是 Strassen 算法的单个步骤在当前架构上通常也没有好处,直到矩阵大小超过 1000 或更多,即使对于几千个矩阵大小,好处通常充其量也是微不足道的(大约 10% 或更少)。最近的一项研究(2016 年)观察到,小至 512 的矩阵有好处,好处约为 20%。

对 Strassen 算法的改进
更多信息:矩阵乘法算法 § 次三次算法矩阵乘法的计算复杂性
通过使用 Winograd 在 1971 年发现的以下形式,可以减少矩阵添加的数量:
在这里插入图片描述
在这里插入图片描述

这会将矩阵加法和减法的数量从 18 个减少到 15 个。矩阵乘法的个数仍然是 7,渐近复杂度是相同的。
算法在 2017 年进一步优化, 将每步的矩阵加法次数减少到 12 次,同时保持矩阵乘法的次数,并在 2023 年再次优化:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后推荐:一个GPU矩阵乘法运算工具-GPUMatrix1.26【Windows版本】
https://download.csdn.net/download/axecute/90266772
在这里插入图片描述


http://www.ppmy.cn/ops/150417.html

相关文章

59_Redis键值设计

1.拒绝BigKey BigKey通常以Key的大小和Key中成员的数量来综合判定。例如: Key本身的数据量过大:一个String类型的Key,它的值为5MB。Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10000个。Key中成员的数据量过大:一个Hash类型的Key,它的成员数量虽然只有1000个但…

ref() 和 reactive() 区别

ref() 和 reactive() 都是 Vue 3 中用于创建响应式数据的方法,但它们之间存在一些关键差异。 首先,ref() 用于创建响应式的标量值,比如数字、字符串、布尔值等基本数据类型,以及对象和数组等复杂数据类型。当你使用 ref() 时&…

了解Webpack:现代前端开发的静态模块打包器

在现代前端开发中,Webpack已成为不可或缺的工具之一。作为一个静态模块打包器(module bundler),Webpack通过分析和处理项目中的资源依赖关系,将它们打包成一个或多个bundle(捆绑包),…

【Linux】9.Linux第一个小程序进度条

文章目录 Linux第一个小程序-进度条相关知识创建程序1. 程序原理2. 基础程序原理实现 井号进度条代码实现箭头进度条代码实现多重进度条代码实现 Linux第一个小程序-进度条 相关知识 特殊符号: $ 和 $^ 回车换行: 回车和换行其实…

STM32程序发生异常崩溃时,怎样从串口输出当时的程序调用栈等信息

当STM32程序发生异常崩溃时,为了从串口输出当时的程序调用栈信息,并使用Keil等工具确定具体的函数信息,你可以按照以下步骤操作: 启用调试信息输出: 在STM32程序中,你需要先确保启用了调试信息的输出。这通…

微信小程序-Docker+Nginx环境配置业务域名验证文件

在实际开发或运维工作中,我们时常需要在 Nginx 部署的服务器上提供一个特定的静态文件,用于域名验证或第三方平台验证。若此时使用 Docker 容器部署了 Nginx,就需要将该验证文件正确地映射(挂载)到容器中,并…

iOS - Objective-C语言的动态性

Objective-C 的动态性主要由以下几个关键特性和机制支撑: 1. 动态消息传递 // 消息传递机制 id objc_msgSend(id self, SEL _cmd, ...) {// 1. 获取类信息Class cls object_getClass(self);// 2. 查找方法实现IMP imp lookUpImpOrForward(cls, _cmd);// 3. 执行…

ip属地出省会变吗?怎么出省让ip属地不变

在数字化时代,IP属地作为网络身份的一个重要标识,不仅影响着我们的网络体验,还与网络安全、隐私保护等方面息息相关。当我们跨省移动时,是否会遇到IP属地变化的问题?如果希望保持IP属地不变,又该如何操作呢…