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)

print(A * E + B * G, (p5 + p4 - p2 + p6).simplify())

print(A * F + B * H, (p1 + p2).simplify())

print(C * E + D * G, (p3 + p4).simplify())

print(C * F + D * H, (p1 + p5 - p3 - p7).simplify())

复杂度分析

$$f(N)=7\times f(\frac{N}{2})=7^2\times f(\frac{N}{4})=...=7^k\times f(\frac{N}{2^k})$$

最终复杂度为$7^{log_2 N}=N^{log_2 7}$

java矩阵乘法(Strassen算法)

代码如下,可以看看数据结构的定义,时间换空间。

public class Matrix {

private final Matrix[] _matrixArray;

private final int n;

private int element;

public Matrix(int n) {

this.n = n;

if (n != 1) {

this._matrixArray = new Matrix[4];

for (int i = 0; i < 4; i++) {

this._matrixArray[i] = new Matrix(n / 2);

}

} else {

this._matrixArray = null;

}

}

private Matrix(int n, boolean needInit) {

this.n = n;

if (n != 1) {

this._matrixArray = new Matrix[4];

} else {

this._matrixArray = null;

}

}

public void set(int i, int j, int a) {

if (n == 1) {

element = a;

} else {

int size = n / 2;

this._matrixArray[(i / size) * 2 + (j / size)].set(i % size, j % size, a);

}

}

public Matrix multi(Matrix m) {

Matrix result = null;

if (n == 1) {

result = new Matrix(1);

result.set(0, 0, (element * m.element));

} else {

result = new Matrix(n, false);

result._matrixArray[0] = P5(m).add(P4(m)).minus(P2(m)).add(P6(m));

result._matrixArray[1] = P1(m).add(P2(m));

result._matrixArray[2] = P3(m).add(P4(m));

result._matrixArray[3] = P5(m).add(P1(m)).minus(P3(m)).minus(P7(m));

}

return result;

}

public Matrix add(Matrix m) {

Matrix result = null;

if (n == 1) {

result = new Matrix(1);

result.set(0, 0, (element + m.element));

} else {

result = new Matrix(n, false);

result._matrixArray[0] = this._matrixArray[0].add(m._matrixArray[0]);

result._matrixArray[1] = this._matrixArray[1].add(m._matrixArray[1]);

result._matrixArray[2] = this._matrixArray[2].add(m._matrixArray[2]);

result._matrixArray[3] = this._matrixArray[3].add(m._matrixArray[3]);;

}

return result;

}

public Matrix minus(Matrix m) {

Matrix result = null;

if (n == 1) {

result = new Matrix(1);

result.set(0, 0, (element - m.element));

} else {

result = new Matrix(n, false);

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 result;

}

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]).add(_matrixArray[1].multi(m._matrixArray[3]));

}

protected Matrix P3(Matrix m) {

return _matrixArray[2].multi(m._matrixArray[0]).add(_matrixArray[3].multi(m._matrixArray[0]));

}

protected Matrix P4(Matrix m) {

return _matrixArray[3].multi(m._matrixArray[2]).minus(_matrixArray[3].multi(m._matrixArray[0]));

}

protected Matrix P5(Matrix m) {

return (_matrixArray[0].add(_matrixArray[3])).multi(m._matrixArray[0].add(m._matrixArray[3]));

}

protected Matrix P6(Matrix m) {

return (_matrixArray[1].minus(_matrixArray[3])).multi(m._matrixArray[2].add(m._matrixArray[3]));

}

protected Matrix P7(Matrix m) {

return (_matrixArray[0].minus(_matrixArray[2])).multi(m._matrixArray[0].add(m._matrixArray[1]));

}

public int get(int i, int j) {

if (n == 1) {

return element;

} else {

int size = n / 2;

return this._matrixArray[(i / size) * 2 + (j / size)].get(i % size, j % size);

}

}

public void display() {

for (int i = 0; i < n; i++) {

for (int j = 0; j < n; j++) {

System.out.print(get(i, j));

System.out.print(" ");

}

System.out.println();

}

}

public static void main(String[] args) {

Matrix m = new Matrix(2);

Matrix n = new Matrix(2);

m.set(0, 0, 1);

m.set(0, 1, 3);

m.set(1, 0, 5);

m.set(1, 1, 7);

n.set(0, 0, 8);

n.set(0, 1, 4);

n.set(1, 0, 6);

n.set(1, 1, 2);

Matrix res = m.multi(n);

res.display();

}

}

