2014-04-16 36 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,' - ',' - '));' –