在Matlab中,可以使用str2double
或str2num
和cellfun
的组合将单元格数组中数字的字符串表示转换为双数组中的数字表示。 recent post建议使用str2mat
和sscanf
的组合来实现更快的转化。但是,对于某些数据集,这种方法似乎失败了,例如:
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
方法。
答案 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']);