矩阵乘法Strassen算法
这里主要是给出实现方法,至于算法的介绍,可以参考@
//调用入口:
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算法相关推荐
- strassen矩阵乘法 java_矩阵乘法Strassen算法
矩阵乘法是种极其耗时的运算.以 为例,其中 和 都是 矩阵.根据矩阵乘法的定义, 中的每个元素需要按照如下方式计算 式(4.8)包含一个 次的循环,因此计算 的时间复杂度为 .而 共有 个元素,因此总 ...
- [C++]矩阵乘法Strassen算法-----代码实现
关于矩阵乘法的Strassen算法,这里不再叙述,推荐简书博客: https://www.jianshu.com/p/6e21f8e872fd 本篇博客便是参考该简书的算法思想,采用C++进行代码实现 ...
- 快速矩阵乘法的算法实现
快速矩阵乘法的算法实现 矩阵乘法 一般矩阵乘法 分块算法 Strassen 算法 Coppersmith-Winograd算法 矩阵乘法 对于两个矩阵的相乘,只有在第一个矩阵的列数和第二个矩阵的行数相 ...
- python矩阵乘法分治算法_矩阵乘法的Strassen算法详解 --(算法导论分治法求矩阵)...
1 题目描述 2 思路分析 3 解法 4 小结 1 题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 2 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数 ...
- 矩阵乘法的算法实现 [转载]
一般矩阵乘法算法: 原理:矩阵相乘最重要的方法是一般矩阵乘积.它只有在第一个矩阵的栏数(column)和第二个矩阵的列数(row)相同时才有定义.一般单指矩阵乘积时,指的便是一般矩阵乘积.若A为m×n ...
- MPI编程——分块矩阵乘法(cannon算法)
要求: 分析 本题难点在于不同process之间的通信,算法主要利用了cannon算法,cannon算法描述如下: 以上算法主要分为两个过程:分配初始位置.进行乘-加运算.循环单步移位.为了方便,下面 ...
- java矩阵连乘算法_使用java写的矩阵乘法实例(Strassen算法)
Strassen算法于1969年由德国数学家Strassen提出,该方法引入七个中间变量,每个中间变量都只需要进行一次乘法运算.而朴素算法却需要进行8次乘法运算. 原理 Strassen算法的原理如下 ...
- strassen算法java_使用java写的矩阵乘法实例(Strassen算法)_Java_软件编程
Strassen算法于1969年由德国数学家Strassen提出,该方法引入七个中间变量,每个中间变量都只需要进行一次乘法运算.而朴素算法却需要进行8次乘法运算. 原理 Strassen算法的原理如下 ...
- 矩阵生发java_使用java写的矩阵乘法实例(Strassen算法)
Strassen算法于1969年由德国数学家Strassen提出,该方法引入七个中间变量,每个中间变量都只需要进行一次乘法运算.而朴素算法却需要进行8次乘法运算. 原理 Strassen算法的原理如下 ...
最新文章
- 回发或回调参数无效。下拉菜单中使用ajax,联动菜单引起的问题解决方案
- 深入研究Java类加载机制
- carsim学习笔记6——转向系统的学习
- SVM 推到期间 遇到的 表背景知识 (间隔最大化)
- 〈转贴〉如何解决 Windows XP 中的硬件和软件驱动程序问题
- 正确使用 Volatile 变量
- 数据结构和算法,也就那么回事儿
- UI2CODE再进化!结合Redux的框架升级!
- 通信工程中常用算法c语言,通信工程常见面试题.doc
- Github | 深度学习研究大咖有哪些?
- C++程序设计:原理与实践(进阶篇)15.6 实例:一个简单的文本编辑器
- Mysql Federated For Windows
- 浙江非税设定服务器信息,非税操作手册.doc
- p12解析流程_iOS证书及描述文件制作流程详解
- HTML5 Canvas渐进填充与透明(摘自 http://blog.csdn.net/jia20003/article/details/9251893)
- 报表架构 jasperReports+iReport使用说明
- NVT NT98510 SDK介绍
- 在定语从句中which和that用法有什么区别
- 【转】免费进入学术数据库
- 《Python编程:从入门到实践》 练习 9-4 9-5
热门文章
- 基于CentOS 7 安装Percona XtraDB Cluster(PXC) 5.7
- Debian Linux安装OpenSSH(sshd-server)
- 解决Linux系统find: ‘/run/user/1000/gvfs’: 权限不够
- oppo5.0以上系统怎么样不Root激活Xposed框架的经验
- 前端技术基础(一):浏览器相关
- JS中new的实现原理及重写
- 典型电商网站的站点导航的布局结构实现,及运用三种方式实现下拉效果
- 【Liunx】manjaro 配置vscode python开发环境
- C#LeetCode刷题之#566-重塑矩阵( Reshape the Matrix)
- 环境变量简单介绍windows-linux-mac