У меня возникли проблемы с развертыванием вложенных for
loops. Я понимаю эту концепцию, я пытаюсь применить ее на практике, но я сбиваюсь с толку при редактировании операторов в моих for
циклах, чтобы они соответствовали развертыванию.
Если бы кто-нибудь мог просто показать мне эффективную развертку и провести меня через нее, это было бы огромной помощью.
Вот секция цикла, которую я хочу развернуть:
for (i=1 ; i < WIDTH-1 ; ++i)
{
for (j = 1 ; j < HEIGHT-1 ; ++j)
{
n = getNeighbors(prv, i, j); /* This is where I'm confused */
mask = (prev[i][j] << 1);
next[i][j] = !(((n >> prev[i][j]) ^ 3) ^ mask);
}
}
ОБНОВЛЕНИЕ: Это будет правильно?
for (i=1 ; i < WIDTH-1 ; i+=4)
{
for (j = 1 ; j < HEIGHT-1 ; j+=4)
{
n = getNeighbors(prv, i, j);
mask = (prev[i][j] << 1);
next[i][j] = !(((n >> prev[i][j]) ^ 3) ^ mask);
n = getNeighbors(prv, i, j+1);
mask = (prev[i][j+1] << 1);
next[i][j+1] = !(((n >> prev[i][j+1]) ^ 3) ^ mask);
n = getNeighbors(prv, i, j+2);
mask = (prev[i][j+2] << 1);
next[i][j+2] = !(((n >> prev[i][j+2]) ^ 3) ^ mask);
n = getNeighbors(prv, i, j+3);
mask = (prev[i][j+3] << 1);
next[i][j+3] = !(((n >> prev[i][j+3]) ^ 3) ^ mask);
}
for (j = 1 ; j < HEIGHT-1 ; j+=4)
{
n = getNeighbors(prv, i+1, j);
mask = (prev[i+1][j] << 1);
next[i+1][j] = !(((n >> prev[i+1][j]) ^ 3) ^ mask);
n = getNeighbors(prv, i+1, j+1);
mask = (prev[i+!][j+1] << 1);
next[i+1][j+1] = !(((n >> prev[i+1][j+1]) ^ 3) ^ mask);
n = getNeighbors(prv, i+1, j+2);
mask = (prev[i+1][j+2] << 1);
next[i+1][j+2] = !(((n >> prev[i+1][j+2]) ^ 3) ^ mask);
n = getNeighbors(prv, i+1, j+3);
mask = (prev[i+1][j+3] << 1);
next[i+1][j+3] = !(((n >> prev[i+1][j+3]) ^ 3) ^ mask);
}
for (j = 1 ; j < HEIGHT-1 ; j+=4)
{
n = getNeighbors(prv, i+2, j);
mask = (prev[i+2][j] << 1);
next[i+2][j] = !(((n >> prev[i+2][j]) ^ 3) ^ mask);
n = getNeighbors(prv, i+2, j+1);
mask = (prev[i+2][j+1] << 1);
next[i+2][j+1] = !(((n >> prev[i+2][j+1]) ^ 3) ^ mask);
n = getNeighbors(prv, i+2, j+2);
mask = (prev[i+2][j+2] << 1);
next[i+2][j+2] = !(((n >> prev[i+2][j+2]) ^ 3) ^ mask);
n = getNeighbors(prv, i+2, j+3);
mask = (prev[i+2][j+3] << 1);
next[i+2][j+3] = !(((n >> prev[i+2][j+3]) ^ 3) ^ mask);
}
for (j = 1 ; j < HEIGHT-1 ; j+=4)
{
n = getNeighbors(prv, i+3, j);
mask = (prev[i+3][j] << 1);
next[i+3][j] = !(((n >> prev[i+3][j]) ^ 3) ^ mask);
n = getNeighbors(prv, i+3, j+1);
mask = (prev[i][j+1] << 1);
next[i+3][j+1] = !(((n >> prev[i+3][j+1]) ^ 3) ^ mask);
n = getNeighbors(prv, i+3, j+2);
mask = (prev[i][j+2] << 1);
next[i+3][j+2] = !(((n >> prev[i+3][j+2]) ^ 3) ^ mask);
n = getNeighbors(prv, i+3, j+3);
mask = (prev[i+3][j+3] << 1);
next[i+3][j+3] = !(((n >> prev[i+3][j+3]) ^ 3) ^ mask);
}
}
prv
? чего вы пытаетесь достичь, разворачивая цикл(ы)? Вы, наконец, хотите один цикл или вообще без цикла? - person m.s.   schedule 31.05.2015prv
- это двумерный массив, я пытаюсь научиться оптимизировать код и добиться более быстрого времени выполнения, я думаю, мне вообще не нужен цикл, но я бы хотел увидеть обе версии. Я пытаюсь изучить его без помощи компилятора. WIDTH и HEIGHT являются константами. - person slippeel   schedule 31.05.2015