대각선을 따라 평면 버퍼에 저장된 2D 행렬을가집니다. 예를 들어, 4 × 4 매트릭스는 인덱스과 같이 흩어져 것 :대각선으로 평탄화 된 행렬에 대한 인접 색인 계산
이 유일합니다, 원래의 인덱스와 X가 주어 이웃 요소의 인덱스를 계산하는 가장 효율적인 방법은/Y 오프셋 무엇인가? 예를 들어,
// return the index of a neighbor given an offset
int getNGonalNeighbor(const size_t index,
const int x_offset,
const int y_offset){
//...
}
// for the array above:
getNGonalNeighbor(15,-1,-1); // should return 11
getNGonalNeighbor(15, 0,-1); // should return 14
getNGonalNeighbor(15,-1, 0); // should return 13
getNGonalNeighbor(11,-2,-1); // should return 1
여기서 오버플로가 발생하지 않고 랩 어라운드가 발생하지 않는다고 가정합니다.
나는 triangular number과 삼각근 계산을 많이 포함하는 솔루션을 가지고 있습니다. 또한 가능한 많은 분기를 포함하고 있습니다 (분기 제어 흐름이 비싼 GPU에서 실행될 수 있음). 내 솔루션은 작동하지만 매우 길다. 나는 그것을하는 훨씬 더 간단하고 덜 계산 집중적 인 방법이 있어야하는 것처럼 느낀다.
누군가가이 특정 문제/표현에 이름을 붙이면 도움이 될지도 모릅니다.
관심이있는 사람이라면 저의 전체 솔루션을 게시 할 수 있지만 제가 말했듯이 그러한 간단한 작업에는 매우 길고 복잡합니다. 간단히 말해서, 내 솔루션을 수행합니다
- 이 될 것 4 × 4 매트릭스를 들어
(17 될 것입니다 예를 들어 13)이 개 삼각형을 다루는 피하기 위해 더 큰 삼각 행렬로 원래 인덱스를 번역 :
0 2 5 9 14 20 27
1 4 8 13 19 26
3 7 12 18 25
6 11 17 24
10 16 23
15 22
21
- 오프셋의 맨해튼 거리 인덱스의 삼각 루트를 사용해 표현 이웃의 대각선의 인덱스를 구한다.
- 오프셋을 사용하여이 대각선에서 이웃의 위치를 계산합니다. 패딩을 제거하여 원래 표현으로 다시 변환합니다.
어떤 이유로이 방법은 내가 생각해 낼 수있는 가장 간단한 해결책입니다.
편집 :
오프셋 축적 루프를 갖는
나는 삼각형 번호의 속성 부여,이 두 개의 삼각형의 행렬을 분할하는 것이 더 쉽습니다 실현 (하자를 0 ~ 9의 '상 삼각형'과 10 ~ 15의 '아래 삼각형')을 호출하고, 위쪽 삼각형에 1을 더하고 아래쪽에 1을 더하여 오프셋을 누적하는 테스트 내부 루프를 갖습니다. 그러나 솔루션 루프의 경우 모든 비용, 특히 불균형 한 출장 횟수 (다시 말하면 , 매우이 GPU에 적합하지 않음)의 루프를 피해야합니다.
so 나는 알고리즘 중 하나 인 대수적 솔루션 대신에을 찾고 있습니다.
조회 테이블을 만들기 :
다시 때문에 GPU, 조회 테이블을 구축 방지하고 (매우 비싼)이 랜덤 액세스를하는 것이 바람직하다. 대수적 인 해결책이 바람직합니다. 행렬의
특성 :
- 행렬의 크기가 알려져있다.
- 지금은 사각형 행렬만을 고려하지만 직사각형 행렬에 대한 해법도 유용 할 것입니다.
- 이 예제에서 함수의 이름과 같이 N 차원 볼륨 (따라서 N-Gonal 평탄화)으로 솔루션을 확장하는 것이 좋습니다.
패턴을보십시오. 0 2는 항상 첫 번째 행의 첫 번째 요소가 될 것이고 각 (0, j) s.t. j가 1보다 크면 +1 (2 + 3 = 5, + 4 = 9, +5 = 14 ...) 은 첫 번째 열과 동일합니다. 조금 더 생각한 후, 열 번호를보고 column-column을 이동할 때 패턴이 주어집니다. 아프다. 0,1,3,6,10은 매번 x + 1을 증가시킨다. 열 1 (2로 시작)에 대해 각 열에 대해 + 2, + 3, + 4로 시작하십시오. – Infested
위의 삼각형 (이 경우 색인이 9보다 작은 경우)의 동작을 설명하는 것 같습니다. 문제는이 것이 더 낮은 삼각형에 대해 변하고 인덱스가 하나의 삼각형에 있고 이웃이 다른 삼각형에 있으면 지저분해진다는 것입니다. 나는 왜 삼각 행렬로 전체 행렬을 감싸고 설명하는 속성을 사용합니다. – Thibaut
귀하의 질문에 4x4 매트릭스를보고 있습니다. – Infested