【请教】Mathematica中如何加速这个常规的三维For Loop语句?
mathematica吧
全部回复
仅看楼主
level 2
Mathematica中如何加速这个常规的三维For Loop语句?
For[i = 1, i <= 1000, i++,
For[j = 1, j <= 1000, j++,
For[k = 1, k <= 1000, k++,
If[x[[i]]^2 + y[[j]]^2 + z[[k]]^2 >= R^2,
FunVal[[i, j, k]]=
G[x[[i]], y[[j]], z[[k]]], FunVal[[i, j, k]]= 0.0]]];
我的目标是将有一个在三维空间内(在球体外部,x[[i]]^2 + y[[j]]^2 + z[[k]]^2 >= R^2)构造Table (名为FunVal)存储G函数的离散值。因为G函数比较复杂,所以导致计算速度很慢。
尝试过Outer[G, x[[i]], y[[j]], z[[k]]],效果不好,而且好像不能加入“位于球外”这个条件。
请问有加速的方法吗?谢谢大家。
2022年09月09日 11点09分 1
吧务
level 10
Outer应该问题不大,无论是性能还是判断,你是怎么写的?
2022年09月09日 13点09分 2
吧务
level 12
单纯为了提速循环的话,把For换成Table就可以。
n = 100;
x = Subdivide[-1, 1, n - 1];
y = Subdivide[-1, 1, n - 1];
z = Subdivide[-1, 1, n - 1];
FunVal = ConstantArray[0, {n, n, n}];
R = 0.4;
For[i = 1, i <= n, i++,
For[j = 1, j <= n, j++,
For[k = 1, k <= n, k++,
If[x[[i]]^2 + y[[j]]^2 + z[[k]]^2 >= R^2,
FunVal[[i, j, k]] = G[x[[i]], y[[j]], z[[k]]],
FunVal[[i, j, k]] = 0.0]]]]; // AbsoluteTiming
FunVal2 =
Table[If[xi^2 + yi^2 + zi^2 >= R^2, G[xi, yi, zi], 0.0], {xi,
x}, {yi, y}, {zi, z}]; // AbsoluteTiming
FunVal == FunVal2
(*Out[29]= {5.02581, Null}
Out[30]= {2.40033, Null}
Out[31]= True*)
但你这个1000*1000*1000的量级有点太大了,建议考虑下Compile。可以把x, y, z和G的具体定义发上来看看能不能优化
2022年09月10日 09点09分 3
吧务
level 12
3楼的回复又被抽了,只能发截图
2022年09月10日 13点09分 4
吧务
level 15
LZ在知乎也问了:
zhihu.com/question/552633415
基本可以肯定瓶颈在G函数上,没有G函数的具体定义回答者是不太可能给出有效建议的。
2022年09月30日 16点09分 5
1