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,您不会"失去任何精度"。 3和3.0几乎是相同的数字……您更关心的是格式首选项,而不是精度。如果您重新读取将整数的小数位截断的输出文件到MATLAB中,将会看到它仍将那些将尾随的零截断的数字解释为有效的浮点数...即3 --> 3.0。
-
原始数据的数字可能不一致,是否有办法使数字与原始数据集完全相同?
-
@bill-有什么原因吗? 但是,如果您真的想...是的。 病态编辑我的帖子。
-
因此,我所做的不是获取整个数据集而是其中的一部分。 这样,我仅提取有用的信息,但我确实希望保持格式和精度相同。 整个数据集只是该过程的一个示例。 抱歉造成的混乱和感谢。
-
@bill-我真的不明白为什么要这么做...人为地为整数输入.0。 如果要这样做,则必须分别编写每个值,这比较复杂。 我要把这个留给别人回答。