我是一名物理系学生。我必须对数据列表执行简单的放松循环 我做了一个简单的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]]?
也许这是一个微不足道的问题所以我提前道歉,
谢谢
答案 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的面向列表的函数可以很容易地完成此操作,但由于代码不完整(语法错误和缺少数据),我无法完全告诉您需要什么。
您应该查看以下功能: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]}
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原则并在此处提出问题,您可能会得到更好的答案: