2015-02-02 6 views
1

나는이 (실제 4D 벡터의 마지막 구성 요소는 무시됩니다)처럼 float3 벡터를 정렬의 OpenCL의 셔플 기능을 사용하고 있습니다 :반전 A (작은) 순열

uint4 mask = (uint4)(0,1,2,3); 
mask.xyz = res.x < res.y ? (res.x >= res.z ? mask.yxz : mask.yzx) : (res.y >= res.z ? mask.xyz : mask.xzy); 
float4 abcd = shuffle(res,mask); 

내가 다음 조작 각 벡터 abcd의 구성 요소 및 다음과 같이 분류 순열을 되돌리고 싶은 :

uint4 inv_mask = ... // ??? 
res = shuffle(abcd,inv_mask); // Inverse the sorting permutation 

가 어떻게 효율적으로 역 마스크를 계산합니까?

답변

1

를 들어

가능성의 수는 매우 제한되어

  1. x> = Y> Z = => mask.xyz = (0,1,2), inv_mask = (0,1,2)
  2. x> = z> = y => mask.xyz = (0,2,1), inv_mask = (0,2,1)
  3. y> = x> = z => mask.xyz = (1,0,2) , inv_mask = (1,0,2)
  4. y> = z> = x => mask.xyz = (1,2,0), inv_mask = ((2,0,1)
  5. z> = x> = y => mask.xyz = (2,0,1), inv_mask = (1,2,0)
  6. z> = y> = x = > mask.xyz = (2,1,0), inv_mask = (2,1,0)

6 개의 가능한 순열 중 2 개만이 하나 이상의 스왑을 포함하므로 나머지 4 개의 순열은 다음과 같습니다. 그들 자신에 의해 반전되었다. 당신이 mask을 계산하면

, 당신은 inv_mask를 얻기 위해 다음 코드를 사용할 수 있습니다

inv_mask.xyz = mask.xyz == (int3)(1,2,0) ? (int3)(2,0,1) : (mask.xyz == (int3)(2,0,1) ? (int3)(1,2,0) : mask.xyz);

0

uint4 invmask = (uint4)(3,3,3,3) - mask; 을 의미할까요? 마스크 (0,3,1,2)이 당신을 제공합니다 (3-0, 3-3, 3-1, 3-2) = (3,0,2,1)

+0

아니,이 예 신원 순열 마스크의 역, 0,1 (역 순열을 제공하지 않습니다 , 2,3, 변경해서는 안됩니다). –

+0

이것은 i가 j 위치에 놓여 있다면 (i, j)에 1을, 그렇지 않으면 0으로 구성된 순열 행렬을 가지고있는 것처럼 들린다. 그리고 반전 된 순열은 거꾸로 된 행렬이어야한다. – Christian

+0

오른쪽. 그러나 행렬을 뒤집는 것은 너무 광범위합니다. –