2013-06-26 93 views
1

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

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

有人可以建议的方式与我的问题来解决?

+3

请记住,如果需要,您可以将您的4-D阵列“重塑”为2D并返回... – bla

回答

1

我一直以为save将alrea存储完全相同的号码,你dy有已经用于将它们存储在matlab中的精度 - 你不会失去任何东西。唯一的问题可能是磁盘空间消耗(太精确的数字?)和.mat文件的封闭格式(不能被外部程序读取)。如果我想存储数据并稍后用matlab读取它们,我肯定会用savesave也可以打印ascii数据,但是(如dlmwrite)限于二维数组,所以使用dlmwrite会比较适合您的情况。

另一种解决方案:

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

读书会有点难度,但只有一点点;)

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

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

+0

不错!然而'M(:)'可能比'reshape(M,[],1)'更整齐。 – pm89

+1

@ pm89我同意'M(:)'很整洁,但你必须记住新阵列的形状。像这样'tmpM = [size(M),0,M(:)'];'或这个'tmpM = [size(M); 0; M(:)];'。 – anandr

+0

我不确定它背后的实际实现是什么,但是M(:)和'reshape(M,[],1)'完全一样。我更喜欢后者,因为迷信实施'reshape'可能不需要在整形时复制整个数组。如果我有一个时刻,有一天我会研究这种差异。 –

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建议看起来够简单。