java中的高效矩阵运算包Ejml的使用

标签: java 矩阵运算
53人阅读 评论(0) 收藏 举报
分类:

本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流。
未经本人允许禁止转载

简介

在编写算法时,经常会遇到矩阵的运算,在java中,我之前介绍了,如何使用math3来做矩阵的相关运算。该博客的地址为:
https://blog.csdn.net/qy20115549/article/details/54604264

之前,我主要是使用math3来做多元正太分布后验采样的计算。最近,再看一个他人写的源码时,使用了Ejml这款矩阵运算工具来做多元正太分布后验才能的计算,所以特意学习一下,写成博客,以供他人借鉴参考。

Ejml

Ejml全称为Efficient Java Matrix Library,一款高效的矩阵运算java库。
由于在写算法时,经常遇到矩阵的运算,如数组转化为矩阵,矩阵的逆,矩阵的转置,矩阵的乘法,矩阵转为数组等等。下面写了一个小程序演示一下,相关操作。具体请看注释。

package util;

import org.ejml.data.DenseMatrix64F;
import org.ejml.ops.CommonOps;

/*
 * author:合肥工业大学 管院学院 钱洋 
 *1563178220@qq.com
 *博客地址:http://blog.csdn.net/qy20115549/
*/
public class Test {
    public static int D = 3;
    public static void main(String[] args) {
        DenseMatrix64F L = new DenseMatrix64F(3,3); //初始化一个矩阵,并进行下面的赋值
        L.set(0,0,4.0);
        L.set(0,1,13.0);
        L.set(0,2,-16.0);
        L.set(1,0,12.0);
        L.set(1,1,37.0);
        L.set(1,2,-43.0);
        L.set(2,0,-16.0);
        L.set(2,1,-43.0);
        L.set(2,2,98.0);
        System.out.println("data为:");
        System.out.println(L);

        DenseMatrix64F[] dataVectors = new DenseMatrix64F[D];  //切分矩阵
        CommonOps.rowsToVector(L, dataVectors);
        DenseMatrix64F mu_0  = getSampleMean(dataVectors);  //获取均值
        System.out.println("数据的均值为:"+mu_0);

        DenseMatrix64F sigma_0 = CommonOps.identity(D); //设置单位阵
        System.out.println("单位阵为:"+sigma_0);

        CommonOps.scale(3*D, sigma_0); //扩大矩阵
        System.out.println("扩大后的矩阵为sigma_0:"+sigma_0);
        for (int i = 0; i < dataVectors.length; i++) {
            System.out.println("====================");
            System.out.println(dataVectors[i]);
        }

        DenseMatrix64F CholSigma0 = new DenseMatrix64F(D,D);
        CommonOps.addEquals(CholSigma0, sigma_0); //复制矩阵
        System.out.println("复制后的矩阵为CholSigma0:"+CholSigma0);
        System.out.println();

        DenseMatrix64F mult_element = new DenseMatrix64F(D,D); //矩阵对应元素相乘
        CommonOps.elementMult(L, L, mult_element); 
        System.out.println("两个矩阵对应元素相乘的结果为:"+mult_element);

        DenseMatrix64F mult = new DenseMatrix64F(D,D);  //矩阵乘法
        CommonOps.mult(L, sigma_0, mult);
        System.out.println("两个矩阵相乘的结果为:"+mult);

        DenseMatrix64F add = new DenseMatrix64F(D,D);  //矩阵对应元素相加
        CommonOps.add(L, L, add);
        System.out.println("两个矩阵相加的值为:"+add);

        DenseMatrix64F sub = new DenseMatrix64F(D,D);  //矩阵减法
        CommonOps.sub(L, sigma_0, sub);;
        System.out.println("两个矩阵相减的值为:"+sub);


        DenseMatrix64F trans = new DenseMatrix64F(D,D);  //矩阵转置
        CommonOps.transpose(L, trans);
        System.out.println("转置后的矩阵为:"+trans);

        DenseMatrix64F elementdiv = new DenseMatrix64F(D,D);  //矩阵对应元素相除
        CommonOps.elementDiv(sigma_0, L, elementdiv);
        System.out.println("矩阵对应元素相除的结果为:"+elementdiv);

        DenseMatrix64F inverse= new DenseMatrix64F(D,D);  ////矩阵的逆
        CommonOps.invert(L, inverse);
        System.out.println("矩阵的逆为:"+inverse);
    }
    /**
     * mean of the data
     * @param data
     * @return
     */
    public static DenseMatrix64F getSampleMean(DenseMatrix64F[] data)
    {
        DenseMatrix64F mean = new DenseMatrix64F(D, 1);//initialized to 0
        for(DenseMatrix64F vec:data)        
            CommonOps.addEquals(mean, vec);  //获取每一行数据的均值

        CommonOps.divide(data.length, mean);

        return mean;
    }
}

