2013-08-23 57 views
2

我是一名物理學生。我必須在數據 列表進行簡單的放鬆循環,我做到了蒙山一個簡單的while循環看起來像這樣Mathematica:在同一個列表的多個元素的計算上使用嵌套

i = 1; 
While[i < Limit, 
data[[i]] = f[ data[[i]] , data[[i+1]], data[[i-1]] ]; 
i = i+2; 

i = 2; 
While[i < Limit, 
data[[i]] = f[ data[[i]] , data[[i+1]], data[[i-1]] ]; 
i = i+2; 

,你可以看到,我的列表中的奇地方先進行操作然後在甚至一些。問題是,我必須爲解決方案進行一萬次這樣的聚合,而這需要花費太多時間。所以我想知道這是否可以用更快的方式完成,也許使用嵌套,但是我怎樣才能在計算中使用數據[[i + 1]]和數據[[i-1]]?

也許這是一個微不足道的問題,所以我提前道歉,

謝謝

回答

0

首先,你應該注意的是放鬆的方法是由它的本質上是緩慢的。所以不要指望用它獲得超快速的結果。還有其他(非常快)的方法來解決現實生活中的問題。

無論如何,我有幾個建議,可能會踢你的表現由幾個因素。

第一:我認爲功能f應該足夠簡單,以編譯它;這樣做!我認爲像

f=Compile[{{a,_Real},{b,_Real},{c,Real}},"Write f[a,b,c] explicitly",CompilationTarget->"C"] 

應該工作。

第二個:嘗試使用FixedPoint。爲了做到這一點,我可能會做這樣的事情(或者也可以是稍微好一點:-):

g[data,_List]:=Block[{i = 1}, 
    While[i < Length[data], 
    data[[i]] = f[ data[[i]] , data[[i+1]], data[[i-1]] ]; 
    i = i+2; 
    ] 
    i = 2; 
    While[i < Length[data], 
    data[[i]] = f[ data[[i]] , data[[i+1]], data[[i-1]] ]; 
    i = i+2; 
    data]; 
FixedPoint[g,"initialdata",SameTest->((#1-#2).(#1-#2)<10^(-4)&)] 

而且,你必須採取的邊界條件,自己照顧。

0

這個操作可能很容易用Mathematica的列表導向函數完成,但由於代碼不完整(語法錯誤和缺失數據),我不能完全告訴你想要什麼。

您應該看看這些功能:Partition,MovingAverage,ListCorrelate,FoldList

這裏有幾種可能的解釋。ListCorrelate:

data = CharacterRange["a", "i"]; 

ListCorrelate[{1, 1, 1}, data, {1, -1}, {}, Times, f] 
{f[a,b,c],f[b,c,d],f[c,d,e],f[d,e,f],f[e,f,g],f[f,g,h],f[g,h,i]} 

分區和裏弗爾:

Riffle[Take[data, {1, -1, 2}], f @@@ Partition[data, 3, 2]] 
{a,f[a,b,c],c,f[c,d,e],e,f[e,f,g],g,f[g,h,i],i} 

您可能會得到更好的答案我如果你遵循SSCCE的原則,並在這裏問你的問題:

enter image description here

相關問題