Идея в том, чтобы использовать функцию MOD , как объяснено @ MartinB . Вот некоторый код для эффективного вычисления соседей каждой точки в вашем кубе 4x4x4:
%# generate X/Y/Z coordinates of each point of the 4x4x4 cube
sz = [4 4 4]; %# size of the cube along each dimension
[X Y Z] = ndgrid(1:sz(1),1:sz(2),1:sz(3));
coords = [X(:) Y(:) Z(:)];
%# generate increments to get the 26 neighbors around a 3D point
[X Y Z] = ndgrid([-1 0 1], [-1 0 1], [-1 0 1]);
nb = [X(:) Y(:) Z(:)];
nb(ismember(nb,[0 0 0],'rows'),:) = []; %# remove the row [0 0 0]
%# for each 3D point, compute its neighbors
allNeighbors = zeros([size(nb,1) 3 size(coords,1)]);
szMod = repmat(sz, [size(nb,1) 1]);
for i=1:size(coords,1)
cc = bsxfun(@plus, nb, coords(i,:)); %# find 26 neighbors of coords(i,:)
cc = mod(cc-1,szMod)+1; %# wrap around circularly
allNeighbors(:,:,i) = cc; %# save them for later processing
end
Порядок генерируемых соседей следующий:
>> nb
nb =
-1 -1 -1 %# read as: (i-1,j-1,k-1)
0 -1 -1 %# read as: (i,j-1,k-1)
1 -1 -1 %# ...
-1 0 -1
0 0 -1
1 0 -1
-1 1 -1
0 1 -1
1 1 -1
-1 -1 0
0 -1 0
1 -1 0
-1 0 0
1 0 0
-1 1 0
0 1 0
1 1 0
-1 -1 1
0 -1 1
1 -1 1
-1 0 1
0 0 1
1 0 1
-1 1 1
0 1 1
1 1 1