Java 矩阵算法工具

这篇具有很好参考价值的文章主要介绍了Java 矩阵算法工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

步骤1:

<!-- 矩阵工具 -->
<dependency>
	<groupId>org.ejml</groupId>
	<artifactId>ejml-all</artifactId>
	<version>0.41</version>
</dependency>

步骤2:文章来源地址https://www.toymoban.com/news/detail-724000.html

创建一个2x4的空矩阵matrix
//创建一个2x4的空矩阵matrix(全部为0)
//    SimpleMatrix?(int numRows, int numCols)
//                      行数         列数
SimpleMatrix matrix0  = new SimpleMatrix(2,4);
通过数组创建矩阵
//通过二维数组创建矩阵
//可以理解成将数组变成相同结构的矩阵

//1、以double型的二维数组构造相同结构的矩阵
//    SimpleMatrix?(double[][] data)
double[][] arrayDouble2 = new double[2][4];
SimpleMatrix matrixDouble2 = new SimpleMatrix(arrayDouble2);
System.out.println("matrixDouble2:\n"+matrixDouble2);

//2、以float型的二维数组构造相同结构的矩阵
//    SimpleMatrix?(float[][] data)
double[][] arrayFloat2 = new double[2][4];
SimpleMatrix matrixFloat2 = new SimpleMatrix(arrayFloat2);
System.out.println("matrixFloat2:\n"+matrixFloat2);
//通过一维数组创建矩阵
//可以理解成将一维数组的数据按照每一行(每一列)的顺序填入给定大小的矩阵
/*  SimpleMatrix(int numRows, int numCols, boolean rowMajor, float/double[] data)
				   行数          列数    true(按行) false(按列)  数据源
*/

double[] arrayDouble1 = {1,2,3,4,5,7,8,9};//double也行

//1.按照每一行填入数据
SimpleMatrix matrixDoubleRow = new SimpleMatrix(4,2,true,arrayDouble1);
System.out.println("matrixDoubleRow:\n"+matrixDoubleRow);

//2.按照每一列填入数据
SimpleMatrix matrixDoubleCol = new SimpleMatrix(4,2,false,arrayDouble1);
System.out.println("matrixDoubleCol:\n"+matrixDoubleCol);

/*   matrixDoubleRow: 4x2      matrixDoubleCol: 4x2
	 [1,2]                     [1,5]
	 [3,4]                     [2,6]
	 [5,6]                     [3,7]
	 [7,8]                     [4,8]
 */
矩阵的常用运算
先创建4x4的矩阵A4x4的矩阵B,将矩阵A的所有元素都设置为1,将B的所有元素设置为2
//    void    fill?(double val)  将矩阵的所有元素都用val填充
//    如 matrix.fill(0.1)  表示将matrix的所有元素都设为0.1
SimpleMatrix matrixA = new SimpleMatrix(4,4);  //创建4x4的矩阵A
SimpleMatrix matrixB = new SimpleMatrix(4,4);  //创建4x4的矩阵B
matrixA.fill(1); //将A的所有元素设为1
matrixB.fill(2); //将B的所有元素设为2
System.out.println(matrixA);
System.out.println(matrixB);

2.1 矩阵加(减)法

/*  加、减法
T	plus(double b)            C = A + b      将矩阵A所有元素都加上b(如需减,则将b设为负)
T	plus(double beta, T B)    C = A + betaB  将B的所有元素都乘以beta,再让加上A(如需减,则将beta设置为负)
T	plus(T B)                 C = A + B      矩阵A加上矩阵B
T	minus(double b)	          C = A - b      将矩阵A所有元素都减去b
T	minus(T B)	              C = A - B      矩阵A加上矩阵B
*/
matrixC.fill(1);
matrixC = matrixA.plus(0.6);  //A的所有元素乘以0.6
System.out.println(matrixC);

matrixC.fill(1);
matrixC = matrixA.plus(0.2,matrixB);  // A + 0.2*B
System.out.println(matrixC);

matrixC.fill(1);
matrixC = matrixA.plus(matrixB);  // A + B
System.out.println(matrixC);

matrixC.fill(1);
matrixC = matrixA.minus(6);  // A的所有元素减6
System.out.println(matrixC);

