2013-08-23 28 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

相关问题