【问题标题】:The quickest way possible to save Matlab matrices保存 Matlab 矩阵的最快方法
【发布时间】:2013-02-08 01:26:17
【问题描述】:

我正在使用 Matlab 在 C++ 中调用一些外部调用,然后返回一个巨大的计算矩阵。矩阵非常大,我无法访问这个 C++ 程序的源代码。 (如果我有,我会立即从 C++ 中保存)

现在,在我的系统上,这个 C++ 程序只用了 1 秒来计算给定的数据并发送回 Matlab,而 Matlab 的 dlmwrite 需要 200-300 秒才能将这个巨大的数组保存在磁盘上。我还有数千个要计算,我想缩短时间。

那么在 Matlab 中最快的保存方法是什么?

【问题讨论】:

  • 你想对保存的数据做什么?在 Excel 中阅读它们?只在 MATLAB 中使用它们?
  • 处理后的数据将被其他几个程序进一步使用。
  • 这不是很有帮助。你能让其他程序接受什么输入格式?
  • 其他程序现在接受字符串作为输入。

标签: performance file matlab save


【解决方案1】:

最快的方法可能是 Matlab 的save 命令。或者,您可以 fwrite 将整个矩阵转换为二进制文件。

使用dlmwrite 将值转换为文本,这需要时间并且需要将更多数据写入磁盘。除非您确实需要该格式的数据,否则不要这样做。请注意,dlmwrite 如果使用大矩阵调用一次,而不是在增量写入文件的循环中调用,将会更快。

【讨论】:

  • 我已经测试了a = zeros(10000); dlmwrite(...) takes 89.5 sec while save(...) takes 2.68 sec 现在,这令人印象深刻。
  • 但不幸的是,如果我要使用保存功能中的 mat 文件,我将不得不深入阅读 mat 文件。
  • @Karl 阅读 .mat 文件可能很复杂,具体取决于您的数据。 fwrite 可能和 save 一样快,但是你必须决定自己的自定义二进制格式并能够读写。
  • 我看到 save 有一个缺点:它不能用于 parfor。不过,如果不需要 parfor,save 是最快的。
  • 另一方面,如果你想在 parfor 循环中“写入”数据,你可以去 mex 文件并在 parfor 循环中调用 mex 函数。在这里查看更多信息:mathworks.nl/matlabcentral/newsreader/view_thread/243930
【解决方案2】:

如果您想要仅使用 Matlab 的解决方案,我可能会将 fwrite 用于二进制或 fprintf 用于 ASCII。但是,我喜欢在 IO 方面混合使用 Matlab 和 Java,因为这通常更快。我会做类似的事情

Java Code
package mypackage.release;

import java.io.DataOutputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException


public class MatrixWriter {
  public static void write(String fileName, double[] matrix) throws IOException {
    DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fileName)));
    for (double d : matrix)
      dos.writeDouble(d);
    dos.close();
  }
}

Matlab Code
import mypackage.release.MatrixWriter;
M = get matrix from c++;
MatrixWriter.write('myfile.dat', M(:));

这是我的想法,但我一直在使用它的变体。希望对您有所帮助。

【讨论】:

  • 能否请您至少显示一些代码 VS dlmwrite 的结果?
  • 当然。 m=零(1000);抽动; dlmwrite('temp.dat', m);目录;经过时间为 2.296942 秒 tic; MatrixWriter.write('temp.dat', m(:)); toc 经过的时间是 0.252032 秒
  • 仅供参考,只是将其与 fwrite 进行了比较,在这种情况下它更快。除非你正在做一些更复杂的事情,这可能是最好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多