我有以下代码用于模拟2D扩散。
import time
grid_shape = (640, 640)
@profile
def evolve(grid, dt, out, D=1.0):
xmax, ymax = grid_shape # width and height of the matrix
for i in range(xmax):
for j in range(ymax):
grid_xx = (
grid[(i + 1) % xmax][j] + grid[(i - 1) %
xmax][j] - 2.0 * grid[i][j]
)
grid_yy = (
grid[i][(j + 1) % ymax] + grid[i][(j - 1) %
ymax] - 2.0 * grid[i][j]
)
out[i][j] = grid[i][j] + D * dt * (grid_xx + grid_yy)
def run_experiment(num_iterations):
# setting up the initial conditions
xmax, ymax = grid_shape
next_grid = [[0.0] * ymax for x in range(xmax)]
grid = [[0.0] * ymax for x in range(xmax)]
# initial conditions for simulating a drop of dye in the middle of the simulated region
block_low = int(grid_shape[0] * 0.4)
block_high = int(grid_shape[0] * 0.5)
for i in range(block_low, block_high):
for j in range(block_low, block_high):
grid[i][j] = 0.005
# Evolve the initial conditions
start = time.time()
for i in range(num_iterations):
# evolve modifies grid and next_grid in-place
evolve(grid, 0.1, next_grid)
grid, next_grid = next_grid, grid
return time.time() - start
run_experiment(100)
根据我的理解,evolution在适当的位置修改next_grid,然后为grid分配next_gride以反映该迭代中的更新。但是,为什么next_grid被分配了网格,如果我没有弄错的话,它就是网格的前一个状态?
TLDR:使用不再需要的矩阵作为下一次迭代的输出。
正如你在评论你的答案时所写:
代码确实试图展示一种内存高效的方法。。。
而且交换是为了保持低内存效率。
在算法中,内存中需要两个矩阵,一个用于输入,另一个用于输出。让我们调用起始矩阵A0,每个连续进化的结果将是A1、A2、A3等。
- 在第一次迭代中,A0为输入,A1为输出。我们需要在内存中准备两个矩阵
- 在第二次迭代中,A1被输入,A2被输出。不再需要A0,所以我们可以使用它将A2写入其中(而不是创建3d矩阵(
- 在第三次迭代中,A2被输入,A3被输出。不再需要A1,因此我们可以使用它将A3写入其中
- 等等