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

How to keep the precision as the same of the original data when using csvread/dlmread and csvwrite/dlmwrite?

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

1
2
3
4
5
6
7
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
2
3
4
5
6
7
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与原始数据完全相同?


那很容易。 dlmwrite具有'precision'标志,可用于指定输出文件所需的精度位数。如果我们假设您的数据仅由一位精度组成,则可以执行以下操作,假设您的矩阵存储在M中,并且您的值与我们在示例数据中看到的值完全相同,并且您想要编写到名为output.txt的文件:

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

这将以一位精度输出每个数字。格式说明符%.1f表示将数字的浮点表示形式打印到一位数的精度。如果省略.1而仅执行%f,则默认值为5位精度。

作为可重现的示例,我将您的数据放入了一个名为testdata.txt的文件中,然后像以前一样使用dlmwrite对其进行了保存:

1
2
3
4
5
6
7
8
9
>> 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
2
3
4
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