总结

到此这篇关于使用java写的矩阵乘法的文章就介绍到这了,更多相关java矩阵乘法(Strassen算法)内容请搜索聚米学院以前的文章或继续浏览下面的相关文章希望大家以后多多支持聚米学院!

矩阵生发java_使用java写的矩阵乘法实例(Strassen算法)相关推荐

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

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

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

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

  3. 《算法导论》——矩阵乘法的Strassen算法

    前言: 很多朋友看到我写的<算法导论>系列,可能会觉得云里雾里,不知所云.这里我再次说明,本系列博文时配合<算法导论>一书,给出该书涉及的算法的c++实现.请结合<算法导 ...

  4. 矩阵相乘的strassen算法_4-2.矩阵乘法的Strassen算法详解

    题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B ...

  5. 三元组法矩阵加法java_计算机视觉学习笔记(2.1)-KNN算法中距离矩阵的计算

    本笔记系列以斯坦福大学CS231N课程为大纲,海豚浏览器每周组织一次授课和习题答疑.具体时间地点请见微信公众号黑斑马团队(zero_zebra)和QQ群(142961883)发布.同时课程通过腾讯课堂 ...

  6. matlab里的矩阵和opencv里的矩阵的区别,opencv 矩阵相乘, matlab矩阵相乘,以及自己写的矩阵相乘的时间比较...

    直接上代码吧 matlab clc close all clear all tic; c = rand(7500,7500)*rand(7500,1);toc; Elapsed time is2.57 ...

  7. 后门怎么写隐蔽java_用Java写黑软-后门篇

    这次我给大家带来的是<用Java写黑软-后门篇>,目前我在网上还没有找到哪位高手把自己写的java后门公布出来,有的也多是些恶搞的东西,所以这次我就来献献丑了. 先来一段理论的东西,后门, ...

  8. 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...

    矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率. 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3) 也称 ...

  9. 如何用java写一个九九乘法表。

    在java中写一个九九乘法表,我们只需要用一个for循环嵌套就可以了,我们先写一个for循环嵌套格式, for(;;){for(;;) 然后我们知道内循环和外循环所控制行和列,我们可以看出来九九乘法表 ...

最新文章

  1. jquery点击元素之外触发事件
  2. tm1650中文资料_TM1616,TM1650,TM1651 SOP16原厂直销,技术支持
  3. python excel绘图-Python excel 画图
  4. 任正非未来出行三谈,在攀登无人驾驶珠峰路上沿途下蛋...
  5. 使用MMC管理windows机器
  6. java web六:tomcat其他小问题
  7. UVA216 ——dfs
  8. VB案例:简易记事本
  9. 京瓷 打印 打印机 账户_UV打印机买回来成废铁?不是选择不对,而是你想太多了……...
  10. C/C++中关于qsort的使用
  11. 转SQLSERVER 会不会自动加锁
  12. linux基础命令_Linux编程基础:常用命令
  13. 揭秘Harbor镜像仓库——首个源自中国的CNCF毕业项目
  14. 阶段3 3.SpringMVC·_07.SSM整合案例_02.ssm整合之搭建环境
  15. 深入浅出看懂AlphaGo Zero (文章最后有原AlphaGo Zero论文地址)
  16. android 9 one ui,终于!三星S9系列国行开测安卓9.0系统:OneUI真香!
  17. AI助力教学升级,掌门优课智能互动双师课程获用户认可
  18. RS-485总线布线规则及方法
  19. Unreal4 入门
  20. Allegro建立非标准热风焊盘之 理解X IX IY 命令

热门文章

  1. vs2017开发IOS 实时效果
  2. 汉语言文学要学计算机课程吗,汉语言文学专业学什么 主要课程有哪些
  3. OPPO手机怎么录音 OPPO手机中便签进行录音的操作方法
  4. 【CUDA 基础】1.1 异构计算与CUDA
  5. SuperMap10i iobject许可
  6. 各编程语言相互调用示例,代码简单,生成的软件体积也很小
  7. group convolution (分组卷积)的计算量详解、卷积计算量特征图大小,池化特征图大小、深度通道deep-wise 卷积
  8. 运维工程师常见40道面试题必会
  9. 服务器日志显示英文,在闪亮的服务器上显示R控制台日志
  10. 简单了解---性能测试