문제

나는이 해결하려는 수치적으로는 설정한 편미분 방정식의 세 가지 차원에서.에서 각각의 방정식은 다음의 가치는 알 수 없는 지점에 따라 현재 각각의 가치를 알 수 없는에서 가장 가까운 점입니다.

를 작성하는 코드를 효율적으로 유지해야하는 포인트 가까이에서 세 가지 차원에서 닫기(일차원)메모리 공간,그 각각의 값이라는 메모리에서만 인쇄할 수 있습니다.

나는 생각하고 있었을 사용하여 octtrees,하지만 내가 궁금하다면 누군가가 알고있는 더 좋은 방법입니다.

도움이 되었습니까?

해결책

Octtrees 는 방법입니다.당신이 세분화의 배열로 8octants:

1 2
3 4

---

5 6
7 8

고 그들을 순서대로 메모리에 1, 2, 3, 4, 5, 6, 7, 8 합니다.당신은 이것을 반복 재귀적으로 각 내에서 팔분할 때까지 당신이 몇 가지 기본 크기는,아마 약 128 바이트 또는 그래서(이것은 단지 추측--확인하십시 프로파일을 결정하는 최적의 구분 지점).이것은 훨씬,훨씬 더 나은 캐시 일관성 및 지역의 참조보다 순진 레이아웃이 있습니다.

다른 팁

하나 대리법:사용 Morton-하기 위해 인코딩합니다.

에서 세 가지 차원 그것은 다음과 같습니다.을 좌표 구성 요소와 인터리브 각각의 비트는 두 개의로 비트입니다.여기에 표시된 바이너리:11111b 가 1001001001b

C-기능을 이렇게 하는 다음과 같습니다(다음과 같은 명확성을 위해서만 11 비트):

int morton3 (int a)
{
  int result = 0;
  int i;
  for (i=0; i<11; i++)
  {
     // check if the i'th bit is set.
     int bit = a&(1<<i);
     if (bit)
     {
       // if so set the 3*i'th bit in the result:
       result |= 1<<(i*3);
     }
  }
  return result;
}

할 수 있는 이 기능을 사용하여 결합하는 위치에 다음과 같다:

index = morton3 (position.x) + 
        morton3 (position.y)*2 +
        morton3 (position.z)*4;

이집의 세 가지 차원의 인덱스로 한 차원 하나입니다.최고의 그것의 일부:값이 있는 가까운 3 차원 공간에서는 가까이에서 1D 공간뿐만 아니라.액세스하는 경우에는 값이 서로 가까이 자주 당신은 또한 당신이 또한 매우 좋은 속도하기 때문에 morton-기 위해 인코딩은 최적의 점에서 캐시지입니다.

에 대한 morton3 당신은 더 나은 사용하지 않습니다.사용하는 작은 테이블 보고 4 또는 8 비트 시간에 그리고 그들을 함께 결합한다.

그것을 희망하는 데 도움이, Nils

의 예약 의 기초를 다차원과 측정 데이터 구조 를 결정하는 데 도움이 될 수 있는 데이터 구조는 가장 빠른 범위에 대한 쿼리:octrees,kd-나무,R-trees,...에 대해서도 설명합니다 데이터 레이아웃을 유지를 위한 포인트가 함께 메모리에 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top