Commons Math学习笔记——矩阵
1.2 矩阵
看其他篇章到目录选择。
今天来第二篇:矩阵——Matrix。
Math包org.apache.commons.math.linear里对矩阵的表示是有一个层次结构的。
最顶层的AnyMatrix是一个基本的interface。下面有3个sub interface:BigMatrix, FieldMatrix<T>, RealMatrix。而每个sub interface分别被相应的矩阵类实现。整个矩阵的层次结构也就出来了。不过其中的BigMatrix已经不用了。被Array2DRowFieldMatrix替代了。
具体拿RealMatrix来说。
RealMatrix是一个可以表示实数类型数据的矩阵接口,实现RealMatrix接口的类有AbstractRealMatrix。它的子类有Array2DRowRealMatrix, BlockRealMatrix, OpenMapRealMatrix, RealMatrixImpl。
今天以Array2DRowRealMatrix为例研究一下矩阵Matrix都有哪些操作。
我认为通常最简单的学习方式就是直接看代码样例,为此,我写了使用Matrix的样例代码,通过代码的演示来看看如何使用Array2DRowRealMatrix。
Array2DRowRealMatrix的内部实现是一个2维double类型的数组double [][]data;。它的getData方法可以返回对应的数组表示。LU decomposition用来进行矩阵的分解及相关操作,Array2DRowRealMatrix中有几个方法已经过时,均被LU decomposition取代。像矩阵的求逆运算、特征值以及奇异性等。矩阵的一些分解运算,我想还是放到后面再研究吧。代码一次太多也不好,嘻嘻。
具体的代码实现里有注释和输出提示,我想这样的代码大家运行后基本就能完全理解Array2DRowRealMatrix的所有操作了。
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
运行结果:
matrix is Array2DRowRealMatrix{{1.0,2.0,3.0},{2.0,5.0,3.0},{1.0,0.0,8.0}}
it is square matrix! : true
row dimension is 3
column dimension is 3
mat1 + mat1 = Array2DRowRealMatrix{{2.0,4.0,6.0},{4.0,10.0,6.0},{2.0,0.0,16.0}}
mat1 + 5 = Array2DRowRealMatrix{{6.0,7.0,8.0},{7.0,10.0,8.0},{6.0,5.0,13.0}}
mat1 - mat1 = Array2DRowRealMatrix{{0.0,0.0,0.0},{0.0,0.0,0.0},{0.0,0.0,0.0}}
the maximum absolute row sum norm is 14.0
mat1 * t_mat = Array2DRowRealMatrix{{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0}}
mat1 * 5.0 = Array2DRowRealMatrix{{5.0,10.0,15.0},{10.0,25.0,15.0},{5.0,0.0,40.0}}
t_mat * mat1 = Array2DRowRealMatrix{{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0}}
the trace is 14.0
the transpose of mat1 is Array2DRowRealMatrix{{1.0,2.0,1.0},{2.0,5.0,0.0},{3.0,3.0,8.0}}
the first row vector is {1; 2; 3}
sub matrix of mat1 is Array2DRowRealMatrix{{2.0,3.0},{0.0,8.0}}
AnyMatrix接口只定义了最基本的操作,获取维度和判断方阵。
RealMatrix接口扩展了AnyMatrix,定义了一些操作,比如加减乘等。
AbstractRealMatrix抽象类实现了RealMatrix,定义了更多的get方法,可以获得更多矩阵相关的参数,比如矩阵的秩、矩阵的迹、矩阵的特征值和矩阵的转置等。
Array2DRowRealMatrix继承了AbstractRealMatrix,将里面的抽象方法全部实现。
其中的multiply矩阵乘法运算,multiply返回的是this*m;而preMultiply返回的是m*this。
另外值得一提的是,linear包里有MatrixUtils类提供了一系列静态方法用来检测矩阵,其中的方法主要以check***为主,检测矩阵的合法性。
相关资料:
矩阵知识:http://zh.wikipedia.org/zh/%E7%9F%A9%E9%98%B5
Commons math包:http://commons.apache.org/math/index.html