使用坐标存储系统创建稀疏矩阵?

时间:2013-07-09 19:34:52

标签: java algorithm matrix sparse-matrix colt

我正在编写一个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

有人可以建议怎么做吗?

2 个答案:

答案 0 :(得分:0)

你可以在没有任何lib的情况下快速完成。创建以下类:

MatrixIndex implements Comparable<MatrixIndex>
{
  private final int _x;
  private final int _y;

  ...
}

然后在某些地方使用它:

TreeMap<MatrixIndex,Double>

干杯

答案 1 :(得分:0)

la4j(线性代数for Java)库,可以使用CRSMatrix / CCSMatrix稀疏矩阵类型和MatrixMarketStream类来处理此问题。这是一个简短的例子:

源文件&#34; matrix.mm&#34; (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格式,请阅读here。关于CRS / CCS格式,请阅读herehere

要生成MatrixMarket输出,请使用以下代码:

Matrix a = new CRSMatrix(...);
MatrixStream out = new MatrixMarketStream(new FileOutputStream(
                        new File("matrix.mm")));

out.writeMatrix(a);