我经常发现自己为给定操作/算法的一维、二维和三维版本编写了非常相似的代码。维护所有这些版本可能会变得乏味。简单的代码生成工作得相当好,但似乎认为必须有更好的方法。
有没有一种相对简单的方法来编写一次操作并将其推广到更高或更低的维度?
一个具体的例子是:假设我需要计算谱空间中速度场的梯度。在三个维度上,Fortran 循环看起来像:
do k = 1, n
do j = 1, n
do i = 1, n
phi(i,j,k) = ddx(i)*u(i,j,k) + ddx(j)*v(i,j,k) + ddx(k)*w(i,j,k)
end do
end do
end do
ddx
适当定义数组的位置。(也可以用矩阵乘法来做到这一点。)二维流的代码几乎完全相同,除了:第三维从循环、索引和组件数量中删除。有没有更好的表达方式?
另一个例子是:假设我在三维网格上逐点定义流体速度。要将速度内插到任意位置(即不对应于网格点),可以在所有三个维度上连续使用一维Neville算法(即降维)。给定简单算法的一维实现,是否有一种简单的方法来进行降维?