在 Matlab 中将 4D 矩阵保存到具有高精度 (%1.40f) 的文件中

Posted

技术标签:

【中文标题】在 Matlab 中将 4D 矩阵保存到具有高精度 (%1.40f) 的文件中【英文标题】:Save 4D matrix to a file with high precision (%1.40f) in Matlab 【发布时间】:2013-06-26 03:27:33 【问题描述】:

我需要在 MATLAB 中将 4D 矩阵 (M-(16x,101x,101x,6x) 写入具有高精度 ('precision'-'%1.40f') 的文件。

我发现save('filename.mat', 'M' ); 用于多维矩阵,但无法设置精度(仅限-double)。另一方面,我发现dlmwrite('filename.txt', M, 'delimiter', '\t', 'precision', '%1.40f'); 可以设置精度,但仅限于二维数组。

有人可以提出解决我问题的方法吗?

【问题讨论】:

请记住,您可以 reshape 将您的 4-D 阵列转换为 2D 并在需要时返回 ... 【参考方案1】:

如果 MATLAB 中的双精度数只保留 16 个小数部分,那么存储 40 个小数部分有什么意义? 试试这个代码:

t=pi
whos
fprintf('%1.40f\n',t)

输出是

Name      Size            Bytes  Class     Attributes
t         1x1                 8  double              

3.1415926535897931000000000000000000000000

save('filename.mat', 'M' ); 命令将以二进制表示形式存储数字(每个双精度数字 8 个字节)。与纯文本表示相比,这在节省空间方面是无与伦比的。

至于 j_kubik 建议的 4D 形状似乎很简单。

【讨论】:

【参考方案2】:

我一直认为save 将存储与您已经拥有的数字完全相同的数字,其精度已经用于在 matlab 中存储它们 - 您不会丢失任何东西。唯一的问题可能是磁盘空间消耗(数字太精确?)和 .mat 文件的封闭格式(外部程序无法读取)。如果我只想存储数据并稍后用 matlab 读取它们,我肯定会选择savesave 也可以打印 ascii 数据,但它(如 dlmwrite)仅限于 2D 数组,因此在您的情况下使用 dlmwrite 会更好。

另一种解决方案:

tmpM = [size(M), 0, reshape(M, [], 1)];
dlmwrite('filename.txt', tmpM, 'delimiter', '\t', 'precision', '%1.40f');

阅读会有点困难,但只是一点点;)

然后您可以编写自己的函数来使用fopenfprintf 将内容写入文件(就像dlmwrite 所做的那样)-在那里您可以控制文件格式的各个方面(包括精度)。

如果我真的关心精度、文件大小和执行时间(这可能不适合你),我会做的事情是编写一个 mex 函数,它接受一个矩阵参数并将其存储在一个二进制文件中只需从 matlab 复制原始数据缓冲区。它还需要一些数组维度的指示,并且可能是最快的(不确定save 是否还没有做类似的事情)。

【讨论】:

不错!但是M(:) 可能比reshape(M, [], 1) 更整洁。 @pm89 我同意M(:) 更整洁,但您必须牢记新阵列的形状。喜欢这个tmpM = [size(M), 0, M(:)']; 或这个tmpM = [size(M); 0; M(:)]; 我不确定它背后的实际实现是什么,但 M(:)reshape(M, [], 1) 完全相同。我更喜欢后者,因为迷信reshape 的实现可能不需要在重塑时复制整个数组。如果我有时间,有一天我会调查其中的差异。

以上是关于在 Matlab 中将 4D 矩阵保存到具有高精度 (%1.40f) 的文件中的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中将 4D 数组与 2D 数组相乘和求和的最快方法?

如何在 MATLAB 中将 .mat 文件内容保存在内存中?

操作存储在元胞数组中的矩阵——Matlab

Matlab:分配给具有列\行索引对的矩阵[重复]

matlab中如何将多个矩阵保存到同一个矩阵中?

在 C++ 中将 matlab 矩阵转换为数组的有效方法