Wolfram mathematica Mathematica:在计算同一列表的多个元素时使用嵌套

Wolfram mathematica Mathematica:在计算同一列表的多个元素时使用嵌套,wolfram-mathematica,nest,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; 虽然

我是一名物理系的学生。我必须在数据列表上执行一个简单的松弛循环 我做了一个简单的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;
虽然[我
如您所见,我先在列表的奇数位置执行此操作,然后在偶数位置执行此操作。问题是,我必须执行此操作一万次才能使解决方案收敛,这需要花费太多时间。因此我想知道是否可以使用nest更快地完成此操作,但如何使用数据[[i+1]]和数据[[i-1]]在计算中

也许这是个小问题所以我提前道歉


谢谢你

首先,你应该注意到松弛法本质上是缓慢的。所以不要指望用它能得到超快的结果。对于现实生活中的问题,还有其他(非常快的)方法

无论如何,我有几个建议,可能会因为几个因素而影响你的表现

首先:我认为函数
f
应该足够简单,可以编译它;所以就这么做吧!我认为

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

Second:尝试使用
FixedPoint

g[data,_List]:=Block[{i=1},
而[i<长度[数据],
数据[[i]]=f[data[[i]],数据[[i+1]],数据[[i-1]];
i=i+2;
]
i=2;
而[i<长度[数据],
数据[[i]]=f[data[[i]],数据[[i+1]],数据[[i-1]];
i=i+2;
数据];

FixedPoint[g,“initialdata”,SameTest->((#1-#2)。(#1-#2)使用Mathematica的面向列表的函数可能很容易完成此操作,但我不能完全说出您想要什么,因为您的代码不完整(语法错误和缺少数据)

您应该看看这些函数:

以下是几种可能的解释。列表关联:

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

ListCorrelate[{1, 1, 1}, data, {1, -1}, {}, Times, f]
隔墙和裂缝:

Riffle[Take[data, {1, -1, 2}], f @@@ Partition[data, 3, 2]]

如果您遵循以下原则并在此处提问,您可能会得到更好的答案:

{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}