使用java怎么编写一个矩阵乘法

  介绍

本篇文章给大家分享的是有关使用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怎么编写一个矩阵乘法