matrixC.fill(1);
matrixC = matrixA.minus(matrixB);  // A - B
System.out.println(matrixC);
/*  乘法
1. 矩阵与矩阵相乘(行列式)
	T	mult(T B)               C = A * B    矩阵A与矩阵B相乘并返回
2. 数乘
	T	negative()              C = -A       矩阵A的所有元素乘以-1
	T	scale(double val)       C = val*A    矩阵A的所有元素乘以val
*/
matrixC = matrixA.mult(matrixB); // C = A * B
System.out.println(matrixC);

matrixC = matrixA.negative();  // C = -A
System.out.println(matrixC);

matrixC = matrixA.scale(9.99); // C = A*9.99
System.out.println(matrixC);
// 除法
//    T	divide(double val)      C = A/val    将矩阵A的所有元素都除以val
matrixC = matrixA.divide(50);  //C = A的所有元素都除以50所得的矩阵
System.out.println(matrixC);
/*  矩阵的转置
T	transpose()   返回给定矩阵的转置
*/
int val = 1;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
	matrixC.set(i, j, val);
	val++;
}
} //设置矩阵的值
System.out.println(matrixC);

SimpleMatrix matrixC_transpose = matrixC.transpose(); //矩阵的转置
System.out.println(matrixC_transpose);
 
/*  矩阵的逆阵
	T	invert()            求可逆矩阵的逆阵
	T	pseudoInverse()     求摩尔彭若斯广义逆(对于可逆矩阵与上行方法一致)
*/
SimpleMatrix matrixD = new SimpleMatrix(4, 4);
for (int i = 0; i < 4; i++) {
	for (int j = 0; j < 4; j++) {
		if (i == j) {
			matrixD.set(i, j, i + 1);
		} else {
			matrixD.set(i, j, 0);
		}
	}
}
System.out.println("矩阵D:\n"+matrixD);

SimpleMatrix D_invert = matrixD.invert();
System.out.println("矩阵D的逆阵:\n"+D_invert);

SimpleMatrix D_pseudoInverse = matrixD.pseudoInverse();
System.out.println("矩阵D的广义逆阵:\n"+D_pseudoInverse);
//创建n阶单位矩阵  identity matrix
int n =7;
SimpleMatrix tempMatrix = new SimpleMatrix(n,1); //创建nx1的列向量
tempMatrix.fill(1); //所有元素置为1
SimpleMatrix I =  tempMatrix.diag();
//A.diag()方法,如果A是矩阵,则返回一个由该矩阵的对角线上的值组成的列向量
//             如果A是列向量,则将其扩展为一个矩阵,矩阵的对角线的值就是该列向量
System.out.println(I);
SimpleMatrix matrix = new SimpleMatrix(8,8);
        
matrix.fill(4);     //将矩阵元素都设置为4
matrix.zero();      //将矩阵元素都设置为0
matrix.set(1,4,3);      //将第一行第四列元素设置为3
matrix.set(0,8);            //将第零个元素设置为8

matrix.rows(1,2);           //获取矩阵的部分行,第一个数表示开始的那一行,第二个数表示结束那一行加一(这里表示获取第一行)
matrix.cols(2,8);           //获取矩阵的部分列,第一个数表示开始的那一列,第二个数表示结束那一列加一(这里表示获取第2,3,4,5,6,7行)
matrix.get(2,3);   //获取第二行第三个数
matrix.get(2);              //获取第二个元素

matrix.copy();              //复制一个矩阵
matrix.createLike();        //创建一个与matrix相同行列数且元素相同的矩阵

matrix.numRows();           //获取矩阵的行数
matrix.numCols();           //获取矩阵的列数
matrix.getNumElements();    //获取矩阵的元素个数(行数乘以列数)

matrix.elementMaxAbs();     //获取矩阵中所有元素绝对值的最大值
matrix.elementMinAbs();     //获取矩阵中所有元素绝对值的最小值
matrix.elementSum();        //计算矩阵中所有元素的和

matrix.normF();             //计算矩阵的二范数(所有元素平方和开根号,可以理解成向量的模)
matrix.determinant();       //计算矩阵行列数值

