2015-03-17 9 views
0

Итак, у меня есть трехмерный массив, представляющий ограничивающий объем (равномерная сетка «ячеек»), который был сплющен в 1D-массив, чтобы я мог использовать его в CUDA.Индексирование 3d-массива в 1-й массив - поиск соседей

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно иметь возможность взять любую данную «ячейку» в моей единой сетке и найти всех ее соседей. Это просто, когда у вас есть 3D-массив (всего три цикла для циклов от -1 до 1 и правильная индексация в 3D-массив), но я ужасен, пытаясь разбить это на версию, которая работает на 1D-массиве , Должна быть простая формула, которая будет вычислять это, но я просто не могу понять это.

Кроме того, края не должны зацикливаться, то есть ячейка в нижнем левом углу не должна быть «соседней» с ячейкой в ​​нижнем правом углу.

Любая помощь приветствуется. Благодарю.

+0

Что вы пытаетесь? То, что вы ищете, немного сложно, но не хуже, и ваша любимая поисковая система, вероятно, быстро приведет вас к алгоритму и реализациям на ваших любимых языках программирования. –

+0

@HighPerformanceMark Я попытался отработать это уравнение http://stackoverflow.com/questions/4810340/3d-1d-array-indexing?rq=1, но не имел большой удачи. Также не удалось найти что-либо на google или SO – Kinru

ответ

2

Вы можете сохранить три петли. Просто проверьте границы в каждом измерении и вычислите индекс путем вложенного сложения/умножения.

for (int i1 = -1; i1 <= 1; ++i1) { 
    for (int i2 = -1; i2 <= 1; ++i2) { 
     for (int i3 = -1; i3 <= 1; ++i3) { 
      const int x1 = p1 + i1; 
      const int x2 = p2 + i2; 
      const int x3 = p3 + i3; 
      if ( x1 >= 0 && x1 < n1 
       && x2 >= 0 && x2 < n2 
       && x3 >= 0 && x3 < n3) { 
       neighbour = array[(x1*n2+x2)*n3+x3]; 
      } 
     } 
    } 
} 
+0

Являются ли p1, p2 и p3 текущей позицией? И почему это + = 2 вместо 1? – Kinru

+0

Да, p1, p2 и p3 - текущее положение. К сожалению, я хотел избежать центральной, но сейчас я отредактирую. – jhnnslschnr

+0

Вы хотите, например, -1, -1, -1 тоже будет соседом? руды только соседи, которые «касаются лицом» – jhnnslschnr