Можно ли воспроизвести подход MATLAB с циклическим сдвигом в Armadillo? - PullRequest
0 голосов
/ 14 июля 2020

Я нашел этот фрагмент кода для MATLAB, который позволяет вам подсчитывать соседей для Игры жизни Конвея с использованием circshift и того, что, как я думаю, имеет какое-то отношение к свертке (не слишком горд своими знаниями, все еще учусь и хотел бы получить ваше объяснение того, что происходит)

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 ++ Armadillo. Можно ли это сделать? Спрашиваю, поскольку я не нашел функцию circshift, просто shift () или conv2 ()

1 Ответ

1 голос
/ 14 июля 2020

Функция shift() работает как в Matlab для типов vec, но для mat вы должны сделать это дважды (в каждом измерении), например

arma::mat circshift(arma::mat A, int r, int c)
{
    return arma::shift(arma::shift(A,r,0),c,1);
}
...