这里主要是给出实现方法,至于算法的介绍,可以参考@

金戈大王的介绍。
下面算法是有bug的,虽然已经对一些非n*n的矩阵做出了处理,但是没有完善,当计算非n*n的矩阵是会出现数据越界的异常的。所以两个相乘的矩阵必须是n*n的。
不啰嗦,下面直接贴出Java的实现方法:

//调用入口:

         public static int[][] StrassenMulti(int a [][], int b[][]){int acow = a.length, acol = a[0].length, bcow = b.length, bcol = b[0].length;if(acow!=acol || bcow != bcol || acow != bcow) return MatrixMulti(a,b);if((acow &(acow -1 )) != 0) return MatrixMulti(a,b);//不是2的幂//只有符合2的幂才满足Strassen算法使用条件if(acow == 2) return MatrixMulti(a,b);else {int[][] A11 = new int[acow/2][acow/2];int[][] A12 = new int[acow/2][acow/2];int[][] A21 = new int[acow/2][acow/2];int[][] A22 = new int[acow/2][acow/2];nnMatrixSplitTo4Block(a,A11,A12,A21,A22);int[][] B11 = new int[acow/2][acow/2];int[][] B12 = new int[acow/2][acow/2];int[][] B21 = new int[acow/2][acow/2];int[][] B22 = new int[acow/2][acow/2];nnMatrixSplitTo4Block(b,B11,B12,B21,B22);int [][]S1 = MatrixNeg(B12 ,B22);int [][]S2 = MatrixPlus(A11 , A12);int [][]S3 = MatrixPlus(A21 , A22);int [][]S4 = MatrixNeg(B21 , B11);int [][]S5 = MatrixPlus(A11 , A22);int [][]S6 = MatrixPlus(B11 ,B22);int [][]S7 = MatrixNeg(A12 , A22);int [][]S8 = MatrixPlus(B21 , B22);int [][]S9 = MatrixNeg(A11 , A21);int [][]S10 = MatrixPlus(B11 , B12);int [][]P1 = StrassenMulti(A11 , S1);int [][]P2 = StrassenMulti(S2 , B22);int [][]P3 = StrassenMulti(S3 , B11);int [][]P4 = StrassenMulti(A22 , S4);int [][]P5 = StrassenMulti(S5 ,S6);int [][]P6 = StrassenMulti(S7 , S8);int [][]P7 = StrassenMulti( S9 , S10);int [][]C11 = MatrixPlus(MatrixNeg(MatrixPlus(P5, P4), P2) , P6);int [][]C12 = MatrixPlus(P1 , P2);int [][]C21 = MatrixPlus(P3,  P4);int [][]C22 = MatrixNeg(MatrixNeg(MatrixPlus(P5 , P1) , P3) , P7);return MatrixBlockPlus(C11,C12,C21,C22);}}
//将矩阵分为四个子矩阵public static void nnMatrixSplitTo4Block(int [][]src, int [][]A11, int [][]A12, int [][]A21, int [][]A22){int n = src.length;for(int i = 0; i<A11.length+A21.length; i++)for(int j = 0; j<A11[0].length+A12[0].length; j++){if(i<A11.length){if(j<A11[0].length){A11[i][j] = src[i][j];}else{A12[i][j-A11[0].length] = src[i][j];}}else{if(j<A21[0].length){A21[i-A11.length][j] = src[i][j];}else{A22[i-A11.length][j-A12[0].length] = src[i][j];}} }}
//将四个矩阵合并为一个矩阵public static int[][] MatrixBlockPlus(int [][]A11, int [][]A12, int [][]A21, int [][]A22){if(A11[0].length+A12[0].length != A21[0].length+A22[0].length || A11.length+A21.length != A12.length+A22.length) return null;int result[][] = new int[A11.length+A21.length][A11[0].length+A12[0].length];for(int i = 0; i<A11.length+A21.length; i++)for(int j = 0; j<A11[0].length+A12[0].length; j++){if(i<A11.length){if(j<A11[0].length){result[i][j] = A11[i][j];}else{result[i][j] = A12[i][j-A11[0].length];}}else{if(j<A12[0].length){result[i][j] = A21[i-A11.length][j];}else{result[i][j] = A22[i-A11.length][j-A12[0].length];}} }return result;}
//矩阵减法public static int[][] MatrixNeg(int a[][], int b[][]){int temp[][] = new int[b.length][b[0].length];for(int i = 0 ;i<b.length; i++){for(int j = 0; j <  b[0].length; j++){temp[i][j] = (-1) * b[i][j];}}return MatrixPlus(a,temp);}
//矩阵加法public static int[][] MatrixPlus(int a[][], int b[][]){if(a[0].length  != b[0].length || a.length != b.length) return null;int result[][] = new int[a.length][a[0].length];for(int i = 0; i<a.length; i++)for(int j = 0; j<b.length; j++){result[i][j] = a[i][j]+ b[i][j];}return result;}
//矩阵乘法public static int[][] MatrixMulti(int a[][], int b[][]){//     a的列数不等于 b行数                      //列数int cow = a.length;//结果的行数int col = b[0].length;//结果的列数if(a[0].length  != b.length ) return null;else{int result[][] = new int[a.length][b[0].length];for(int i = 0; i<cow; i++)for(int j = 0; j<col; j++){for(int k = 0; k<a[0].length; k++){result[i][j] +=a[i][k] * b[k][j]; }}return result;}}

矩阵乘法Strassen算法相关推荐

  1. strassen矩阵乘法 java_矩阵乘法Strassen算法

    矩阵乘法是种极其耗时的运算.以 为例,其中 和 都是 矩阵.根据矩阵乘法的定义, 中的每个元素需要按照如下方式计算 式(4.8)包含一个 次的循环,因此计算 的时间复杂度为 .而 共有 个元素,因此总 ...

  2. [C++]矩阵乘法Strassen算法-----代码实现

    关于矩阵乘法的Strassen算法,这里不再叙述,推荐简书博客: https://www.jianshu.com/p/6e21f8e872fd 本篇博客便是参考该简书的算法思想,采用C++进行代码实现 ...

  3. 快速矩阵乘法的算法实现

    快速矩阵乘法的算法实现 矩阵乘法 一般矩阵乘法 分块算法 Strassen 算法 Coppersmith-Winograd算法 矩阵乘法 对于两个矩阵的相乘,只有在第一个矩阵的列数和第二个矩阵的行数相 ...

  4. python矩阵乘法分治算法_矩阵乘法的Strassen算法详解 --(算法导论分治法求矩阵)...

    1 题目描述 2 思路分析 3 解法 4 小结 1 题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 2 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数 ...

  5. 矩阵乘法的算法实现 [转载]

    一般矩阵乘法算法: 原理:矩阵相乘最重要的方法是一般矩阵乘积.它只有在第一个矩阵的栏数(column)和第二个矩阵的列数(row)相同时才有定义.一般单指矩阵乘积时,指的便是一般矩阵乘积.若A为m×n ...

  6. MPI编程——分块矩阵乘法(cannon算法)

    要求: 分析 本题难点在于不同process之间的通信,算法主要利用了cannon算法,cannon算法描述如下: 以上算法主要分为两个过程:分配初始位置.进行乘-加运算.循环单步移位.为了方便,下面 ...

  7. java矩阵连乘算法_使用java写的矩阵乘法实例(Strassen算法)

    Strassen算法于1969年由德国数学家Strassen提出,该方法引入七个中间变量,每个中间变量都只需要进行一次乘法运算.而朴素算法却需要进行8次乘法运算. 原理 Strassen算法的原理如下 ...

  8. strassen算法java_使用java写的矩阵乘法实例(Strassen算法)_Java_软件编程

    Strassen算法于1969年由德国数学家Strassen提出,该方法引入七个中间变量,每个中间变量都只需要进行一次乘法运算.而朴素算法却需要进行8次乘法运算. 原理 Strassen算法的原理如下 ...

  9. 矩阵生发java_使用java写的矩阵乘法实例(Strassen算法)

    Strassen算法于1969年由德国数学家Strassen提出,该方法引入七个中间变量,每个中间变量都只需要进行一次乘法运算.而朴素算法却需要进行8次乘法运算. 原理 Strassen算法的原理如下 ...

最新文章

  1. 回发或回调参数无效。下拉菜单中使用ajax,联动菜单引起的问题解决方案
  2. 深入研究Java类加载机制
  3. carsim学习笔记6——转向系统的学习
  4. SVM 推到期间 遇到的 表背景知识 (间隔最大化)
  5. 〈转贴〉如何解决 Windows XP 中的硬件和软件驱动程序问题
  6. 正确使用 Volatile 变量
  7. 数据结构和算法,也就那么回事儿
  8. UI2CODE再进化!结合Redux的框架升级!
  9. 通信工程中常用算法c语言,通信工程常见面试题.doc
  10. Github | 深度学习研究大咖有哪些?
  11. C++程序设计:原理与实践(进阶篇)15.6 实例:一个简单的文本编辑器
  12. Mysql Federated For Windows
  13. 浙江非税设定服务器信息,非税操作手册.doc
  14. p12解析流程_iOS证书及描述文件制作流程详解
  15. HTML5 Canvas渐进填充与透明(摘自 http://blog.csdn.net/jia20003/article/details/9251893)
  16. 报表架构 jasperReports+iReport使用说明
  17. NVT NT98510 SDK介绍
  18. 在定语从句中which和that用法有什么区别
  19. 【转】免费进入学术数据库
  20. 《Python编程:从入门到实践》 练习 9-4 9-5

热门文章

  1. 基于CentOS 7 安装Percona XtraDB Cluster(PXC) 5.7
  2. Debian Linux安装OpenSSH(sshd-server)
  3. 解决Linux系统find: ‘/run/user/1000/gvfs’: 权限不够
  4. oppo5.0以上系统怎么样不Root激活Xposed框架的经验
  5. 前端技术基础(一):浏览器相关
  6. JS中new的实现原理及重写
  7. 典型电商网站的站点导航的布局结构实现,及运用三种方式实现下拉效果
  8. 【Liunx】manjaro 配置vscode python开发环境
  9. C#LeetCode刷题之#566-重塑矩阵( Reshape the Matrix)
  10. 环境变量简单介绍windows-linux-mac