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

本人最近在用ujmp包写一些程序,ujmp包是针对于超大数据量计算的矩阵的运算包,并且有图形显示的功能且支持多种文件格式的读取和输出,还支持连接数据库,matlab数据类型和weka数据类型,总体来说非常好用,但是有一个很大的缺陷就是基本没有相关的示例和文档,官网上的示例有基本全都过时不能用了,本人总结了一下相关用法,仅供大家参考,代码并不能运行,知识给大家列出了相应的矩阵运算方式和构造方式,希望能对大家有所帮助

LINK
可以用来进行矩阵求逆,矩阵相乘,矩阵的行列选取,大体来说是在矩阵大小变换是依然可用,但是不可用于矩阵数值的改变,试图改变LINK后的矩阵中的值,其实不会改变,要改变原来矩阵的值才有用;

对一个原始矩阵进行转置,当矩阵转置后返回的如果是LINK,随后进行赋值操作,则LINK矩阵和转置前的矩阵都不会有变化,即使从转置后的矩阵抽取一列或一行进行赋值,所有矩阵也不会有变化。

对一个原始矩阵选取其行或列是返回的是LINK,随后进行赋值操作,则原矩阵和LINK矩阵都会变化

对LINK后的矩阵再进行LIK转置,矩阵是会改变的

在至今的测试中,除了设值,其他的都可以改变,也可以获取值

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

long m = 5;

        long
n = 5;

        /**

         * 制造一个空矩阵

         */

        Matrix emptyMatrix = MatrixFactory.emptyMatrix();

        /**

         * 制造一个m*n随机矩阵

         */

        Matrix randMatrix = Matrix.factory.rand(m, n);

        /**

         * 制造一个m*n零矩阵

         */

        Matrix zeroMatrix = Matrix.factory.zeros(m, n);

        /**

         * 制造一个m*n对角线为1其余元素为0的矩阵

         */

        Matrix eyeMatrix = Matrix.factory.eye(m, n);

        /**

         * 制造一个m*n全部元素为1的矩阵

         */

        Matrix oneMatrix = Matrix.factory.ones(m, n);

        /**

         * 矩阵的相关操作

         */

        // 矩阵与数值的相关运算,意思大家根据英语的含义就能看出,这里就不解释了

        Matrix res_1 = oneMatrix.times(10);

        Matrix res_2 = oneMatrix.divide(10);

        Matrix res_3 = oneMatrix.plus(10);

        Matrix res_4 = oneMatrix.minus(10);

        /**

         * 矩阵与矩阵的相关运算 加和减函数都不用变,乘的话要加上m表示matrix间计算

         */

        Matrix res_5 = oneMatrix.mtimes(randMatrix);

        Matrix res_7 = oneMatrix.plus(randMatrix);

        Matrix res_8 = oneMatrix.minus(randMatrix);

        /**

         * 求转置求逆,这里有三种返回型,分别是link orig new 计算时间new > orig > link 无返回型和orig的时间类似

         */

        Matrix res_9 = oneMatrix.transpose(Ret.LINK);

        Matrix res_10 = oneMatrix.transpose(Ret.ORIG);

        Matrix res_11 = oneMatrix.transpose(Ret.NEW);

        Matrix res_12 = oneMatrix.inv();

        // 选取子矩阵

        Matrix res_13 = oneMatrix.subMatrix(Ret.NEW, startRow, startColumn,

                endRow, endColumn);

        // 选取行

        Matrix res_14 = oneMatrix.selectRows(returnType, rows);

        // 选取列

        Matrix res_15 = oneMatrix.selectColumns(returnType, columns);

        // 按第i列进行排序,reverse表示返回的排序矩阵是按正序还是逆序

        Matrix res_16 = oneMatrix.sortrows(returnType, column, reverse);

        // 将矩阵的所有数值相加得到的返回值

        Matrix res_17 = oneMatrix.getValueSum();

        // 选去矩阵的行和列

        Matrix res_18 = oneMatrix.getColumnCount();

        Matrix res_19 = oneMatrix.getRowCount();

        //判断矩阵否和一个矩阵或一个值相等,相等的话在相应的位置设置为为true否则为false,

        //如果要看相等的个数的总和则可再继续用一个getvaluecount函数即可

        Matrix res_20 = oneMatrix.eq(returnType, matrix);

        matrix res_21 = oneMatrix.eq(returnType, value)<br><br>当矩阵返回类型为RET.ORIG的时候不能使用任何有可能改变矩阵大小的操作(除非自己知道确实不会改变),例如转置、选取行列、子矩阵等~~~~~<br><br>


