2013-07-14 9 views
2

루핑을 제외하고. 여러 1D 배열에서 2D 배열을 인스턴스화하는 효율적인 방법이 있습니까?다중 1D에서 직사각형 2D 배열을 효율적으로 생성

내 1D 배열은 2D 사각형 배열에서 열 벡터로 동작해야합니다. 따라서 열 0 = 첫 번째 1D 배열, 열 1 = 두 번째 1D 배열 등 ...

나는 또한 System.Buffer.BlockCopy을 시도했지만 블록 복사는 단일 1D 배열을 여러 열로 롤링합니다. I 변환하는 방법의

간단한 예 :

var c1 = new int[] {1, 2, 3, 4}; 
var c2 = new int[] {5, 6, 7, 8}; 
var result = new int[,] 
      {{1,5}, 
      {2,6}, 
      {3,7}, 
      {4,8}}; 
+0

가장 빠른 방법은 전혀 할 수 없습니다. IMO로 자체 인덱서를 가진 랩퍼를 굴러 라. 또는 당신은 to_have to_art 일부 제 3 자 통합/api에 대한 배열을 가지고 있습니까? –

답변

0

unsafe 코드 및 포인터 루프는 C#을 제공 할 수있는 금식 방법이 될 것입니다. 이 경우에는 현재 JIT에서 제거 할 수없는 범위 검사를 제거하므로 unsafe을 사용하십시오.

쓰기시 메모리 순서로 2D 배열을 순차적으로 반복합니다. 즉, 열 단위 대신 행 단위로 작성해야합니다. 이 트릭은 메모리 액세스를 최적화하고 매번 주소 (y*width+y)를 계산하는 대신 쓰기 포인터를 증가시킬 수 있습니다. 이외에도 (당신은뿐만 아니라 해결책을이를 지정하지 않았기 때문에)이 할 것 루프에서

+0

코드를'unchecked' 절로 묶어 경계 검사를 제거 할 수 있습니다. – AgentFire

+2

@AgentFire를 선택 해제하면 범위 검사가 아닌 오버플로 검사가 해제됩니다. 경계 체크를 아프게 할 수는 없습니다. – usr

0

:

  var c1 = new int[] { 1, 2, 3, 4 }; 
      var c2 = new int[] { 5, 6, 7, 8 }; 
      var c3 = new int[,] 
      { 
       {c1[0],c2[0]}, 
       {c1[1],c2[1]}, 
       {c1[2],c2[2]}, 
       {c1[3],c2[3]} 
      };