使用csvread / dlmread和csvwrite / dlmwrite时如何保持精度与原始数据相同?

时间:2015-07-27 19:15:13

标签: matlab

我正在使用Matlab进行一些数据分析并使用txt文件。我有一些保存在文本文件中的矩阵数据,例如:

1.0,1.1,1.2,1.3

1.4,1.5,1.6,1.7

1.8,1.9,2.0,2.1

3.3,3.0,4.0,5.0

我正在使用csvread / dlmread将数据作为矩阵读入Matlab。然后我使用csvwrite / dlmwrite将数据写入单独的txt文件作为逗号分隔值。

问题是当我将矩阵写入另一个文件时,如果值的最后一位为零,则会被消除。我在新文件中获得了以下数据,而不是原始矩阵。

1,1.1,1.2,1.3

1.4,1.5,1.6,1.7

1.8,1.9,2,2.1

3.3,3,4,5

我有点失去精确度。有没有办法告诉Matlab保留与原始数据完全相同的数据?

1 个答案:

答案 0 :(得分:2)

这很简单。 dlmwrite有一个'precision'标志,可用于指定输出文件所需的精度位数。如果我们假设您的数据只包含一位数的精度,那么您可以执行以下操作,假设您的矩阵存储在M中,并且您的值与我们在您的示例数据中看到的完全相同,并且您想要写入名为output.txt的文件:

dlmwrite('output.txt', M, 'precision', '%.1f');

这将使用一位精度打印出每个数字。格式说明符%.1f表示将数字的浮点表示打印为单个精度数字。如果省略.1而只是%f,则默认值为5位精度。

作为一个可重现的示例,我已将您的数据放入名为testdata.txt的文件中,然后像我之前使用dlmwrite重新保存它:

>> in = dlmread('testdata.txt');
>> in
in =

    1.0000    1.1000    1.2000    1.3000
    1.4000    1.5000    1.6000    1.7000
    1.8000    1.9000    2.0000    2.1000
    3.3000    3.0000    4.0000    5.0000
>> dlmwrite('output.txt', in, 'precision', '%.1f');

...这就是我在文件中输出的内容:

1.0,1.1,1.2,1.3
1.4,1.5,1.6,1.7
1.8,1.9,2.0,2.1
3.3,3.0,4.0,5.0

FWIW,你并没有“失去任何精确度”。 33.0几乎是相同的数字......你更关心的是格式偏好,而不是精确。如果你重新读取那个将整数的小数位截断回MATLAB的输出文件,你会看到它仍在解释那些将尾随零截断为有效浮点数的数字......即3 --> 3.0