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

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算法)内容请搜索得牛网以前的文章或继续浏览下面的相关文章希望大家以后多多支持得牛网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机二级web题目(7.3)--简单应用题1

说明&#xff1a;如有不清楚的地方&#xff0c;可以评论区留言&#xff0c;及时回复。 1、在考生文件夹下的Web3目录中&#xff0c;存有3.htm文件&#xff0c;该文件不完整&#xff0c;请在标有********Found******字符串的注释行下一语句的下划线处填入正确内容&#xff0c;然…

使用Spring Security 5.0和OIDC轻松构建身份验证

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Spring Security不仅是一个功能强大且可高度自定义的身份验证和访问控制框架&#xf…

java访问类的方法_Java:如何从另一个类访问方法

小编典典你需要以某种方式为Alpha类提供对cBeta的引用。有三种方法可以做到这一点。1)在构造函数中为Alphas提供Beta。在Alpha课堂上写道&#xff1a;public class Alpha {private Beta beta;public Alpha(Beta beta) {this.beta beta;}并从main()调用cAlpha new Alpha(cBeta…

计算机二级web题目(7.4)--综合应用题1

说明&#xff1a;如有不清楚的地方&#xff0c;可以评论留言&#xff0c;及时回复。 1、在考生文件夹下的Web5目录中&#xff0c;存有5.htm文件&#xff0c;该文件不完整&#xff0c;请在标有 *********Foun********字符串的往释行 下一-语句的下划线处填入正确内容&#xff0c…

(1.2)HarmonyOS鸿蒙config.json

跟应用相关的所有信息&#xff0c;都会在config.json文件中进行配置。 项目的配置&#xff08;app&#xff09; 比如&#xff1a;厂商信息&#xff0c;项目的版本等 应用在设备上的配置信息&#xff08;deviceConfig&#xff09; 比如&#xff1a;应用运行时进程名&#xff0c…

java随机数函数_java随机函数详解

本文主要介绍java里的一些随机函数实现与用法,也会附带介绍一些随机数知识。 目前计算机实现的随机函数过程中,都是伪随机的,不过,可以实现统计学意义上的随机。比如手机鼠标移动位置,点击,系统的参数等等作为种子,这种随机统计上看起来就是“真随机数”了,具有较高的安…

Arquillian变色龙。 简化您的Arquillian测试

Arquillian Chameleon的诞生是为了简化Arquillian测试的配置。 我很自豪地宣布&#xff0c;使用1.0.0.CR2版本&#xff0c;我们不仅简化了Arquillian测试的配置方式&#xff0c;而且简化了编写方式。 在此新版本中&#xff0c;添加了三个新的简化&#xff1a; 您只需要使用1个…

为什么要学习鸿蒙,HarmonyOS不只是操作系统

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 前言 对于IT行业&#xff0c;头部力量或者已经形成生态的东西…

mysql 视图树查询_TreeView (树视图)遍历数据库的方法

多数从事数据库编程人员都经历过&#xff0c;对新接触的数据库技术无论是低版本Foxbase、Access97-2000还是支持网络环境高版本的Sql Server2000和 Oracel等系统&#xff0c;都经过一个循循渐进、吃苦耐劳学习过程&#xff0c;达到知识技术从量变到质变的过程&#xff0c;才能把…

(1.3)HarmonyOS鸿蒙启动程序运行流程

程序启动运行流程&#xff1a; ①解析config.json文件 ②初始化 ③获取入口Ability的全类名&#xff08;config.json里的module里的mainAbility&#xff09; ④找到Ability并运行 ⑤运行Ability中的子界面 ⑥加载xml文件&#xff0c;展示内容&#xff08;xml在resources里面&am…

arraylist内存溢出_ArrayList使用内存映射文件

arraylist内存溢出介绍 内存中的计算由于负担得起的硬件而开始兴起&#xff0c;大多数数据保留在RAM中以满足延迟和吞吐量的目标&#xff0c;但是将数据保留在RAM中会增加垃圾收集器的开销&#xff0c;尤其是在您不预先分配内存的情况下。 因此&#xff0c;有效地我们需要一种无…

【vtkWidgetRepresentation】第十八期 vtkHoverWidget

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkHoverWidget,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. vtkHoverWidget vtkHoverWidget用于在呈现窗口中…

Java面向对象(2)--类的成员属性

基本格式&#xff1a;修饰符 数据类型 属性名 初始化值 ; 说明1: 修饰符 ①常用的权限修饰符&#xff1a;private、缺省、protected、public ②其他修饰符&#xff1a;static、final 说明2&#xff1a;数据类型 任何基本数据类型和任何引用数据类型。 说明3&#xff1a;属性…

mysql8.0设置用户权限_mysql8.0建立用户授予权限报错解决方法

我遇到错误一&#xff1a;Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘IDENTIFIED BY ‘11111” at line 1&#xff1b;我遇到的错误二&#xff1a;Error C…

使用Spring Session和JDBC DataStore进行会话管理

在Web应用程序中&#xff0c;用户会话管理对于管理用户状态至关重要。 在本文中&#xff0c;我们将学习在集群环境中管理用户会话所遵循的方法&#xff0c;以及如何使用Spring Session以更加简单和可扩展的方式实现它。 通常在生产环境中&#xff0c;我们将有多个服务器节点&a…

Java面向对象(3)--类的成员方法

基本格式&#xff1a; 修饰符 返回值类型 方法名&#xff08;参数类型 形参1, 参数类型 形参2, …&#xff09;&#xff5b;方法体程序代码;return 返回值; &#xff5d;修饰符&#xff1a;public,缺省,private, protected等 返回值类型&#xff1a; ①没有返回值&#xff1a…

java 线程安全的单例_线程安全的单例模式的几种实现

单例模式是常见的设计模式之一&#xff1a;目的是节省内存&#xff0c;限制了实例的个数&#xff1b;有利于java GC回收机制。单例模式的三个好处&#xff1a;1.控制资源的使用&#xff0c;通过线程同步来控制资源的并发访问2.控制实例的产生个数&#xff0c;来达到节约资源的目…

Java面向对象(3.1)--方法的重载,可变个数的形参,值传递机制,递归

重载 在同一个类中&#xff0c;允许存在一个以上的同名方法&#xff0c;只要它们的参数个数或者参数 类型不同即可。 与返回值类型无关&#xff0c;只看参数列表&#xff0c;且参数列表必须不同。(参数个数或参数类 型或者多个参数时参数类型顺序)。调用时&#xff0c;根据方…

python统计图像直方图_计算机视觉7-像素点直方图统计、掩膜图像

1.灰度图的直方图(1)调用库import cv2import matplotlib.pyplot as pltimport numpy as np #创建掩膜时需要(2)绘图-方法1imgcv2.imread(F:cat.jpg,0)plt.hist(img.ravel(),256,[0,256])plt.show()plt.hist是一个画直方图的命令&#xff1b;img.ravel()可以将图片转化成一维数组…

计算机二级web题目(8.1)--综合选择题2

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 1、一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再…