2014-04-16 32 views
1

在MATLAB如果我有一个字符串,如:串数字,withouth的空间

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

如果我使用

b=str2num(a); 

我得到

b =324.7575 470.2208; 

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

是否有可能将a转换为3列向量而不使用textscan

这看起来很容易,在str2num文档中我没有找到进一步的信息,所以这就是我要问的原因,

回答

3

正确指定的格式,它会没有空间权甚至可以理解:

>> sscanf(a,'%E') 
ans = 
    424.8706 
-100.1130 
    470.2208 
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

+0

我知道,如果我添加一个空间,我会得到3列向量。问题是我从外部文件中获取数据......包含大量混合数据 – user2751649

+0

每条线上总是有3个值吗? –

2

你需要每个减号之前引入一个空格,除非减号是指数(感谢拉斐尔·蒙泰罗为指出这一点)。这样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 
+1

您也可以使用'asep = strrep(a,' - ',' - ')'。 :) –

+0

@RafaelMonteiro嘿,什么是waaaay更容易!添加到你的答案,这是你的想法:-) –

+0

因此,他可以改变他的代码为'b = str2num(strrep(a,' - ',' - '));' –