2016-08-08 122 views
2

我正在進行化學研究項目,我需要爲各種角度創建文件。我想要以下的每種組合:多個陣列元素的組合

angle1 can be from [0, -36, -72, -108, -144, -180] 
angle2 can be from [-180, -108, -36] 
angle3 can be from [0, -36, -72, -108, -144, -180] 
angle4 can be from [-180, -108, -36] 

我爲此寫了一些Ruby代碼,但它似乎只給了我預期組合的一半數量。我的編程技能不是很好,所以我想知道是否有人能告訴我我做錯了什麼。

非常感謝你的任何幫助,您可以提供:

phi1 = [0, -36, -72, -108, -144, -180] 
psi1 = [-180, -108, -36] 

phi2 = [0, -36, -72, -108, -144, -180] 
psi2 = [-180, -108, -36] 

psi1.each do |a| 
    psi2.each do |b| 
    phi1.each do |c| 
     psi2.each do |d| 

     line1 = 'select' + "#{b}" + '}}' 
     line2 = 'select' + "#{a}" + '}}' 
     line3 = 'select' + "#{d}" + '}}' 
     line4 = 'select' + "#{c}" + '}}' 

     filename = "angles#{b}_#{a}_#{d}_#{c}" 
     puts filename 
     puts line1 
     puts line2 
     puts line3 
     puts line4 
     end 
    end 
    end 
end 

預計產出將是「把文件名」其中,文件名是PHI1,PSI1,PHI2,PSI2的每個組合。我預計它會放324次,但它只做162次。

+0

不確定您的要求。你能添加你的預期輸出嗎? –

回答

3

您應該在這裏使用Array#product

phi1 = [0, -36, -72, -108, -144, -180] 
psi1 = [-180, -108, -36] 
phi2 = [0, -36, -72, -108, -144, -180] 
psi2 = [-180, -108, -36] 

phi1.product(psi1, phi2, psi2).each do |arr| 
    puts "angles#{ arr.join("_") }" 
    arr.each { |angle| puts "select #{angle}" } 
end 

angles0_-180_0_-180 
select 0 
select -180 
select 0 
select -180 
angles0_-180_0_-108 
select 0 
select -180 
select 0 
select -108 
... 
angles-180_-36_-180_-108 
select -180 
select -36 
select -180 
select -108 
angles-180_-36_-180_-36 
select -180 
select -36 
select -180 
select -36 

phi1.product(psi1, phi2, psi2).count 
    #=> 324 
0

我相信你想要這樣的東西。你的問題是,當你這樣做時,你重寫了同一個數組中的值。

phi1 = [0, -36, -72, -108, -144, -180] 
psi1 = [-180, -108, -36] 

phi2 = [0, -36, -72, -108, -144, -180] 
psi2 = [-180, -108, -36] 

如果更改了第二個應該解決問題的數組的名稱,我輸入了我想要的數據。

phi1 = [0, -36, -72, -108, -144, -180] 
psi3 = [-180, -108, -36] 

phi2 = [0, -36, -72, -108, -144, -180] 
psi4 = [-180, -108, -36] 

psi1.each do |a| 
    psi2.each do |b| 
    phi3.each do |c| 
     psi4.each do |d| 

     line1 = 'select' + "#{b}" + '}}' 
     line2 = 'select' + "#{a}" + '}}' 
     line3 = 'select' + "#{d}" + '}}' 
     line4 = 'select' + "#{c}" + '}}' 

     filename = "angles#{b}_#{a}_#{d}_#{c}" 
     puts filename 
     puts line1 
     puts line2 
     puts line3 
     puts line4 
    end 
    end 
    end 
end 
+0

我不確定我看到我宣佈他們兩次。我宣佈phi1和pSi1,然後phi2和PSi2。因爲一個是phi,另一個是psi,我不應該在那裏罰款嗎? :S –

+0

你是對的,對不起,它看起來超類似,我錯過了。我猜想什麼是預期的和實際的產出。它看起來應該沒問題 –

0

你爲什麼聲明phi1phi2兩次?我會做這樣的事情:

phi1 = [0, -36, -72, -108, -144, -180] 

phi2 = [-180, -108, -36] 

phi3 = [0, -36, -72, -108, -144, -180] # this one now ends in 3 

phi4 = [-180, -108, -36] # this one now ends in 4 

# I declared a new, unique array for every set of possible 
# angle values 

phi1.each do |a| 
    phi2.each do |b| 
    phi3.each do |c| 
     phi4.each do |d| #I also made it so the for loops are for each individual phi 
         #array. 

     line1 = 'select' + "#{b}" + '}}' 
     line2 = 'select' + "#{a}" + '}}' 
     line3 = 'select' + "#{d}" + '}}' 
     line4 = 'select' + "#{c}" + '}}' 

     filename = "angles#{b}_#{a}_#{d}_#{c}" 
     puts filename 
     puts line1 
     puts line2 
     puts line3 
     puts line4 
     end 
    end 
    end 
end 

我希望這有助於。

+0

我不確定我是否理解我如何宣佈他們兩次。我宣佈phi1和pSi1,然後phi2和PSi2。 –