sscanf读取数据不准确

时间:2014-02-17 19:34:08

标签: matlab

在Matlab中,可以使用str2doublestr2numcellfun的组合将单元格数组中数字的字符串表示转换为双数组中的数字表示。 recent post建议使用str2matsscanf的组合来实现更快的转化。但是,对于某些数据集,这种方法似乎失败了,例如:

x={'98.78743';'99.39717';'99.93578';'100.40125';'100.79166';'101.10525';'101.34037';'101.49553';'101.56939';'101.56072';'101.4685';'101.29184';'101.03002';'100.68249';'100.24887';'99.72897';'99.12274';'98.43036';'97.65215';'96.78864';'95.84054'};
y=sscanf(str2mat(x).','%f');
[str2double(x),y,str2double(x)-y]
ans =

    98.7874   98.7874         0
    99.3972   99.3972         0
    99.9358   99.9358         0
   100.4013  100.4013   -0.0000
   100.7917    0.7917  100.0000
   101.1052    0.1053  101.0000
   101.3404    0.3404  101.0000
   101.4955    0.4955  101.0000
   101.5694    0.5694  101.0000
   101.5607    0.5607  101.0000
   101.4685    0.4685  101.0000
   101.2918  101.2918   -0.0000
   101.0300    0.0300  101.0000
   100.6825    0.6825  100.0000
   100.2489    0.2489  100.0000
    99.7290    0.7290   99.0000
    99.1227   99.1227         0
    98.4304   98.4304         0
    97.6522   97.6522         0
    96.7886   96.7886         0
    95.8405   95.8405         0

上面代码块中的最后一行显示了原始单元格数组的双重表示形式,sscanf转换形式以及两者之间的差异。为了忠实转换,第三列中的所有条目都精确为0.许多值都是通过不正确地消除最高有效数字来转换的。这种错误行为的基础是什么?是否可以稍微修改语句以产生准确的转换?通常,我试图转换的数字具有不同的长度(小数点前后),因此任何依赖于具有相同长度的单元阵列中的所有数字的方法都将失败。最后,我的MATLAB版本是2013年之前的版本,因此我不能依赖上述帖子中提出的strjoin方法。

1 个答案:

答案 0 :(得分:1)

请改为尝试:

y=sscanf(str2mat(x).','%9f')

9实际上与str2mat(x).'

中的最大数字长度相对应
>> str2mat(x).'

ans =

999111111111111999999
899000000000000998765
...001111111100......
739............714678
893471345542062223584
775090496669384820280
417115059081028973165
378262353758048746544
   5657392 4297      

因此,sscanf将搜索9个浮点数并在找到空格时停止。您可以根据数据定义9个值。

一个例子:

x={'98.7';'99.397';'99.93578';'100.4';'100.79166';'101.10'};
>> str2mat(x).'

ans =

999111
899000
...001
739...
 93471
 75 90
  7 1 
  8 6 
    6 

这里最大长度仍为9.答案仍然正确。

y=sscanf(str2mat(x).','%9f')

>> y =

   98.7000
   99.3970
   99.9358
  100.4000
  100.7917
  101.1000

要确定%'number'f的随机长度,请使用:

size(str2mat(x).',1)

另一招:

xMaxLength = num2str(size(str2mat(x).',1));
y = sscanf(str2mat(x).',['%' xMaxLength 'f']);

为了一次只计算str2mat

xx = str2mat(x).';
xxMaxLength = num2str(size(xx,1));
y = sscanf(xx,['%' xxMaxLength 'f']);