本文介绍几种方式实现矩阵相乘。矩阵概念一般语言没有提供,我们首先子句实现,同时也介绍一些现成库实现。

1. 概念介绍

首先通过示例介绍矩阵,首先定义第一个3x2的矩阵:

我们再定义第二个2x3的矩阵:

两个矩阵相乘,结果为3x4矩阵:

计算公式为:

第一个矩阵的列数要和第二个矩阵的行数相等,否则不能相乘。即从A矩阵的第一行开始依次和B矩阵的每列相乘,每行与列元素相乘的结果相加作为结果矩阵的一个元素。

2. 矩阵乘法实现

2.1 自己实现

首先我们自己实现矩阵相乘,为了简单我们使用二维double类型数组:

double[][] firstMatrix = {new double[]{1d, 5d},new double[]{2d, 3d},new double[]{1d, 7d}
};double[][] secondMatrix = {new double[]{1d, 2d, 3d, 7d},new double[]{5d, 2d, 8d, 1d}
};

上面是两个矩阵示例,下面定义其相乘的结果矩阵:

double[][] expected = {new double[]{26d, 12d, 43d, 12d},new double[]{17d, 10d, 30d, 17d},new double[]{36d, 16d, 59d, 14d}
};

现在准备好了,让我们实现乘法算法。首先定义空结果数组,然后迭代其元素并存储每个元素的结果:

double[][] multiplyMatrices(double[][] firstMatrix, double[][] secondMatrix) {double[][] result = new double[firstMatrix.length][secondMatrix[0].length];for (int row = 0; row < result.length; row++) {for (int col = 0; col < result[row].length; col++) {result[row][col] = multiplyMatricesCell(firstMatrix, secondMatrix, row, col);}}return result;
}

最后我们实现每个元素的计算过程。即实现上面展示的公式:

double multiplyMatricesCell(double[][] firstMatrix, double[][] secondMatrix, int row, int col) {double cell = 0;for (int i = 0; i < secondMatrix.length; i++) {cell += firstMatrix[row][i] * secondMatrix[i][col];}return cell;
}

最后,检查结果是否与期望的一致:

double[][] actual = multiplyMatrices(firstMatrix, secondMatrix);
assertThat(actual).isEqualTo(expected);

2.2 EJML

这里介绍EJML库, 完整表述为 Efficient Java Matrix Library。该库要实现目的是在计算和内存使用方面尽可能地高效。首先引入依赖:

<dependency><groupId>org.ejml</groupId><artifactId>ejml-all</artifactId><version>0.38</version>
</dependency>

实现逻辑与前面的一样,首先定义两个矩阵,然后检查它们乘积结果是否与期望一致。使用EJML创建矩阵,需要使用它提供的SimpleMatrix类。下面定义两个矩阵:

SimpleMatrix firstMatrix = new SimpleMatrix(new double[][] {new double[] {1d, 5d},new double[] {2d, 3d},new double[] {1d ,7d}}
);SimpleMatrix secondMatrix = new SimpleMatrix(new double[][] {new double[] {1d, 2d, 3d, 7d},new double[] {5d, 2d, 8d, 1d}}
);

下面定义期望结果矩阵:

SimpleMatrix expected = new SimpleMatrix(new double[][] {new double[] {26d, 12d, 43d, 12d},new double[] {17d, 10d, 30d, 17d},new double[] {36d, 16d, 59d, 14d}}
);

现在准备好了,如何实现两个矩阵相乘。利用SimpleMatrix 类提供的 mult() 方法,参数为第二个参数,返回结果矩阵:

SimpleMatrix actual = firstMatrix.mult(secondMatrix);

SimpleMatrix 类并没有重写equals方法,因此不能直接验证。但它提供了isIdentical() 方法,它有两个参数:另一个矩阵和容错精度:

assertThat(actual).matches(m -> m.isIdentical(expected, 0d));

2.2 Colt

Colt库提供高性能的科学计算能力,需要加入依赖:

<dependency><groupId>colt</groupId><artifactId>colt</artifactId><version>1.2.0</version>
</dependency>

利用Colt创建矩阵,需要使用DoubleFactory2D类,它提供三个工厂实例:dense, sparse 和 rowCompressed。每个用于创建特定类型矩阵。这里我们使用dense。调用make方法,带有二维double数组,返回DoubleMatrix2D 对象:

DoubleMatrix2D matrix = doubleFactory2D.make(/* a two dimensions double array */);

DoubleMatrix2D没有对应方式实现矩阵乘法,我们需要创建Algebra类实例,它提供了mult方法:

Algebra algebra = new Algebra();
DoubleMatrix2D actual = algebra.mult(firstMatrix, secondMatrix);

最后比较结果是否与期望一致:

assertThat(actual).isEqualTo(expected);

2.3 LA4J

LA4J表示 Linear Algebra for Java。加入依赖:

<dependency><groupId>org.la4j</groupId><artifactId>la4j</artifactId><version>0.6.0</version>
</dependency>

LA4J 与其他库非常相似,提供了Matrix 接口及Basic2DMatrix 实现类,构造函数带二维double类型数组:

