【问题标题】:How can I save a very large MATLAB sparse matrix to a text file?如何将非常大的 MATLAB 稀疏矩阵保存到文本文件中?
【发布时间】:2008-10-20 09:17:04
【问题描述】:

我在 MATLAB(版本 7)中有一个 30000x14000 的稀疏矩阵,我需要在另一个程序中使用它。调用 save 不会将其写为 ASCII(不支持)。在这个怪物上调用full() 会导致Out of Memory 错误。
如何导出?

【问题讨论】:

    标签: matlab interop


    【解决方案1】:

    您可以使用 find 获取索引和值向量:

    [i,j,val] = find(data)
    data_dump = [i,j,val]
    

    您可以使用 spconvert 从 data_dump 重新创建数据,这意味着“从稀疏矩阵外部格式导入”(所以我想这是一个很好的导出格式):

    data = spconvert( data_dump )
    

    您可以使用以下命令保存到 ascii:

    save -ascii data.txt data_dump
    

    但这会将索引转储为双倍,您可以使用 fopen/fprintf/fclose 更好地写出来:

    fid = fopen('data.txt','w')
    fprintf( fid,'%d %d %f\n', transpose(data_dump) )
    fclose(fid)
    

    希望这会有所帮助。

    【讨论】:

    【解决方案2】:

    将稀疏矩阵保存为.mat 文件。然后,在其他程序中,使用合适的库读取.mat文件。

    例如,如果其他程序是用 Python 编写的,您可以使用 scipy.io.mio.loadmat 函数,该函数支持稀疏数组并为您提供稀疏的 numpy 矩阵。

    【讨论】:

      【解决方案3】:

      我在 MATLAB 中使用 Java 将其保存为文本。 MATLAB代码:

      
      pw=java.io.PrintWriter(java.io.FileWriter('c:\\retail.txt'));
      line=num2str(0:size(data,2)-1);
      pw.println(line);
      for index=1:length(data)
          disp(index);
          line=num2str(full(data(index,:)));
          pw.println(line);
      end
      pw.flush();
      pw.close();
      

      这里data是一个非常大的稀疏矩阵。

      【讨论】:

      • 我很困惑——你为什么使用 java.io 而不是 MATLAB 内置的 fopen 和 fprintf?
      • 可能是因为我对 java 的了解比 matlab 好,而且它是一个扔掉的代码,所以它不需要漂亮。它只需要正常工作:)
      【解决方案4】:

      你试过分区吗?

      我的意思是尝试在前 1000 行(或 5000 行)上调用 full(),如果可行,然后重复该过程。

      【讨论】:

      • 是的,这总是一个选项,编写 ascii 块并稍后合并它们可能会花费很多时间
      【解决方案5】:

      使用find 函数获取非零元素的索引...

      idcs = find(data);
      vals = data(idcs);
      ...save the index vector and value vector in whatever format you want...
      

      如果需要,您可以使用ind2sub 将线性索引转换为行、列下标。

      如果您需要在 matlab 中根据下标 + 值重新创建稀疏矩阵,请使用 spconvert

      【讨论】:

        【解决方案6】:

        dlmwrite - 将矩阵写入 ASCII 分隔文件 语法

        dlmwrite(文件名,M)

        dlmwrite(文件名, M, 'D')

        dlmwrite(文件名, M, 'D', R, C)

        dlmwrite(文件名, M, 'attrib1', value1, 'attrib2', value2, ...)

        dlmwrite(文件名, M, '-append')

        dlmwrite(filename, M, '-append', 属性值列表)

        【讨论】:

          【解决方案7】:

          如果这几乎是一次性交易,那么我只需遍历矩阵并通过蛮力将矩阵写入 ASCII 文件,或者使用 @Veynom's 建议并在子集上调用 full()行。这可能需要一段时间,但它可能会比学习如何在 MATLAB 环境之外读取 .mat 文件更快。

          如果这是您需要经常做的事情,那么我会采纳@Vebjorn 的建议并使用库来读取 .mat 文件。

          【讨论】:

            【解决方案8】:

            使用这个脚本: msm_to_mm.m,将 MATLAB 稀疏矩阵写入 MatrixMarket 文件。

            这个thread 也可能有用。

            【讨论】:

              猜你喜欢
              • 2012-09-05
              • 2014-08-25
              • 2019-07-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-09-07
              • 2013-11-16
              相关资源
              最近更新 更多