2017-03-13 15 views
3

私は、12要素の配列を3つの値に関連付けるプログラムをC#で作成しています。次元[n、m、p]の行列にデータを格納したいが、各要素は実際には配列である。現実世界のアプリケーションは、3Dデカルト空間内の各点について12個のセンサの出力を節約しています。C#配列の配列

私はこのような何か試してみました:私が正しい場合、私は12の要素アレイのNxMxP行列を希望しながら、

int[][,,] foo = new int[12][,,]; 

しかし、これを、12の行列の3×3の配列を作成します。

私はこのような行列の次元を指定しようとした場合:

int[][,,] foo = new int[12][N,M,P]; 

私はエラーCS0178Invalid rank specifier: expected ',' or ']')とCS1586Array creation must have array size or array initializer)を取得します。

私はまだC#を学んでいますが、些細な質問のために私を許してください。しかし、私はこれを回避することはできません。私はビジュアルスタジオ2015を使用しています。

答えて

5

あなたは12インスタンスが配列として組織[N, M, P]行列の(、int[][,,]は配列のではなく、行列は行列の配列であることを何卒ご了承下さい)作成したい場合:

int[][,,] foo = Enumerable 
    .Range(0, 12) 
    .Select(_ => new int[N, M, P]) 
    .ToArray(); 

int[][,,] foo = Enumerable 
    .Repeat(new int[N, M, P], 12) 
    .ToArray(); 

ループを好む場合は

// please, notice the different declaration: 
int[][,,] foo = new int[12]; 

for (int i = 0; i < foo.Length; ++i) 
    foo[i] = new int[N, M, P]; 

編集:アレイの[N, M, P]マトリックス(コメントを参照してください)したい場合:

を私は Nによってアドレス指定、12要素アレイのNMPインスタンスを取得しようとしています、M、Pインデックス

// please, notice the different declaration: matrix of arrays 
    int[,,][] foo = new int[N, M, P][]; 

    for (int i = 0; i < foo.GetLength(0); ++i) 
    for (int j = 0; j < foo.GetLength(1); ++j) 
     for (int k = 0; k < foo.GetLength(2); ++k) 
     foo[i, j, k] = new int[12]; 
+0

答えをありがとうが、これは私が達成しようとしているものではありません。 n、m、pのインデックスでアドレス可能な12要素配列のN * M * Pインスタンスを取得しようとしていると言えます。これが私が探しているものを明確にしてくれることを願っています。 –

+0

@Marcomattia Mocellin:あなたは宣言を変更しなければなりません、編集を参照してください。 –

5

4次元配列を使用してみてください。

int[,,,] foo = new int[N,M,P, 12]; 
+1

一つの可能​​solutiomですが、どのように醜い多次元配列C#で与えられ、私は特に一つに別の次元を追加したくないだろう。特に、ユーザーが3x3マトリックスをある機能または別の機能に渡すことができる必要がある場合。そうであれば、4x4マトリックスから3x3マトリックスを彫刻することは本当の苦痛になるかもしれません。 –

+0

これは15要素の配列のリストに似ていませんか?この非常に簡単な解決法では、例えば、次のような最初の三つ組の4番目の要素: int bar = foo [0,0,0,3]? –

1
int[][,,] foo 

3次元配列(intの配列)を作成しています。あなたがその配列を初期化したいなら、あなたはこれを行う必要があります:fooを通って、各セルの

int[][,,] foo = new int[12][,,]; 

そしてループは3-Dの配列を初期化:

foo[i] = new int[M,N,P]; 

あなたは、いくつかのLINQを使用することができますそれを1ライナーにする(ドミトリーの答えを参照)が、基本的に同じことになる。

C#の多次元配列は、使用するのに苦労します。

0

私はそれがあなたに役立つかどうかは分かりません(多分あなただけの配列が必要です)が、あなたは単純なPoint3Dクラスを作成しようとすることができます。これにより、読みやすさが向上し、maintananceが向上します。

public class Point3D 
{ 
    int X { get; set; } 
    int Y { get; set; } 
    int Z { get; set; } 

    public Point3D(int x, int y, int z) 
    { 
     this.X = x; 
     this.Y = y; 
     this.Z = z; 
    } 
} 

そして:

Point3D[] arrayOfPoints = new Point3D[12]; 
arrayOfPoints[0] = new Point3D(0, 2, 4); 
+0

あなたよりも、x、y、z座標を取得/設定する必要はありません.12要素配列を空間のax、y、z点に関連付ける必要があります。x、y、理論的には合理的でなければならないので、指標としてのy、zの値(それはティックとして表現されます。すなわち、X = 255はXが255 *ティックmmであることを意味します) –