Matrix matrix = new Basic2DMatrix(/* a two dimensions double array */);

然后利用multiply方法实现乘法:

Matrix actual = firstMatrix.multiply(secondMatrix);

最后比较结果:

assertThat(actual).isEqualTo(expected);

2.4 Apache Commons

最后介绍下Apache Commons Math库,它也提供了矩阵相关运算实现,加入依赖:

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-math3</artifactId><version>3.6.1</version>
</dependency>

我们使用RealMatrix 接口及其实现类Array2DRowRealMatrix 定义矩阵。它的构造函数带有二维double类型数组:

RealMatrix matrix = new Array2DRowRealMatrix(/* a two dimensions double array */);

利用RealMatrix 提供的方法multiply实现乘法:

RealMatrix actual = firstMatrix.multiply(secondMatrix);
assertThat(actual).isEqualTo(expected);

3. 总结

本文介绍矩阵乘法实现,矩阵乘法在层次分析法中有应用。通过自我实现理解其原理,接着又介绍了几种现有库的实现,读者也可以自己通过基准测试它们性能差异。

矩阵乘法Java实现相关推荐

  1. 蓝桥杯-矩阵乘法(java)

    算法训练 矩阵乘法 时间限制:1.0s 内存限制:512.0MB问题描述输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果.输入格式第一行,空格隔开的三个正整数m,s,n(均不超过200) ...

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

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

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

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

  4. 二维矩阵乘法、矩阵转置、 矩阵与向量乘法(java实现)

    二维矩阵乘法.矩阵转置. 矩阵与向量乘法(java实现) 相关代码如下: package algorithms; //矩阵库 public class Matrisx { /***向量点相乘 doub ...

  5. 矩阵生发java_使用java写的矩阵乘法实例(Strassen算法)

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

  6. strassen矩阵乘法 java_Strassen 矩阵算法 Java 实现

    展开全部 算法如下: //STRASSEN矩阵算法 #include const int N=8; //常量N用来定义矩阵的大小 void main() { void STRASSEN(int n,f ...

  7. Java实现矩阵运算——矩阵乘法、矩阵转置、自动填充矩阵行

    在做大数据或人工智能开发的过程做难免会遇到矩阵运算,本文在这里给大家实现一个简单的矩阵运算,请看下代码: package test;/*** 矩阵运算* * @author Administrator ...

  8. java如何求矩阵的置换_矩阵乘法(五):置换

    矩阵乘法在一些置换问题上有着很好的应用,特别置换次数较多时,采用矩阵快速幂运算可以加快运算过程. 任意一个置换都能够表示成矩阵的形式.比如,将序列1  2  3  4 置换为 3  1  2  4,相 ...

  9. java 矩阵_(JAVA)计算机图形学与矩阵

    (JAVA)计算机图形学与矩阵 平移 旋转 变比 一)矩阵 1)矩阵的乘法运算 矩阵是计算机图形学的重要工具. 计算机图形学要常常用到 矩阵乘法(矩阵与矩阵相乘). 矩阵(Aij)m*n 与矩阵(Bi ...

  10. 用MapReduce实现矩阵乘法

    主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项 ...

最新文章

  1. 空间直角坐标系与球面坐标互转
  2. Spring Cloud构建微服务架构:分布式服务跟踪(跟踪原理)
  3. Maven教程(一)
  4. COSCon‘20 参会指南 | 你想知道的都在这里(文末有福利)
  5. 【7.9校内test】T1挖地雷
  6. 数据库表结构设计方法
  7. kali Linux Web 渗透测试视频教程— 第六课 网络扫描-nmap与zmap
  8. cpu功耗排行_AMD、Intel主流处理器性能、功耗及性价比排行(更新中)
  9. 通用采集器Modbus协议应用
  10. MATLAB--查表
  11. java换行输出的几种方式
  12. 基于ECharts和腾讯疫情数据接口的全球疫情地图(超全)
  13. python中双引号的作用_Python中单引号和双引号的作用
  14. 更新:2022 京东双11活动一键自动完成任务脚本app来了
  15. 英飞凌电动汽车参考方案,包含原理图,和Bom清单
  16. 10047.GNU Make 使用手册中译版(转)
  17. 【蓝桥杯历年真题合集】蓝桥杯2020初赛
  18. 【虹科讲座预告】企业如何防止基于USB的数据外泄
  19. “AI+教育”假套路还是真功夫,本质还是对AI能力的拷问
  20. dann(胆囊结石的疼痛特点包括)

热门文章

  1. oracle 英文 简历,英文优秀个人简历模板范文
  2. 植物大战僵尸 php,植物大战僵尸Online
  3. ArduCopter——ArduPilot——Notch Filter(陷波滤波器)
  4. 免费OA办公系统评测 到底哪个适合本公司?
  5. 虹科案例|基于SOLA光源的高通量Spike展示平台加速新冠病毒疫苗研制
  6. couchbase php,数据库大全-之-Couchbase
  7. 如何使用ListView分页
  8. Windows操作系统安装、备份与还原的所有方法
  9. 使用UnityShader实现2D流光效果
  10. 超详版Struts2入门安装教程