package MatrixPFTest.yi.maytwenty;

import org.ujmp.core.Matrix;
import org.ujmp.core.MatrixFactory;
import org.ujmp.core.calculation.Calculation.Ret;

public class PerfomaceTest {
public static void main(String[] args) {
long begin, end;
/**
* test变test2才变 *********test2不能被改变
*/

long m = 725, n = 20;
// Matrix test_1 = Matrix.factory.rand(5, 5);
// test_1.showGUI();
// Matrix test_2 = test_1.transpose(Ret.ORIG);
// test_2.showGUI();
// Matrix test_3 = test_2.mtimes(Matrix.factory.ones(5, 5).times(2));
// test_3.showGUI();
begin = System.currentTimeMillis();
Matrix res = Matrix.factory.rand(m, n);
Matrix res0 = Matrix.factory.rand(m, n);
end = System.currentTimeMillis();
Constans.sop("构建矩阵耗时" + (end - begin) + "ms");
// res.setLabel("res");
// res.showGUI();

begin = System.currentTimeMillis();
Matrix res_1_trannull = res.transpose();
end = System.currentTimeMillis();
Constans.sop("res_1_trannull-耗时" + (end - begin) + "ms");

begin = System.currentTimeMillis();
Matrix res_2_tranlink = res.transpose(Ret.LINK);
end = System.currentTimeMillis();
Constans.sop("res_2_tranlink-耗时" + (end - begin) + "ms");
// res_2_tranlink.setLabel("res_2_tranlink");
// res_2_tranlink.setAsDouble(10, 0, 0);
// res_2_tranlink.showGUI();

/**
* 进行矩阵赋值,两个矩阵式同一个矩阵,除非用copy()
*/
Matrix xxxMatrix = res_2_tranlink;
xxxMatrix.setAsDouble(10, 0, 0);
xxxMatrix.showGUI();
/**
* 对LINK的矩阵进行赋值
*/
res_2_tranlink = MatrixFactory.ones(1, 1);
res_2_tranlink.setAsDouble(110, 0, 0);
res_2_tranlink.showGUI();

/**
* 选取特定行与列
*/
begin = System.currentTimeMillis();
Matrix res_3 = res_2_tranlink.selectColumns(Ret.NEW, 10);
end = System.currentTimeMillis();
res_3.showGUI();
Constans.sop("选取列-NEW-耗时" + (end - begin) + "ms");

begin = System.currentTimeMillis();
Matrix res_4 = res_2_tranlink.selectColumns(Ret.LINK, 0);
end = System.currentTimeMillis();
res_4.setAsDouble(10, 0, 0);
res_4.showGUI();
Constans.sop("选取列-link-耗时" + (end - begin) + "ms");

/**
* 求逆耗时较长,但是inv和invSymm相差无几
*/
for (int i = 0; i < 1; ++i) {
begin = System.currentTimeMillis();
Matrix res_5 = res_2_tranlink.inv();
end = System.currentTimeMillis();
Constans.sop("inv-耗时" + (end - begin) + "ms");
}

/**
* 获取行数,列数
*/
begin = System.currentTimeMillis();
long res_rowcount = res_2_tranlink.getRowCount();
end = System.currentTimeMillis();
Constans.sop("getRowCount-耗时" + (end - begin) + "ms");

/**
* 矩阵相乘的检测
*/

begin = System.currentTimeMillis();
Matrix res_muti_link = res_2_tranlink.mtimes(Ret.LINK, false, res0);
end = System.currentTimeMillis();
res_muti_link.setAsDouble(100, 0, 0);
// res_muti_link.showGUI();
Constans.sop("res_muti_link-耗时" + (end - begin) + "ms");

// 这里是LINK后和LINK后的矩阵相乘,但是返回的是NEW,所以可以改变值
Matrix afterlinklink = res_muti_link.mtimes(res_2_tranlink);
afterlinklink.setAsDouble(100, 0, 0);
afterlinklink.showGUI();
begin = System.currentTimeMillis();
Matrix res_muti_new = res_2_tranlink.mtimes(Ret.NEW, false, res0);
end = System.currentTimeMillis();
res_muti_new.showGUI();
Constans.sop("res_muti_new-耗时" + (end - begin) + "ms");

/**
* 对不是LINK的矩阵选取行或列再改变变量值,使用LINK的话都会受到影响
*/
Matrix beforeMatrix = Matrix.factory.rand(5, 5);
beforeMatrix.setLabel("beforeMatrix");
beforeMatrix.showGUI();

Matrix nowMatrix = beforeMatrix.selectRows(Ret.NEW, 0);
nowMatrix.setAsDouble(10, 0, 0);
nowMatrix.setLabel("nowMatrix");
nowMatrix.showGUI();

Matrix laterMatrix = beforeMatrix.transpose(Ret.LINK);
laterMatrix.setLabel("laterMatrix");
// laterMatrix.showGUI();
Matrix xx = laterMatrix.minus(Ret.LINK, false, 10);
double xxd = xx.getAsDouble(0, 0);
Constans.sop(xxd);
// xx.showGUI();

}
}

  

