我需要在MATLAB中将4D矩阵(M-(16x,101x,101x,6x)写入高精度文件('precision' - '%1.40f')。
我发现save('filename.mat', 'M' );
用于多维矩阵但不能设置精度(仅-double)。另一方面,我发现dlmwrite('filename.txt', M, 'delimiter', '\t', 'precision', '%1.40f');
设置精度但仅限于二维数组。
有人可以提出解决问题的方法吗?
答案 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读取它们,我肯定会使用save
。
save
也可以打印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
是否还没有做类似的事情。)