2013-10-16 91 views
0

HITRAN數據庫是分子旋轉振動轉換的列表。它在一個文本文件中給出,其中每行是160個字符,固定寬度的字段定義分子,同位素等。格式是有據可查的,甚至有一個程序MathWorks File Exchange將讀取數據庫和模擬一部分的頻譜。但是,我需要閱讀光譜的特定部分,然後用它來擬合測量的光譜,所以我需要更多的定製。如何將HITRAN2012數據庫讀入MATLAB?

如該功能的註釋部分給出,以及別處,下面的行應爲在正確的每一行:

database = which('HITRAN2012.par'); 
fid = fopen(database); 
hitran = textscan(fid,'%2u%1u%12f%10f%10f%5f%5f%10f%4f%8f%15c%15c%15c%15c%6c%12c%1c%7f%7f','delimiter','','whitespace',''); 
fclose(fid); 

前兩個字段表示分子的代碼,它由1-運行47,以及從1-9開始的同位素代碼。

不幸的是,分子1-9沒有前導零,無論我做什麼,它似乎默默混淆了MATLAB。如果我在整個數據庫加載,然後鍵入

unique(hitran{1}) 

我沒有得到的數字1-47,但我得到10-92用幾號失蹤。據我所知,當MATLAB遇到一個領先的空間時,它會將線路移動到另一端,從而使'12'變成'12',但我並不確定。我也曾嘗試

hitran = textscan(fid,'%160c','delimiter','\n','whitespace',''); 

,然後試圖解析生成的字符串,但也有時候會通過第一空間混淆。

例如,第一水位線看起來像

exampleHitranLine = ' 14 0.007002 1.165E-32 2.071E-14.05870.305 818.00670.590.000000   0 0 0   0 0 0 7 5 2  7 5 3  005540 02227 5 2 0 90.0 90.0'; 

代碼的第一位遇到此行,並返回'14'代替' 1''4'。如果我只讀了一個只包含分子1的子集(如本例中),那麼閱讀的第二種方法就可以正常工作。然而,如果我試圖讀取整個數據庫,那麼分子1-9的分子線會向左移動,這會弄亂所有其他分子。

我應該注意到,我已經嘗試讀取數字字段作爲浮點數和整數,但都沒有給出令人滿意的結果。文本形式的整個數據庫將近700 MB,因此我需要儘可能高效的工作。

我在做什麼錯?

回答

0

我沒有答案,爲什麼發生這種情況,但我確實有解決方案。如果任何人有答案,爲什麼,我很樂意接受它。

這是最重要的空間。 MATLAB有點太聰明瞭,當textscan遇到一個領先的空間時,它決定它是多餘的並丟棄它並移動到接下來的兩個字符。要讓它正常讀取文件中的,我不得不走行線和測試的第一個字符是一個空格,然後帶前導零取代它,像這樣:

database = which('HITRAN2012_First100Lines.par'); 

fileParams = dir(database); 
K = fileParams.bytes/162; 
hitran = cell(K,19); 

fid = fopen(database); 
for k = 1:K 
hitranTemp = fgetl(fid); 
if abs(hitranTemp(1)) == 32; 
    hitranTemp(1) = '0'; 
end 
    hitran(k,:) = deal(textscan(hitranTemp,'%2u%1u%12f%10f%10f%5f%5f%10f%4f%8f%15c%15c%15c%15c%6c%12c%1c%7f%7f','delimiter','','whitespace','')); 
end 
fclose(fid); 

我在工作MATLAB 2013a。我應該認爲這是一個錯誤並報告它嗎?領導空間應該像這樣被吞噬有什麼理由嗎?

更新:

我的解決方法上面很慢,但工作。然後,我不得不處理HITEMP數據庫,這是大幾倍,所以我終於做到提交支持票MathWorks公司。 MathWorks技術支持建議的解決方法是以文本形式讀取所有內容,然後進行轉換。這節省了大量的磁盤讀取和工作。

fileParams = dir(database); 

fid = fopen(database); 

hitran = textscan(fid,'%2c%1c%12c%10c%10c%5c%5c%10c%4c%8c%15c%15c%15c%15c%6c%12c%1c%7c%7c','delimiter','','whitespace',''); 

fclose(fid); 

moleculeNumber = uint8(str2num(hitran{1})); 
isotopologueNumber = uint8(str2num(hitran{2}); 
vacuumWavenumber = str2num(hitran{3}); 
... 
etc. 

根據不同的應用,大型數據庫人們可能想這樣做in chunks,而不是一下子。

他還表示,他將行爲轉發給開發團隊考慮在以後的更新。

0

have a new file on the FileExchange that will read in HITRAN 2004+ format data。請嘗試一下,讓我知道是否有任何問題。

+0

至少在Windows 7上運行MATLAB 2013A我的電腦上,你的代碼不完全一樣的東西爲我的。它吃掉第一空間並移動在整個線,使H 2 O(分子ID「1」),例如,顯示爲氨(分子ID「11」)。 – craigim

+0

查看我的更新,下面是Mathworks建議的解決方法。 – craigim