2014-11-02 99 views
0

我有一個3D數據數組,代表一堆二維數據。在這種特殊情況下,堆棧只包含一個元素。 將此數據映射到線性陣列的最快方法是什麼?如何將3D陣列映射到線性陣列?

我正打算採取以下辦法:

public static int[] ToBuffer<(this int[, ,] buffer3D, int w, int h) 
    { 
     int[] buffer = new int[w * h * 1]; 

     for (int i = 0; i < (w * h); i++) 
     { 
      buffer[i] = buffer3D[(int)Math.Floor(i/(double)w), i % w, 0]; 
     } 

     return buffer; 
    } 

但它發生,我認爲可能有一些方法來充分利用數據的方式已經存儲在內存中。有沒有其他的映射方法應該在csharp中使用?

+0

你可以嘗試'回報(INT [])buffer3D.Clone();'? – 2014-11-02 23:37:46

+0

可能的重複http://stackoverflow.com/q/4674394/395718 – Dialecticus 2014-11-02 23:43:58

+0

@BatuhanTasdoven不,不幸的是,這導致了一個'InvalidCastException':無法投射類型爲'System.Int [,,]'的對象來鍵入'System。 INT []」。 – dionys 2014-11-03 00:04:08

回答

1

我想,新陣列創建新的緩衝和複製三維陣列的緩衝應該工作:

public static int[] ToBuffer(int[, ,] buffer3D, int w, int h) { 
    int[] buffer = new int[w * h * 1]; 
    Buffer.BlockCopy(buffer3D, 0, buffer, 0, w * h * sizeof(int)); 
    return buffer; 
} 
1

儘管你可能會在這裏使用一些Linq,但.ToArray()函數在內部使用一個具有設置大小的數組,然後當它變得太大時替換它 - 不像已經發布的代碼那樣效率很高。 (請參閱:class Enumerable on Reference Source

請注意,C#的主要優勢,內存管理,也是其優化的主要原因 - 因爲指針等被高度管理,以這種方式訪問​​它們以優化代碼,在C#中通常要比其他語言困難得多。