I'm learning Rust by doing. As my first programming project I decided to implement the classic Conway's Game of Life - Wikipedia. To store the cells I use two dimensional arrays from an ndarray
module. Can you please tell me, how do I efficiently extract a stencil from an ndarray
? At the moment I'm doing the following:
// population array
let mut cells = Array2::<u8>::zeros((M,N));
...
// for each cell with coordinates i, j extract stencil
let vicinity = cells.slice(s![i-1..=i+1, j-1..=j+1]);
This works, but I'm not sure, how efficient this is. Also I would like to exclude "myself" (the current cell with coordinates i, j
) from the stencil. Would that be possible? How would I do that?
Finally, I would like to implement periodic boundary conditions, i.e. if the cell is on the top boundary of the grid (i=IMIN
) its stencil will have the coordinates cells.slice( s![IMIN, j-1..=j+1] )
and cells.slice( s![i..=i+1, j-1..=j+1] )
. In other words, the stencil will be composed of two slices. Is it an efficient approach to extract two slices and join them to perform further processing? How do I join these slices? I couldn't find this information in the ndarray
documentation.
Ideally, it would be great, if slices implemented "wrapping around" and the syntax i-1..=i+1, j-1..=j+1
would automatically pick up imax
value when i-1
would go beyond the minimum of imin
. Can you please point me in the right direction, if such "wrapping around" already exists in the ndarray
module?