在 Octave 中保存/加载大型矩阵

Posted

技术标签:

【中文标题】在 Octave 中保存/加载大型矩阵【英文标题】:Save/load a large matrix in Octave 【发布时间】:2015-12-14 11:45:42 【问题描述】:

我正在使用 Octave 中的大型点云数据(不同的文件,范围从 [10^5 到 10^7, 4] 个元素)并且我正在寻找优化代码的方法。

现在我正在尝试将数据保存到 .mat 文件中,因为我在某处(需要确认)从 .mat 文件加载比加载实际数据要快得多。每次都是txt文件。

save -ascii myfile data 可以满足需求,因为它只是我想要存储的数值,但是

load('myfile.mat') 产生一个包含所有值的 1x1 矩阵,而不是一个 nx4 矩阵,这很奇怪,因为当我使用 load('data.txt') 时,我得到一个完整的 nx4 矩阵。

问题似乎出在save 语法上。有什么办法可以保存文件,以便可以使用原始尺寸加载它?还是我必须以某种方式操纵生成的 1x1 变量?

额外问题: 浏览一些答案,我有点感觉使用转置矩阵而不是 nx4 会大大改善运行时间。真的吗?

【问题讨论】:

你用什么代码保存mat文件? 关于奖励问题:对于保存/加载 mat 文件,它是无关紧要的。对于你的代码,我们不知道。 @Daniel 感谢您对此感兴趣。我设法将其保存为 .mat 文件,但我注意到它至少比原始 .txt 文件大 2 倍。我使用的语法是:save("-ascii", myfile.mat, "data")。我认为我最好将数据保存在 .txt 文件中并使用load() 导入数据。 如果大小和速度很重要,请不要使用 -ascii。对于大小使用 -z (使用 gzip 压缩)。如果您可以坚持使用 Octave,请使用 Octaves 的二进制格式,这应该是最快的 【参考方案1】:

如果速度很重要,请使用二进制格式。下面来一点速度对比

a = rand (1e6, 4);
fn = tmpnam;

tic; save ("-ascii", fn, "a"); toc;
tic; load ("-ascii", fn); toc;
stat (fn).size

tic; save ("-v7", fn, "a"); toc;
tic; load ("-v7", fn); toc;
stat (fn).size

tic; save ("-v6", fn, "a"); toc;
tic; load ("-v6", fn); toc;
stat (fn).size

tic; save ("-binary", fn, "a"); toc;
tic; load ("-binary", fn); toc;
stat (fn).size

给了

Elapsed time is 2.82237 seconds.
Elapsed time is 6.28686 seconds.
ans =  61000000
Elapsed time is 1.54074 seconds.
Elapsed time is 0.252718 seconds.
ans =  30192558
Elapsed time is 0.030833 seconds.
Elapsed time is 0.047183 seconds.
ans =  32000184
Elapsed time is 0.116342 seconds.
Elapsed time is 0.0523431 seconds.
ans =  32000045

如你所见,-v6 比 -ascii 快得多

编辑:还要记住“-ascii”只使用单精度浮点数

【讨论】:

太棒了。非常感谢

以上是关于在 Octave 中保存/加载大型矩阵的主要内容,如果未能解决你的问题,请参考以下文章

将大型 csv 转换为稀疏矩阵以在 sklearn 中使用

如何在 Spark 中检查或保存大型矩阵到文件

从 GNU Octave 中的矩阵中删除一列

Octave中的矩阵操作

用犰狳加载大型矩阵

将使用-v7.3(HDF5)保存的Matlab稀疏矩阵加载到Python中并对其进行操作