Краевые / граничные условия многомерного массива - PullRequest
0 голосов
/ 31 мая 2010

Я перебираю трехмерный массив (который представляет собой изображение с 3 значениями для каждого пикселя), чтобы применить фильтр 3x3 к каждому пикселю следующим образом:

//For each value on the image    
for (i=0;i<3*width*height;i++){
    //For each filter value
    for (j=0;j<9;j++){
        if (notOutsideEdgesCondition){
            *(**(outArray)+i)+= *(**(pixelArray)+i-1+(j%3)) * (*(filter+j));
        } 
    }
}

Я использую арифметику указателей, потому что, если бы я использовал обозначение массива, у меня было бы 4 цикла, и я пытался бы получить как можно меньшее количество циклов. Моя проблема в том, что мой notOutsideEdgesCondition выходит из-под контроля, потому что я должен рассмотреть 8 пограничных случаев. У меня есть следующие обработанные условия

  • Левая колонка: ((i%width)==0) && (j%3==0)
  • Правая колонка: ((i-1)%width ==0) && (i>1) && (j%3==2)
  • Верхний ряд: (i<width) && (j<2)
  • Нижняя строка: (i>(width*height-width)) && (j>5)

и все же придется рассмотреть 4 угловых случая, которые будут иметь более длинные выражения. На этом этапе я остановился и спросил себя, лучше ли это, потому что если у меня будет условная оценка в 5 строк, отладка будет не только по-настоящему болезненной, но и замедлит внутренний цикл. Вот почему я пришел к вам, чтобы спросить, есть ли известный алгоритм для обработки этих случаев или есть лучший подход к моей проблеме. Большое спасибо.

Ответы [ 2 ]

1 голос
/ 31 мая 2010

Да, есть намного лучший способ. Напишите быстрый цикл для обработки случаев, когда гарантированно не будет граничных задач. Он будет состоять из области от второго до ближайшего к последнему столбца и от второго до ближайшего к последнему рядам. Затем вы можете написать четыре подпрограммы для обработки каждой из сторон (строка 0, столбец 0, строка N и столбец N), и вы можете вручную кодировать последние четыре точки.

Тем не менее, есть еще и намного более быстрые способы выполнения вычислений адресации, которые вы делаете.

0 голосов
/ 31 мая 2010

Хороший совет - добавить дополнительную строку в верхней части массива, а другую в конце (сделать то же самое для столбцов).

Эти дополнительные строки / столбцы не будут содержать никакой информации, но они облегчат вычисления (без границ). По цене потребления большего количества памяти ...

Просто идея:)

...