Mathematica:在计算同一列表的多个元素时使用nest

时间:2013-08-23 11:06:25

标签: wolfram-mathematica nest

我是一名物理系学生。我必须对数据列表执行简单的放松循环 我做了一个简单的while循环看起来像这样

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]]?

也许这是一个微不足道的问题所以我提前道歉,

谢谢

2 个答案:

答案 0 :(得分: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)&)]

另外,你必须自己处理边界条件。

答案 1 :(得分:0)

使用 Mathematica的面向列表的函数可以很容易地完成此操作,但由于代码不完整(语法错误和缺少数据),我无法完全告诉您需要什么。

您应该查看以下功能:PartitionMovingAverageListCorrelateFoldList

以下是一些可能的解释。 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]}

Partition and Riffle:

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