Этот вопрос появился, когда я делал «Игру жизни» Конвея. В C ++ я делал это так:
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
int neighbours = 0;
for (int yKord = i - 1; yKord <= i + 1; yKord++)
for (int xKord = j - 1; xKord <= j + 1; xKord++)
if (xKord != j || yKord != i)
if (xKord >= 0 && xKord < size && yKord >= 0 && yKord < size)
if (mat[yKord][xKord] == 1)
neighbours++;
newmat[i][j] = 0;
if (mat[i][j] == 1)
if (neighbours == 2 || neighbours == 3)
newmat[i][j] = 1;
if (mat[i][j] == 0)
if (neighbours == 3)
newmat[i][j] = 1;
}
}
for (int i = 0; i < size; i++)
for (int x = 0; x < size; x++)
mat[i][x] = newmat[i][x];
Но в Matlab вы можете использовать этот подход:
N = 100;
T = 50;
X = rand(N, N) > 0.5;
figure(1); imagesc(X); axis image; colormap gray; drawnow;
for t=1:T
neighbors = circshift(X, [1, 0]) + circshift(X, [-1, 0]) + circshift(X, [0, 1]) + circshift(X, [0, -1]) + ...
circshift(X, [1, 1]) + circshift(X, [-1, 1]) + circshift(X, [1, -1]) + circshift(X, [-1, -1]);
X(find(((neighbors > 3) | (neighbors < 2)) & X)) = 0;
X(find((neighbors == 3) & ~X)) = 1;
Интересно, можно ли использовать этот подход в C ++, манипулировать матрицей сразу.