程序结果


这里写图片描述


这里写图片描述


这里写图片描述

查看评论

Java调用Jama包完成矩阵运算

Java开发机器学习算法的时候,经常用到矩阵运算,我们可以调用Jama包来完成矩阵运算。     Jama包下载地址:https://dl.pandaidea.com/jarfiles/j/...
  • puqutogether
  • puqutogether
  • 2015年03月10日 17:44
  • 4471

java矩阵运算包JAMA的使用

官方网址http://math.nist.gov/javanumerics/jama/
  • qifuchenluo
  • qifuchenluo
  • 2015年05月13日 21:18
  • 1724

Java中矩阵运算(math3的使用)

math3简介 math3中的矩阵操作 演示结果本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流。 未经本人允许禁止转载。下面是...
  • qy20115549
  • qy20115549
  • 2017年01月18日 20:12
  • 7305

用C++11优化矩阵运算的空间和时间效率

最近在segmentfault.com上看到一个问题,提问者想要利用C++11的移动语义,减少矩阵相加时临时对象的构造。受此启发,我实现了一个简单的矩阵类,利用C++11标准中的一些特性,对矩阵运算进...
  • clangpp
  • clangpp
  • 2014年08月28日 00:21
  • 772

java矩阵运算包ujmp中的一些小示例和注意事项

本人最近在用ujmp包写一些程序,ujmp包是针对于超大数据量计算的矩阵的运算包,并且有图形显示的功能且支持多种文件格式的读取和输出,还支持连接数据库,matlab数据类型和weka数据类型,总体来说...
  • u010986080
  • u010986080
  • 2016年05月15日 16:25
  • 453

Java矩阵运算包ujmp的基本使用

本人最近在用ujmp包写一些程序,ujmp包是针对于超大数据量计算的矩阵的运算包,并且有图形显示的功能且支持多种文件格式的读取和输出,还支持连接数据库,matlab数据类型和weka数据类型,总体来说...
  • yushengpeng
  • yushengpeng
  • 2018年01月15日 21:22
  • 215

在 Java 中高效使用锁的技巧

在 Java 中高效使用锁的技巧--转载 竞争锁是造成多线程应用程序性能瓶颈的主要原因 区分竞争锁和非竞争锁对性能的影响非常重要。如果一个锁自始至终只被一个线程使用,那么 JVM 有能力优化它带来的...
  • u010154380
  • u010154380
  • 2017年11月15日 19:14
  • 63

[算法]矩阵的基本运算(Java实现)

直接贴代码:package 基本矩阵运算;public class BasicMatrixMath { public final static int OPERATION_ADD = 1; ...
  • CodeEmperor
  • CodeEmperor
  • 2016年02月29日 22:35
  • 3704

C++矩阵运算库推荐

最近在几个地方都看到有人问C++下用什么矩阵运算库比较好,顺便做了个调查,做一些相关的推荐吧。主要针对稠密矩阵,有时间会再写一个稀疏矩阵的推荐。 Armadillo:C++下的Matlab替代品...
  • chenbang110
  • chenbang110
  • 2013年10月05日 10:16
  • 25252

常见矩阵运算Python

python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包。 1.numpy的导入和使用 from numpy import *;#导入numpy的库函数 ...
  • wuxiaosi808
  • wuxiaosi808
  • 2017年10月12日 11:00
  • 3754
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 56万+
    积分: 6065
    排名: 5192
    联系方式

    欢迎评论交流,正常情况每天都会查看博客!

      邮箱:1563178220@qq.com;qy20115549@126.com
      发送邮件或申请加qq好友的,请注明咨询或者源码获取,白天较少回复请留言,将相关问题说明。

      由于本人知识有限,博客难免会有错误或疏漏之处,发现会及时修正。另外本人博客仅供学习使用,未经本人允许,禁止转载,或者上传到百度文库、道客巴巴等平台。

    Flag Counter Flag Counter
    博客专栏
    最新评论