2016-09-20 7 views
2

私はいくつかのデータ - 2 x 10000 x 4000を含む非常に大きな3D配列を持っています。このデータの一部を処理するつもりですが、一次元(2)。3D配列から2D配列 - 次元を無視する

私の2×10000×4000 3Dアレイを使用し、10000×4000の寸法の2Dアレイを作成する簡単な方法はありますか?これを行うことができます forループを経由しない?コピー機能やそれに類似するものがありますか?これは、単一ディメンション(または複数)の配列要素を新しい配列にコピーすることを可能にしますか?

+5

短い回答:いいえ – InBetween

+1

ギザギザの配列の場合のみ: 'array [10000、4000] [2]' –

+0

最初のディメンションは必要ないとはどういう意味ですか? 'myArray [0、_、_]'または 'myArray [1、_、_]'が必要です。どれ? – InBetween

答えて

0

私は完全な配列のためにコンソールコマンドを作成するために使用しましたが、ギザギザの配列ではどうなるかわかりません。

でも試すことができます。

コードスニペット:

float[,] f = new float[3,3] { {1, 2, 3}, 
           {4, 5, 6}, 
           {7, 8, 9} }; 
float[,] g = new float[3,3]; 

Array.Copy(f, 0, g, 0, f.Length); 


Console.WriteLine("{0} {1} {2}", f[0, 0], f[0, 1], f[0, 2]); 
Console.WriteLine("{0} {1} {2}", f[1, 0], f[1, 1], f[1, 2]); 
Console.WriteLine("{0} {1} {2}", f[2, 0], f[2, 1], f[2, 2]); 
Console.WriteLine(); 
Console.WriteLine("{0} {1} {2}", g[0, 0], g[0, 1], g[0, 2]); 
Console.WriteLine("{0} {1} {2}", g[1, 0], g[1, 1], g[1, 2]); 
Console.WriteLine("{0} {1} {2}", g[2, 0], g[2, 1], g[2, 2]); 
0

あなたの操作が読み取り専用である場合は、関数の引数を使用してディメンションを選択することができます。あなたの配列は、このようなことしてみましょう:

float[,,] f = new float[2,10000,4000]; 

あなたのオペレータは、このようなことしてみましょう:

void myOperation(float[,,] pArray, int p1stDimensionSelector) { 
    for (int i = ...; i < ...; i++) { 
    for (int j = ...; j < ...; j++) { 
     // do fancy stuff with pArray[p1stDimensionSelector, i, j] 
    } 
    } 
} 

あなたはそれで書く必要がある場合は、あなたがの一部のコピーで正しい道にありますアレイ。この場合、ループでコピーする方法はありません。

配列に特殊な構造がある場合は、その半分がゼロであるか、対称行列に似ているかのように確認できます。これらのプロパティを保持することで、いくつかの繰り返しを保存できます。

2

方法はありますが、とは言いません。これは、安全でないポインタを使用してコピーします。 JSONを生成するとき(テスト)

int[,,] myArray = new int[2, 1000, 400]; 
int[,] myArray2 = new int[1000, 400]; 

var i = myArray.GetLength(1); 
var j = myArray.GetLength(2); 
var pageIndex = 0; 

unsafe 
{ 
    fixed (void* source = &myArray[pageIndex, 0, 0]) 
    fixed (void* dest = &myArray2[0, 0]) 
    { 
     CopyMemory((IntPtr)dest, (IntPtr)source, (uint)(i*j*sizeof(int))); 
    } 
} 


[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)] 
public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count); 

私はあなたがJSONを作成していることがわかり、この方法は、方法やり過ぎです。それをあなた自身であまりにも難しくしないでください。代わりにループを使用してください。

0

実際、私は常に1次元配列を好むでしょう。他のパフォーマンスはちょうどbadです。 他のすべては数学で行うことができ、3D、2D、さらには1Dでも簡単に切り替えるための独自のクラスを作成できます。

これはあなたが持っている問題を取り除き、余分な書き込みを少ししか必要としません。

関連する問題