2017-07-21 48 views
1

私のソースデータは2次元配列(double[,])の3dポイントの 'cnt'の数であるのに対し、1d配列(double[])を引数とする関数があります。2次元配列から1次元配列へのC#参照

double[,] points = new double[3,cnt] 

は、しかし、私は実際にやってみたいことは好ましく[i]の値によって、[i]の配列値の内容をコピーすることなく、機能gpu.Average(double[] arg)に3つの第二薄暗いアレイの各々に渡すことです。それはC#で可能ですか?

のコード例

これは動作します:

double[] points1d = new double[cnt]; 
// ... fill points1d with data, then 
double a = gpu.Average(points1d); // <- Alea.gpu.Average() accepts a 1d array 

でも言ったように、私は、関数gpu.Average(に二次元に渡したい)、三ループのために実行する必要がwhithout 1D配列にコピーする回:

double[,] points2d = new double[3,cnt]; 
// ... fill points2d with 'cnt' items of data and 
// then pass it on 

double x = gpu.Average(points2d[0,??]); // How to pass on 2nd dim? 
double y = gpu.Average(points2d[1,??]);  
double z = gpu.Average(points2d[2,??]);  

は1D配列にデータをコピーすることなく、可能なこのですか?

(計算平均はgpu並列ライブラリの良い例ではありません。異なるデータ型の実行時間を比較した単なるテストケースです)&構造体。

//ロルフ

+2

いいえ、2d配列( '[、]')の代わりにネストされた配列( '[] []')を使用するとできます。 – Blorgbeard

+0

Hm。ネストされた配列は動的な長さで割り当てることができますか? 私は 'double [3] [someList.Count]'を考えています。 – RIL

+0

あなたが非常に運が良ければ、メソッドは配列の代わりにdouble *をとるオーバーロードを持つでしょう。それから、あなたはこれを行うことができます。 – hoodaticus

答えて

2

ありません、これは例えばの内容をコピーせずにマネージコードでは不可能ですpoints2d[1,*]を新しい一次元配列に変換する。

管理されたコードでは、すべての配列がその長さを知る必要があるため、すべてのインデックスアクセスをチェックでき、インデックスが範囲外の場合はArrayIndexOutOfBounds例外がスローされます。長さ(整数値)は、配列の最初の要素の前に格納されているため、ランタイムはその配列を見つける場所を認識します。これで、なぜ配列を複数の部分に分割し、それらを新しい配列として扱うことができないのかが分かります。ジャグ配列を使用することですあなたが何ができるか

...物語はさらに複雑次元数と各次元のサイズを格納する必要が多次元配列のためであることに注意してください:

double[][] points2d = new double[3][]; 
points2[0] = new double[cnt]; 
... 
gpu.Average(points2d[0]); 

ジグザグ配列は多次元配列より高速であり、多次元配列even by MSの代わりに使用することをお勧めします。

+0

+1マネージドコードを使用していますが、必要なコードは残酷であり、シナリオが実行されている間にGCが発生するとひどくクラッシュします。もちろん、あなたはGCを防ぐことができますが、それは心の弱いものではありません。 – hoodaticus

+1

多次元配列よりもジグザグ配列が推奨されているというMSリファレンスにリンクできますか? – Blorgbeard

+0

残念ながら、そのコードはコンパイルされません。編集:私は 'double [] [] points2d = new double [3] [];でテストします。 bb – RIL