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

时间:2013-06-26 03:27:33

标签: matlab save precision

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

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

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

2 个答案:

答案 0 :(得分:3)

如果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个字节)。与普通文本表示相比,这在节省空间方面是无与伦比的。

对于4D形状, j_kubik 建议的方式似乎很简单。

答案 1 :(得分:1)

我一直认为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');
阅读会有点困难,但只有一点;)

然后您可以编写自己的函数,使用fopen& fprintf(就像dlmwrite一样) - 您可以控制文件格式的各个方面(包括精度)。

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