C ++: Можно ли манипулировать целыми матрицами, а не отдельными элементами? - PullRequest
0 голосов
/ 10 июля 2020

Этот вопрос появился, когда я делал «Игру жизни» Конвея. В 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 ++, манипулировать матрицей сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...