我正在编写一个java程序,该程序涉及处理包含浮点值的1058 X 1058矩阵。这个矩阵包含许多零值,所以我需要将其存储为稀疏矩阵,然后使用这个矩阵生成生成生成树。我检查了许多流行的库,如Colt、Jama,但不知何故,我无法将它们用于我的代码。我想要一个坐标存储系统(类似于在matlab中使用sparse()函数获得的),如下所示:
(1055,1045) 1.0000
(1056,1045) 1.0000
(1057,1045) 1.0000
(1058,1045) 1.0000
(1047,1046) 1.0000
(1048,1046) 1.0000
(1049,1046) 1.0000
(1050,1046) 1.0000
(1051,1046) 1.0000
(1052,1046) 1.0000
(1053,1046) 1.0000
(1054,1046) 1.0000
(1055,1046) 1.0000
有人能建议怎么做吗?
您可以在没有任何lib的情况下快速完成。创建以下类:
MatrixIndex implements Comparable<MatrixIndex>
{
private final int _x;
private final int _y;
...
}
然后在某些情况下使用:
TreeMap<MatrixIndex,Double>
干杯
有一个la4j(Java线性代数)库,它使用CRSMatrix
/CCSMatrix
稀疏矩阵类型和MatrixMarketStream
类来处理此问题。下面是一个简单的例子:
源文件"matrix.mm"(5x5矩阵,包含8个非零元素):
%%MatrixMarket matrix coordinate real general
5 5 8
1 1 1.000e+00
2 2 1.050e+01
3 3 1.500e-02
1 4 6.000e+00
4 2 2.505e+02
4 4 -2.800e+02
4 5 3.332e+01
5 5 1.200e+01
Java源代码(la4j用法):
Matrix a = new CRSMatrix(Matrices.asMatrixMarketSource(
new FileInputStream(new File("matrix.mm"))));
System.out.println("DET(A) = " + a.determinant());
关于MatrixMarket格式,请阅读此处。关于CRS/CCS格式,请阅读此处和此处。
要生成MatrixMarket输出,请使用以下代码:
Matrix a = new CRSMatrix(...);
MatrixStream out = new MatrixMarketStream(new FileOutputStream(
new File("matrix.mm")));
out.writeMatrix(a);