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,因此我需要儘可能高效的工作。
我在做什麼錯?
至少在Windows 7上運行MATLAB 2013A我的電腦上,你的代碼不完全一樣的東西爲我的。它吃掉第一空間並移動在整個線,使H 2 O(分子ID「1」),例如,顯示爲氨(分子ID「11」)。 – craigim
查看我的更新,下面是Mathworks建議的解決方法。 – craigim