Как оптимизировать поиск в 3D-массиве - PullRequest
0 голосов
/ 06 ноября 2018

новый для переполнения стека. Я работаю над тем, чтобы ускорить метод, которым я должен маскировать определенные элементы в трехмерном массиве. Мой код такой, какой он есть:

for (i = 1; i < height-1; i++)
for (j = 1; j < width-1; j++)
  {
    tmp = 
          mask[1][0]*a[i][j-1][0]+
          mask[0][1]*a[i-1][j][0]+
          mask[1][1]*a[i][j][0]+
          mask[2][1]*a[i+1][j][0]+
          mask[1][2]*a[i][j+1][0];
    if (tmp>255)
          tmp = 255;
    else if (tmp<0)
          tmp = 0;
    c[i][j][0] = tmp;
    tmp = 
          mask[1][0]*a[i][j-1][1]+
          mask[0][1]*a[i-1][j][1]+
          mask[1][1]*a[i][j][1]+
          mask[2][1]*a[i+1][j][1]+
          mask[1][2]*a[i][j+1][1];
    if (tmp>255)
          tmp = 255;
    else if (tmp<0)
          tmp = 0;
    c[i][j][1] = tmp;
    tmp = 
          mask[1][0]*a[i][j-1][2]+
          mask[0][1]*a[i-1][j][2]+
          mask[1][1]*a[i][j][2]+
          mask[2][1]*a[i+1][j][2]+
          mask[1][2]*a[i][j+1][2];
    if (tmp>255)
          tmp = 255;
    else if (tmp<0)
          tmp = 0;
    c[i][j][2] = tmp;
  }

Я уже сделал некоторые оптимизации, развернув внешний цикл for, однако мне нужно сделать его быстрее. Я знаю, что должен быть способ использовать указатели для более эффективного доступа к адресам трехмерной памяти, однако я не обладаю достаточным уровнем знаний C для этого. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 06 ноября 2018

Вы можете ввести еще один цикл k, чтобы уменьшить использование tmp в 3 раза.

for (i = 1; i < height-1; i++)
{
    for (j = 1; j < width-1; j++)
    {
        for (k=0; k<3; k++)
        {
            tmp = 
                mask[1][0]*a[i][j-1][k]+
                mask[0][1]*a[i-1][j][k]+
                mask[1][1]*a[i][j][k]+
                mask[2][1]*a[i+1][j][k]+
                mask[1][2]*a[i][j+1][k];
            if (tmp>255)
                tmp = 255;
            else if (tmp<0)
                tmp = 0;
            c[i][j][k] = tmp;
        }
    }
}

Вы используете mask[1][0], [0][1] и [1][1], но не используете [1][0] и [2][0]. Так что не могу упростить это дальше.

...