介绍原理
复杂度分析
本篇文章给大家分享的是有关使用java怎么编写一个矩阵乘法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
Strassen算法于1969年由德国数学家Strassen提出,该方法引入七个中间变量,每个中间变量都只需要进行一次乘法运算。而朴素算法却需要进行8次乘法运算。
原理
Strassen算法的原理如下所示,使用sympy验证Strassen算法的正确性
import sympy as s , 时间=A s.Symbol (“A") 时间=B s.Symbol (“B") 时间=C s.Symbol (“C") 时间=D s.Symbol (“D") 时间=E s.Symbol (“E") 时间=F s.Symbol (“F") 时间=G s.Symbol (“G") 时间=H s.Symbol (“H") 时间=p1 A *, (F 安康;H) p2 =,(时间+ A B), *, H p3 =,(时间+ C D), *, E 时间=p4 D *, (G 安康;E) p5 =,(时间+ A D), *,(时间+ E H) p6 =, (B 安康;D), *,(时间+ G H) p7 =, (A 安康;C), *,(时间+ E F) , 打印(A *, E +, B *, G,,(时间+ p5 p4 作用;p2 +, p6) .simplify ()) 打印(A *, F +, B *, H,,(时间+ p1 p2) .simplify ()) 打印(C *, E +, D *, G,,(时间+ p3 p4) .simplify ()) 打印(C *, F +, D *, H,,(时间+ p1 p5 作用;p3 作用;p7) .simplify ())
复杂度分析
$ $ f (N)=7 \ * f(\压裂{N} {2})=7 ^ 2 \ * f(\压裂{N} {4})=?7 ^ k \乘以f(\压裂{N} {2 ^ k}) $ $
最终复杂度为7美元^ {log_2 N}=N ^ {log_2 7} $
java矩阵乘法(Strassen算法)
代码如下,可以看看数据结构的定义,时间换空间。
public class Matrix { private final 矩阵[],_matrixArray; private final  int n; private int 元素; public 矩阵(int n), { 时间=this.n n; if (n !=, 1), { 时间=this._matrixArray new 矩阵[4]; for (int 小姐:=,0;,小姐:& lt;, 4,,我+ +),{ this._matrixArray[我],=,new 矩阵(时间/n 2); } },{else this._matrixArray =零;祝福; } } private 矩阵(int n, boolean needInit), { 时间=this.n n; if (n !=, 1), { 时间=this._matrixArray new 矩阵[4]; },{else this._matrixArray =零;祝福; } } public void 集(int 我,int j, int a), { if (n ==, 1), { 时间=element ;; },{else int size =, n /, 2; this._matrixArray[(小姐:/,大小),*,2,+,(时间/j 大小)]这里(小姐:%,大小,j %,大小,a); } } public Matrix 多(Matrix m), { Matrix result =,空; if (n ==, 1), { 时间=result new 矩阵(1); result.set (0, 0, (element *, m.element)); },{else 时间=result new 矩阵(n,假); result._matrixArray [0],=, P5 (m)阀门(P4 (m)) .minus阀门(P2 (m)) (P6 (m)); result._matrixArray [1],=, P1 (m)阀门(P2 (m)); result._matrixArray [2],=, P3 (m)阀门(P4 (m)); result._matrixArray [3],=, P5 (m)阀门(P1 (m)) .minus (P3 (m)) .minus (P7 (m)); } return 结果; } public Matrix 添加(Matrix m), { Matrix result =,空; if (n ==, 1), { 时间=result new 矩阵(1); result.set(0, 0,(时间+ element m.element)); },{else 时间=result new 矩阵(n,假); result._matrixArray [0],=, this._matrixArray[0]阀门(m._matrixArray [0]); result._matrixArray [1],=, this._matrixArray[1]阀门(m._matrixArray [1]); result._matrixArray [2],=, this._matrixArray[2]阀门(m._matrixArray [2]); result._matrixArray [3],=, this._matrixArray[3]阀门(m._matrixArray [3]);; } return 结果; } public Matrix - (Matrix m), { Matrix result =,空; if (n ==, 1), { 时间=result new 矩阵(1); result.set (0, 0, (element 作用;m.element)); },{else 时间=result new 矩阵(n,假); result._matrixArray [0],=, this._matrixArray [0] .minus (m._matrixArray [0]); result._matrixArray [1],=, this._matrixArray [1] .minus (m._matrixArray [1]); result._matrixArray [2],=, this._matrixArray [2] .minus (m._matrixArray [2]); result._matrixArray [3],=, this._matrixArray [3] .minus (m._matrixArray [3]);; } return 结果; } protected Matrix  P1 (Matrix m), { return _matrixArray [0] .multi (m._matrixArray [1]) .minus (_matrixArray [0] .multi (m._matrixArray [3])); } protected Matrix P2 (Matrix m), { return _matrixArray [0] .multi (m._matrixArray[3])阀门(_matrixArray [1] .multi (m._matrixArray [3])); } protected Matrix  P3 (Matrix m), { return _matrixArray [2] .multi (m._matrixArray[0])阀门(_matrixArray [3] .multi (m._matrixArray [0])); } null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null使用java怎么编写一个矩阵乘法