【问题标题】:Reading and Processing .mat file (Adjacency Matrix) in Java用Java读取和处理.mat文件(邻接矩阵)
【发布时间】:2016-09-05 23:13:43
【问题描述】:

我已经讨论了很多 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());

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

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

【问题讨论】:

  • 你的数据文件有多大?
  • @jafergas 750KB,稀疏矩阵。

标签: java matlab adjacency-matrix cytoscape


【解决方案1】:

只需使用find 获取非零元素的行、列和值,并将它们保存为文本、csv 或...:

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

【讨论】:

  • 我已经使用过并且可以正常工作,但是我可以看到许多重复的顺序混合。你知道为什么吗?为了提供详细信息,该稀疏矩阵的预览就像 1, 2, 3, 4, ... 作为行和列。但是三个维度的输出就像 2,2,2,2,2,1,1,1 等。
  • 3d 列表示图节点之间的某种关系,但在您的问题域中,我不知道它的真正含义。
【解决方案2】:

下面是使用MFL 的代码 sn-p,它将导致稀疏矩阵中所有值的类似 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));
    });

CSV 解决方法适用于上述 750KB 矩阵,但一旦数据集超过 >50MB,它可能会变得难以使用。 MAT 文件以(二进制)Compressed Sparse Column (CSC) 格式存储稀疏数据,与 CSV 文件相比,加载该格式的开销要少得多。

【讨论】:

    猜你喜欢
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2020-12-13
    • 2023-04-03
    相关资源
    最近更新 更多