res.minus(Ret.LINK, false,res2.mtimes(Ret.LINK, false, res1)); 效率最高

时间: 2024-10-08 05:26:44

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

Java动态替换InetAddress中DNS的做法简单分析1

在java.net包描述中, 简要说明了一些关键的接口. 其中负责networking identifiers的是Addresses. 这个类的具体实现类是InetAddress, 底层封装了Inet4Address与Inet6Address的异同, 可以看成一个Facade工具类. A Low Level API, which deals with the following abstractions: Addresses, which are networking identifiers,

Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法

最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).log4j:WARN Please initialize the log4j system properly.log4j:WARN See

Java日期时间API系列17-----Jdk8中java.time包中的新的日期时间API类,java日期计算4,2个日期对比,获取相差年月日部分属性和相差总的天时分秒毫秒纳秒等

通过Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别 ,可以看出java8设计非常好,新增了Period和Duration类,专用于对比2个时间场景: Period,可以获取2个时间相差的年月日的属性. Duration,可以获取2个时间相差总的天时分秒毫秒纳秒. 下面应用: /** * 获取2个日期的相差年月天的年数部分 * @param startInclusive * @param endExclusive

JDK源码简析--java.lang包中的基础类库

题记 JDK,Java Development Kit. 我们必须先认识到,JDK只是,仅仅是一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说,还是在一个层级上,它们都是需要被编译成字节码,在JRE中运行的,JDK编译后的结果就是jre/lib下得rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列所有文章基于的JDK版本都是1.7.16. 本节内容 在本节中,简析java.lang包所包

1.java.io包中定义了多个流类型来实现输入和输出功能,

1.java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分 类,按功能分为:(C),如果为读取的内容进行处理后再输出,需要使用下列哪种流?(G)   A.输入流和输出流 B.字节流和字符流 C.节点流和处理流   D.File stream E.Pipe stream F.Random stream G.Filter stream

Java io包中特殊的抽象类FilterReader和FilterWriter实践

刚才在看帮助文档的时候,发现Java io包中FilterReader和FilterWriter类没使用过,所以想实践一下. 还用以前的老方法,new一个出来,结果提示有错误: Cannot instantiate the type FilterReader 不能实例化? 一查帮助文档原来这样写道: public abstract class FilterReader extends Reader Abstract class for reading filtered character str

JDK框架简析--java.lang包中的基础类库、基础数据类型

题记 JDK.Java Development Kit. 我们必须先认识到,JDK不过,不过一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说.还是在一个层级上,它们都是须要被编译成字节码.在JRE中执行的,JDK编译后的结果就是jre/lib下的rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列全部文章基于的JDK版本号都是1.7.16. 源代码下载地址:https://jdk7.jav

Java矩阵运算,jama包

Jama是一个基本的线性代数java包.包括一个基本的Matrix类和5个矩阵分解类. Matrix类提供了基本的线性代数数值运算的功能,不同的构造函数可以构造双精度和浮点精度的二维数组,而不同的gets和sets方法可以返回子矩阵和矩阵元素. 基本的算术运算包括矩阵相加,矩阵相乘,矩阵范式以及基于矩阵元素的算术运算.打印矩阵的函数也包括在内. 矩阵的五大分解,涉及一对或三元组,排列向量矩阵等,对应于jama的5个矩阵分解类.这些分解类可由Matrix类访问,可以求解线性方程组,求解方阵行列式,

IDEA13中配置struts错误:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter +找不到java程序包 解决办法

问题一:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter解决办法 1.确保所有struts2所需要的包都导进去了(红色标记的),如图: 2.将外部lib下的包都复制到WEB-INFO下: 当再次启动tomcat的时候就可以了.IDEA会把src目录下的所有非*.java文件复制到WEB-INF/classes目录下,所以Tomcat说找不到所需要的类. 相同问题也可参见如下:(具体见原