字符串为数字,没有空格

时间:2014-04-16 16:53:16

标签: string matlab double string-parsing

在MATLAB中,如果我有一个字符串:

 a='0.424870551E+03-0.100113019E+03 0.470220758E+03';

如果我使用

 b=str2num(a);

我得到了

 b =324.7575  470.2208;

也就是说,MATLAB对前两个数字执行了操作,而不是给出一个3列向量。

是否有可能在不使用textscan的情况下将a转换为3列矢量?

这可能看起来很简单;我在str2num文档中没有找到任何进一步的信息,这就是我要问的原因,

3 个答案:

答案 0 :(得分:3)

正确指定格式,即使没有空格也会正确解释:

>> sscanf(a,'%E')
ans =
  424.8706
 -100.1130
  470.2208

答案 1 :(得分:2)

你需要在每个减号之前引入一个空格,除非减号在指数中(感谢Rafael Monteiro注意到这一点)。这样Matlab知道它们是不同的数字:

a = '0.424870551E+03-0.100113019E+03 0.470220758E+03';
ind = a=='-'; %// detect positions of "-" ...
ind2 = [0 a(1:end-1)=='E'];
ind = ind & ~ind2; %// ... but not in exponents. Thanks to Rafael Monteiro
asep = repmat(' ',1,numel(a)+nnz(ind)); %// initiallize with spaces
asep((1:numel(a))+cumsum(ind)) = a; %// fill in a. Leave a blank before each "-"
b = str2num(asep);

这给出了:

a =
0.424870551E+03-0.100113019E+03 0.470220758E+03

asep =
0.424870551E+03 -0.100113019E+03 0.470220758E+03

b =
  424.8706 -100.1130  470.2208

答案 2 :(得分:1)

问题是第一个和第二个数字之间没有空格。然后,函数认为你想减去它们。

有四种方法可以做到。

对于前三个,这就是你得到的:

str2num('0.424870551E+03-0.100113019E+03 0.470220758E+03')
str2num('0.424870551E+03 - 0.100113019E+03 0.470220758E+03')
str2num('0.424870551E+03- 0.100113019E+03 0.470220758E+03')

ans =

324.7575 470.2208

但是这样做会让你分别想要这三个数字:

str2num('0.424870551E+03 -0.100113019E+03 0.470220758E+03')

ans =

424.8706 -100.1130 470.2208