矩阵乘法的Strassen算法

伪代码

  1. Strassen (A, B)
  2. n = A.rows
  3. let C be a n*n matrix
  4. if n == 1
  5.   C11 = A11 * B11
  6. else
  7. S1 = B12 - B22
  8. S2=A11+A12;
  9. S2=A11+A12;
  10.   S3=A21+A22;
  11.   S4=B21-B11;
  12.   S5=A11+A22;
  13.   S6=B11+B22;
  14.   S7=A12-A22;
  15. S8=B21+B22;
  16.   S9=A11-A21;
  17.   S10=B11+B12;
  18. P1 = Strassen(A11 * S1)
  19. P2 = Strassen(S2 * B22)
  20. P3 = Strassen(S3 * B11)
  21. P4 = Strassen(A22 * S4)
  22. P5 = Strassen(S5 * S6)
  23. P6 = Strassen(S7 * S8)
  24. P7 = Strassen(S9 * S10)
  25. C11 = P5 + P4 - P2 + P6
  26. C12 = P1 + P2
  27. C21 = P3 + P4
  28. C22 = P5 + P1 - P3 - P4
  29. return C

实现

时间: 2024-10-11 01:22:09

矩阵乘法的Strassen算法的相关文章

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

第四章 分治策略 4.2 矩阵乘法的Strassen算法

package chap04_Divide_And_Conquer; import static org.junit.Assert.*; import java.util.Arrays; import org.junit.Test; /** * 矩阵相乘的算法 * * @author xiaojintao * */ public class MatrixOperation { /** * 普通的矩阵相乘算法,c=a*b.其中,a.b都是n*n的方阵 * * @param a * @param b

矩阵乘法的Strassen算法及时间复杂度

[问题]普通方法计算矩阵相乘,时间复杂度为O(n^3),请设计优化算法. [Strassen算法] [时间复杂度]

算法导论-矩阵乘法-strassen算法

目录 1.矩阵相乘的朴素算法 2.矩阵相乘的strassen算法 3.完整测试代码c++ 4.性能分析 5.参考资料 内容 1.矩阵相乘的朴素算法 T(n) = Θ(n3) 朴素矩阵相乘算法,思想明了,编程实现简单.时间复杂度是Θ(n^3).伪码如下 1 for i ← 1 to n 2 do for j ← 1 to n 3 do c[i][j] ← 0 4 for k ← 1 to n 5 do c[i][j] ← c[i][j] + a[i][k]⋅ b[k][j] 2.矩阵相乘的stra

验证矩阵乘法

如何使用随机性矩阵乘法,随机算法在验证多项式的恒等问题比确定算法要快,而且在准确性上面也是可以接受的.假设有A,B,C三个n*n的矩阵.为了方便起见假定对模2的整数计算.我们想要快速的验证AB=C.首先想到的方法就是通过矩阵计算AB得到的矩阵与矩阵C对比.但是简单的矩阵乘法的时间复杂度为O(n^3),就算是经过优化的矩阵乘法算法的时间复杂度为O(n^2.37).显然这样的时间复杂度不为我们所接受. 我们可以再次使用随机算法来在一个可以接受的出错概率下来验证.算法首先抽取一个向量r=(r1,r2,

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

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 第一章:分治与递归 STRASSEN矩阵乘法 算法描述: 矩阵乘法是线性代数中最常见的问题之一,它在数值计算中有广泛的应用.设A 和 B 是两个n × n矩阵,它们的乘积AB同样是一个n×n矩阵.A和B的乘积矩阵C 中的元素cij定义为: 按照这个定义来看,计算

strassen算法——矩阵乘法

strassen算法可以看做是分治递归法求解矩阵乘法的改进. 利用分治递归法求解矩阵乘法的过程大致: 矩阵C = A * B(A.B.C都是n x n矩阵) 可以发现(A11 * B11).(A12 * B21)--等子矩阵的乘法运算需要继续递归.上面有8个乘法,所以需要递归8次. 时间复杂度关系公式 T(n) = 8T(n/2) + O(n^2),这里8T(n/2)是8次递归,O(n^2)是求C11,C12,C21,C22所做的加法,因为(A11*B11).(A12*B21)--都有n^2 /

Strassen优化矩阵乘法(复杂度O(n^lg7))

按照算法导论写的 还没有测试复杂度到底怎么样 不过这个真的很卡内存,挖个坑,以后写空间优化 还有Matthew Anderson, Siddharth Barman写了一个关于矩阵乘法的论文 <The Coppersmith-Winograd Matrix Multiplication Algorithm> 提出了矩阵乘法的O(n^2.37)算法,有时间再膜吧orz #include <iostream> #include <cstring> #include <

Strassen矩阵乘法

Strassen矩阵乘法是通过递归实现的,它将一般情况下二阶矩阵乘法(可扩展到n阶,但Strassen矩阵乘法要求n是2的幂)所需的8次乘法降低为7次,将计算时间从O(nE3)降低为O(nE2.81). 矩阵C = A*B,可写为C11 = A11B11 + A12B21C12 = A11B12 + A12B22C21 = A21B11 + A22B21C22 = A21B12 + A22B22如果A.B.C都是二阶矩阵,则共需要8次乘法和4次加法.如果阶大于2,可以将矩阵分块进行计算.耗费的时