1

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

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

有人可以建议一种方法来解决我的问题吗?

4

2 回答 2

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建议的方式似乎很简单。

于 2013-06-26T04:51:08.680 回答
1

我一直认为这save将存储与您已经拥有的数字完全相同的数字,其精度已经用于将它们存储在 matlab 中 - 您不会丢失任何东西。唯一的问题可能是磁盘空间消耗(数字太精确?)和 .mat 文件的封闭格式(外部程序无法读取)。如果我只想存储数据并稍后使用 matlab 读取它们,我肯定会使用save. save也可以打印 ascii 数据,但它(as 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还没有做类似的事情)。

于 2013-06-26T04:25:51.860 回答