【发布时间】:2021-07-08 03:47:48
【问题描述】:
我有一个数学函数,我想在 1d、2d 和 3d 空间中使用它。我编写了适用于 3-d 案例的代码,并且可以轻松地为其他案例修改它,但是我想知道是否有一种方法可以编写它,以便它适用于任意维度。基本上每个维度都有另一个嵌套循环,我不知道如何制作多个嵌套循环而不实际将它们写在代码中。
void gen_kernel_Gk(double *Gk, double L, double b, int np, int Z, int m)
{
// Generates Kernel Function G in k-space
// Gk is the array of the function values, it has Z * m number of values
// L is cuttoff distance
// b is monomer size
// np is the degree of polymerization
// Z is the number of modes
// m is the dimensionality of the real space
int i, j, k, l, index, Zhalf;
double pref, kvec[m], k2;
pref = pow( 2 * PI / (double)L, 2) * pow( b, 2) * (double)np / 6.0;
Zhalf = Z / 2;
for( i = 0; i < Z; ++i)
{
if( i < Zhalf)
{
kvec[0] = (double) pow( i, 2);
}
else
{
kvec[0] = (double) pow ( Z - i ,2);
}
for( j = 0; j < Z; ++j)
{
if( i < Zhalf)
{
kvec[1] = (double) pow( j, 2);
}
else
{
kvec[1] = (double) pow ( Z - j ,2);
}
for( k = 0 ; k < Z ; ++k)
{
if( k < Zhalf)
{
kvec[2] = (double) pow( k, 2);
}
else
{
kvec[2] = (double) pow ( Z - k ,2);
}
for( k2 = 0, l = 0; l < m; ++l)
{
k2 += kvec[l];
}
index = i * pow( Z, 2) + j * Z + k;
Gk[index] = 2.0 * ( exp( -k2) + k2 - 1.0) / pow( k2, 2);
}
}
}
return;
}
【问题讨论】:
-
您可以使用递归,也可以使用您的维度大小的堆栈来存储循环变量并在那里管理它们。递归会更简单。
-
@paddy,我有兴趣看到解决方案。递归不是我的强项,我什至不确定现在从哪里开始使用您提到的自定义堆栈解决方案,我也希望看到。
-
@GabrielStaples 我添加了答案以展示基于递归的解决方案的原理
-
检查我的
bool nested_for(double *a0,double *a,double *a1,double *da,int &ix,int N)它基本上将所有 N 嵌套的 for 循环序列化为单次迭代调用 API ...它的 C++ 但应该很容易移植到 C。如果你想要真正的 ND math 和东西然后 C不是好选择,因为您缺少模板和类...部分您可以使用宏解决此问题,但只能达到一定程度
标签: c math nested-loops