(“乘”、“除”、“乘方”等等)
matrixC = matrixA.elementDiv(matrixB);   // 对应相除 C(i,j) = A(i,j) / B(i,j)
matrixC = matrixA.elementMult(matrixB);  // 对应相乘 C(i,j) = A(i,j) * B(i,j)
matrixC = matrixA.elementExp();          // C(i,j) = e 的 A(i,j)次方
matrixC = matrixA.elementLog();          // C(i,j) = ln(C(i,j))
matrixC = matrixA.elementPower(2);       // C(i,j) = A(i,j)^2 (对应元素的n次方)
matrixC = matrixA.elementPower(matrixB); // C(i,j) = A(i,j)^(B(i,j)) (对应元素的对应次方)
转数组:
double[] data = a2.getDDRM().data;

步骤3:测试代码

import org.ejml.simple.SimpleMatrix;
public class test {
    public static void main(String[] args) {
        //-------------------------------------------------------------------
        //创建一个2x4的矩阵matrix(全部为0)
        //    SimpleMatrix(int numRows, int numCols)
        //                      行数         列数
        SimpleMatrix matrix0 = new SimpleMatrix(2, 4);
 
 
 
        //-------------------------------------------------------------------
        //通过二维数组创建矩阵
        //可以理解成将数组变成相同结构的矩阵
 
        //1、以double型的二维数组构造相同结构的矩阵
        //    SimpleMatrix(double[][] data)
        double[][] arrayDouble2 = new double[2][4];
        SimpleMatrix matrixDouble2 = new SimpleMatrix(arrayDouble2);
        System.out.println("matrixDouble2:\n" + matrixDouble2);
 
        //2、以float型的二维数组构造相同结构的矩阵
        //    SimpleMatrix(float[][] data)
        double[][] arrayFloat2 = new double[2][4];
        SimpleMatrix matrixFloat2 = new SimpleMatrix(arrayFloat2);
        System.out.println("matrixFloat2:\n" + matrixFloat2);
 
 
 
        //---------------------------------------------------------------------
        //通过一维数组创建行列数
        //可以理解成将一维数组的数据按照每一行(每一列)的顺序填入给定大小的矩阵
        /*  SimpleMatrix(int numRows, int numCols, boolean rowMajor, float/double[] data)
                           行数          列数    true(按行) false(按列)  数据源
        */
 
        double[] arrayDouble1 = {1, 2, 3, 4, 5, 6, 7, 8, 9};//double也行
 
        //1.按照每一行填入数据
        SimpleMatrix matrixDoubleRow = new SimpleMatrix(4, 2, true, arrayDouble1);
        System.out.println("matrixDoubleRow:\n" + matrixDoubleRow);
 
        //2.按照每一列填入数据
        SimpleMatrix matrixDoubleCol = new SimpleMatrix(4, 2, false, arrayDouble1);
        System.out.println("matrixDoubleCol:\n" + matrixDoubleCol);
 
        /*   matrixDoubleRow: 4x2      matrixDoubleCol: 4x2
             [1,2]                     [1,5]
             [3,4]                     [2,6]
             [5,6]                     [3,7]
             [7,8]                     [4,8]
         */
 
 
 
        //-------------------------------------------------------------------
        SimpleMatrix matrixA = new SimpleMatrix(4, 4);  //创建4x4的矩阵A
        SimpleMatrix matrixB = new SimpleMatrix(4, 4);  //创建4x4的矩阵B
        SimpleMatrix matrixC = new SimpleMatrix(4, 4);  //创建5x5的矩阵C
        matrixA.fill(1); //将A的所有元素设为1
        matrixB.fill(2); //将B的所有元素设为2
        System.out.println(matrixA);
        System.out.println(matrixB);
 
 
 
       /*  加、减法
        T	plus(double b)            C = A + b      将矩阵A所有元素都加上b(如需减,则将b设为负)
        T	plus(double beta, T B)    C = A + betaB  将B的所有元素都乘以beta,再让加上A(如需减,则将beta设置为负)
        T	plus(T B)                 C = A + B      矩阵A加上矩阵B
        T	minus(double b)	          C = A - b      将矩阵A所有元素都减去b
        T	minus(T B)	              C = A - B      矩阵A加上矩阵B
        */
        matrixC.fill(1);
        matrixC = matrixA.plus(0.6);  //A的所有元素乘以0.6
        System.out.println(matrixC);
 
        matrixC.fill(1);
        matrixC = matrixA.plus(0.2,matrixB);  // A + 0.2*B
        System.out.println(matrixC);
 
        matrixC.fill(1);
        matrixC = matrixA.plus(matrixB);  // A + B
        System.out.println(matrixC);
 
        matrixC.fill(1);
        matrixC = matrixA.minus(6);  // A的所有元素减6
        System.out.println(matrixC);
 
        matrixC.fill(1);
        matrixC = matrixA.minus(matrixB);  // A - B
        System.out.println(matrixC);
 
 
 
        /*  乘法
        1. 矩阵与矩阵相乘(行列式)
            T	mult(T B)               C = A * B    矩阵A与矩阵B相乘并返回
        2. 数乘
            T	negative()              C = -A       矩阵A的所有元素乘以-1
            T	scale(double val)       C = val*A    矩阵A的所有元素乘以val
        */
        matrixC = matrixA.mult(matrixB); // C = A * B
        System.out.println(matrixC);
 
        matrixC = matrixA.negative();  // C = -A
        System.out.println(matrixC);
 
        matrixC = matrixA.scale(9.99); // C = A*9.99
        System.out.println(matrixC);
 
 
        /* 除法
            T	divide(double val)      C = A/val    将矩阵A的所有元素都除以val
        */
        matrixC = matrixA.divide(50);  //C = A的所有元素都除以50所得的矩阵
        System.out.println(matrixC);
 
 
        /*  矩阵的转置
            T	transpose()   返回给定矩阵的转置
        */
        int val = 1;
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                matrixC.set(i, j, val);
                val++;
            }
        }
        System.out.println(matrixC);
        SimpleMatrix matrixC_transpose = matrixC.transpose();
        System.out.println(matrixC_transpose);
 
 
        /*  矩阵的逆阵
            T	invert()            求可逆矩阵的逆阵
            T	pseudoInverse()     求摩尔彭若斯广义逆(对于可逆矩阵与上行方法一致)
        */
        SimpleMatrix matrixD = new SimpleMatrix(4, 4);
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if (i == j) {
                    matrixD.set(i, j, i + 1);
                } else {
                    matrixD.set(i, j, 0);
                }
            }
        }
        System.out.println("矩阵D:\n"+matrixD);
 
        SimpleMatrix D_invert = matrixD.invert();
        System.out.println("矩阵D的逆阵:\n"+D_invert);
 
        SimpleMatrix D_pseudoInverse = matrixD.pseudoInverse();
        System.out.println("矩阵D的广义逆阵:\n"+D_pseudoInverse);
 
 
 
        //---------------------------------------------------------------------
        //创建n阶单位矩阵  identity matrix
        int n =7;
        SimpleMatrix tempMatrix = new SimpleMatrix(n,1); //创建nx1的列向量
        tempMatrix.fill(1); //所有元素置为1
        SimpleMatrix I =  tempMatrix.diag();
        //A.diag()方法,如果A是矩阵,则返回一个由该矩阵的对角线上的值组成的列向量
        //             如果A是列向量,则将其扩展为一个矩阵,矩阵的对角线的值就是该列向量
        System.out.println(I);
 
 
 
        //---------------------------------------------------------------------
        SimpleMatrix matrix = new SimpleMatrix(8,8);
 
        matrix.fill(4);     //将矩阵元素都设置为4
        matrix.zero();      //将矩阵元素都设置为0
        matrix.set(1,4,3);      //将第一行第四列元素设置为3
        matrix.set(0,8);            //将第零个元素设置为8
 
        matrix.rows(1,2);           //获取矩阵的部分行,第一个数表示开始的那一行,第二个数表示结束那一行加一(这里表示获取第一行)
        matrix.cols(2,8);           //获取矩阵的部分列,第一个数表示开始的那一列,第二个数表示结束那一列加一(这里表示获取第2,3,4,5,6,7行)
        matrix.get(2,3);   //获取第二行第三个数
        matrix.get(2);              //获取第二个元素
 
        matrix.copy();              //复制一个矩阵
        matrix.createLike();        //创建一个与matrix相同行列数且元素相同的矩阵
 
        matrix.numRows();           //获取矩阵的行数
        matrix.numCols();           //获取矩阵的列数
        matrix.getNumElements();    //获取矩阵的元素个数(行数乘以列数)
 
        matrix.elementMaxAbs();     //获取矩阵中所有元素绝对值的最大值
        matrix.elementMinAbs();     //获取矩阵中所有元素绝对值的最小值
        matrix.elementSum();        //计算矩阵中所有元素的和
 
        matrix.normF();             //计算矩阵的二范数(所有元素平方和开根号,可以理解成向量的模)
        matrix.determinant();       //计算矩阵行列数值
 
 
 
        //---------------------------------------------------------------------
        matrixC = matrixA.elementDiv(matrixB);   // 对应相除 C(i,j) = A(i,j) / B(i,j)
        matrixC = matrixA.elementMult(matrixB);  // 对应相乘 C(i,j) = A(i,j) * B(i,j)
        matrixC = matrixA.elementExp();          // C(i,j) = e 的 A(i,j)次方
        matrixC = matrixA.elementLog();          // C(i,j) = ln(C(i,j))
        matrixC = matrixA.elementPower(2);       // C(i,j) = A(i,j)^2 (对应元素的n次方)
        matrixC = matrixA.elementPower(matrixB); // C(i,j) = A(i,j)^(B(i,j)) (对应元素的对应次方)
 
 
    }
}

