2014-10-06 36 views
0

我試圖用0-46氫,0-20碳,0-13氧等方法對所有可能的分子進行索引。我有7個我感興趣的原子:H ,C,O,N,氯,氟和S.我寫了下面的for循環來展示我想實現:Matlab:通過置換構建分子庫

MassListIndex = [] 
%MassIndex = [h,c,o,n,cl,f,s] 
for h = 0:46; 
    for c = 0:20; 
    for o = 0:13; 
     for n = 0:15; 
      for cl=0:5; 
       for f=0:5; 
        for s=0:5; 
         MassListIndex = [MassListIndex;[h,c,o,n,cl,f,s]]; 
        end; 
       end; 
      end; 
     end; 
    end; 
end; 
end; 

這令我非常低效;我不想等待2個月左右的時間。我已經嘗試過使用combinator.m腳本,但問題是隻有一個輸入集合的長度是'置換',即如果我想擁有多達46個氫,我還需要每個都有46個其他6個原子。這在計算上很重(46^7 = = 436億)。

有什麼辦法可以使這種計算更有效嗎?或者,我需要更多地考慮騎它的「廢話排列」縮水我的名單(據我所知,分子H40C2從未被觀察到的!)

感謝

+0

你在找經驗公式嗎?因爲結構公式會變得更復雜 – 2014-10-06 21:53:25

+0

如果你有足夠的RAM,定義'vectors = {0:46 0:20 0:13 0:15 0:20 0:20 0:13 0:15};'並應用[this] (http://stackoverflow.com/q/21895335/2586922)。或者爲了節省RAM,可以嘗試使用uint8數據類型:uint8 :5)uint8(0:5)}'。後者在我的計算機上只需要5秒鐘,併產生所需的47755008x7結果 – 2014-10-06 22:02:05

+0

只有經驗公式對於質量很重要,所以如果你把你的47755008x7矩陣和'bsxfun'與來自[IUPAC]的原子質量值(http: //www.degruyter.com/view/j/pac.2013.85.issue-5/pac-rep-13-03-02/pac-rep-13-03-02.xml),你有自己的答案。 「無意義排列」的算法[作爲OP的練習](http://www.xkcd.com/1425/)。 – craigim 2014-10-06 23:21:03

回答

0

第一個問題是不是硬。至少不是如果你記得預先分配的話! 我改變了你的代碼到這一點:

mxidx = 47*21*14*16*6*6*6; 
MassListIndex = zeros(mxidx,7); 
idx = 1; 
for h = 0:46; 
    for c = 0:20; 
     for o = 0:13; 
      for n = 0:15; 
       for cl=0:5; 
        for f=0:5; 
         for s=0:5; 
          MassListIndex(idx,:) = [h,c,o,n,cl,f,s]; 
          idx = idx + 1; 
         end; 
        end; 
       end; 
      end; 
     end; 
    end; 
end; 

它在我的電腦上不到一分鐘就跑。 通常,如果您忘記預分配,Matlab會發出警告;並且無論何時(如本例中)預先知道矩陣的大小,您應該預先分配!另一方面,另一方面,47^7 = 506623120463(超過500億元 - 它是47^7而不是46^7,因爲列表0:46有47個元素)。所以即使你只使用一個字節公關。排在你矩陣(你當然不會),它仍然會佔用更多的半TB!而且計算時間同樣會很龐大!

但真的什麼時候你會需要這個列表。你已經構建了您的列表的方式,你可以很容易地僅僅通過索引例如:計算一個條目

function m = MassListIndex(a,b) 
a = a - 1; 
lst = zeros(1,7); 
for i = 1:7 
    lst(8-i) = mod(a,47); 
    a = floor(a /47); 
end 
if nargin < 2 
    m = lst; 
else 
    m = lst(b); 
end 
end 

編輯:

如果你希望它也計算質量,你可以這樣做:

function mass = getMassFromPermutationNumber(a) 
a = a - 1; 
lst = zeros(1,7); 
for i = 1:7 
    lst(8-i) = mod(a,47); 
    a = floor(a /47); 
end 
mass = lst*[1.00794;12.011;15.9994;20.1797;35.4527;18.9984;32.066]; 
end 

來源爲羣衆:http://environmentalchemistry.com/yogi/periodic/mass.html

免責聲明:我不是很擅長化學,所以請申請合理數量的懷疑!

+0

謝謝你的迴應!列表的原因是然後計算每個排列的質量。該質量列表與HD質譜數據進行比較,因此我們可以確定檢測到的化合物的分子式。那有意義嗎? – PootersTheCat 2014-10-07 22:43:43

+0

我已經爲我的答案添加了一個編輯,解釋瞭如何在不列出列表的情況下從排列數中獲得質量。如果你堅持列出清單,那麼就沒有辦法花費大量的內存,而且我也沒有辦法顯着加快這個過程(可能有一個 - 我只是看不到它)。 – 2014-10-08 08:53:23