2013-05-21 27 views
3

我有一個二維數組聲明爲new byte[w, h]。我想給出座標(x1,y1) - (x2,y2)這個數組的子部分。什麼是最快的方法來做到這一點?是否有任何「切片」2D陣列的方法?如何裁剪二維數組的子部分?

+0

切片可以環繞陣列邊緣。即Is(2,2)=>(1,2)是否有效? –

+0

@steaks:否。裁剪區域將始終位於原始字節數組內。最壞的情況是它的尺寸完全相同:(0,0)到(w-1,h-1)。 – mpen

+0

,因爲它是一個'Array'或者你可以使用'Matrix'? – WiiMaxx

回答

1

你可以使用Array.Copy

int w2 = x2 - x1 + 1; 
int h2 = y2 - y1 + 1; 
byte[,] array2 = new byte[w2, h2]; 
for (int i = 0; i < w2; i++) 
{ 
    Array.Copy(array1, (i+x1)*h + y1, array2, i*h2, h2); 
} 

對於大型陣列,這可能會更快。但是這兩個嵌套循環更具可讀性。

1

我不能想出一個更快的方法,但你可以使用兩個嵌套的循環:

byte[,] array2 = new byte[x2 - x1, y2 - y1]; 
for (int i = x1; i < x2; i++) 
{ 
    for (int j = y1; j < y2; j++) 
    { 
     array2[i-x1, j-y1] = array[i, j]; 
    } 
} 

對於交錯數組,你可以使用LINQ查詢:

IEnumerable<byte> x = array3.Skip(x1) 
          .Take(x2-x1) 
          .SelectMany(a => a.Skip(y1).Take(y2-y1)); 
+0

想到也許我們可以使用某種類型的MemoryStream來複制塊。哦,那現在就得做。謝謝:-) – mpen

+0

是的,我懷疑有。我希望這不是最好的答案。 –