到了这里,关于Java 矩阵算法工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flutterui构建工具,Java+性能优化+APP开发+NDK+跨平台技术

    面试的时候除了算法题,其他被怼成弟弟,没想到面试官给过了,一天面完三面并且一周之后收到了oc,觉得自己非常的幸运,终于得到了大厂的认可(虽然是颗白菜)。这里建议网友如果有自己亮点的话,还是可以勇敢大胆的尝试一下大厂,毕竟除了实力之外,运气与机遇也占

    2024年03月15日
    浏览(57)
  • java数据结构与算法刷题-----LeetCode566. 重塑矩阵

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 代码:时间复杂度O(r*c).除题目要求外,算法本身没有需要额外空间,空间复杂度O(1) 从0开始算,一个3列n行矩阵中,每行就有3个元

    2024年01月21日
    浏览(43)
  • 华为OD机试 -矩阵扩散(Java) | 机试题+算法思路+考点+代码解析 【2023】

    存在一个mn的二维数组,其成员取值范围为0或1。其中值为1的成员具备扩散性,每经过1S,将上下左右值为0的成员同化为1。二维数组的成员初始值都为0,将第[i,j]和[k,l]两个个位置上元素修改成1后,求矩阵的所有元素变为1需要多长时间。 输入描述: 输出数据中的前2个数字表

    2024年02月16日
    浏览(58)
  • java数据结构与算法刷题-----LeetCode766. 托普利茨矩阵

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 这道题只要换一种理解方式,瞬间就会变的很简单。 题目描述是每个元素左上和右下对角线元素都相同。但是,我们发

    2024年01月25日
    浏览(45)
  • java数据结构与算法刷题-----LeetCode240. 搜索二维矩阵 II

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 法一:把整个数组遍历一遍,时间复杂度O(m*n) 法二:每一行用二分搜索,那么时间复杂度就是O(m * l o g 2 n log_2{n} l o g

    2024年01月22日
    浏览(56)
  • 华为OD机试 -矩阵最大值(Java) | 机试题+算法思路+考点+代码解析 【2023】

    给定一个仅包含0和1的N*N二维矩阵,请计算二维矩阵的最大值,计算规则如下: 1、 每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。 2、允许通过向左或向右整体循环移动每行元素来改变各元素在行中

    2024年02月13日
    浏览(53)
  • 【华为OD机试真题 Java语言】68、矩阵扩散 | 机试题+算法思路+考点+代码解析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Java语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习 🎃题目描述 存在一个m*n的二维数组,其成员取值范围为0或1  

    2024年02月14日
    浏览(50)
  • 255.【华为OD机试】最小矩阵宽度(滑动窗口算法-Java&Python&C++&JS实现)

    🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(JavaPythonC++JS分别实现),详细代码讲解,助你深入学习,深度掌握!

    2024年03月13日
    浏览(62)
  • java数据结构与算法刷题-----LeetCode378. 有序矩阵中第 K 小的元素

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 已知矩阵相对有序,可以用二分搜索,不过和一维数组排序不同,这是二维的 每一行都递增,每一列也是递增,所以每

    2024年01月23日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包