在Java中读取和处理.mat文件(Adjacency Matrix)

时间:2016-09-05 23:13:43

标签: java matlab adjacency-matrix cytoscape

我已经介绍了很多StackOverflow问题和Google搜索结果,阅读了很多讨论主题,但我找不到任何正确的答案。我有.mat格式的稀疏矩阵,包含36600个节点(36600x36600邻接矩阵),用于在Java环境中读取和操作(如矩阵向量乘法)。我应用了很多在这里讨论的答案,但我总是得到NullPointerException错误,尽管那个.mat文件有一个数据。(有人说这些结果是因为数据的大小)我已经将这些代码应用到我的.mat文件中了null和NullPointerException。

MatFileReader matfilereader = new MatFileReader("sourceData.mat");
MLArray mlArrayRetrieved = matfilereader.getMLArray("data");
System.out.println(mlArrayRetrieved);
System.out.println(mlArrayRetrieved.contentToString());

此外,我已多次尝试将.mat文件转换为.csv或.xls在MATLAB环境和Python环境中的Jupyter Notebook,但是,我在这些时候也没有得到任何结果。

该.mat文件将成为一个邻接矩阵,并将成为Cytoscape项目中特定算法的源。因此,我必须在Java环境中使用它,我决定使用COLT库进行矩阵操作。建议和建议将对我有所帮助。谢谢阅读。

2 个答案:

答案 0 :(得分:0)

只需使用find获取非零元素的行,列和值,并将其保存为text,csv或...:

[row, col, v] = find(my_spares_matrix);

答案 1 :(得分:0)

下面是使用MFL的代码段,将导致稀疏矩阵中所有值的类似MATLAB的打印输出

Mat5.readFromFile("sourceData.mat")
    .getSparse("data")
    .forEach((row, col, real, imag) -> {
        System.out.println(String.format("(%d,%d) \t %1.4f ", row + 1, col + 1, real));
    });

对于提到的750KB矩阵,CSV解决方法可以很好地工作,但是一旦数据集超过50MB,就可能变得难以使用。 MAT文件以(二进制)Compressed Sparse Column (CSC)格式存储稀疏数据,与CSV文件相比,这种文件的加载开销明显更少。