2016-04-23 14 views
1

行列計算のためにMathNet.Numericsパッケージを使用しています。次のように2D配列 - 入れ子配列の初期化が必要です。 C#

マトリックス宣言および初期化に期待されるコードである: - xPointsSquared、 yPoints、

1自分自身のコードで
Matrix<double> A = DenseMatrix.OfArray(new double[,] { 
     {1,1,1,1}, 
     {1,2,3,4}, 
     {4,3,2,1}}); 

、Iは、3つの1次元アレイを有します。

私はエラーを取得する - 「ネストされた配列初期化子が期待されている」この次のように行列を初期化しようとすると、

Matrix<double> A = DenseMatrix.OfArray(new double[,] { 
     xPointsSquared, 
     yPoints, 
     one}); 

答えて

1

私は、たとえば、代わりに、より適切な構築機能を使用することをお勧めしたい:

Matrix<double> A = CreateMatrix.DenseOfRowArrays(xPointsSquared, yPoints, one); 

は、より多くの選択肢のためのドキュメントでCreating Matrices and Vectorsを参照してください。

+0

行列が3660x3次元の場合、DenseOfColumnArraysである必要はありませんか? – DazedNConfused

+0

はい、配列が行ではなく列を表す場合、DenseOfColumnArraysはそのジョブを行います。 –

1

2次元配列は、ネストされた配列初期化子で初期化する必要があります。また、ジグザグ配列double [] []の初期化では同じではありません。 2番目のケースで行うことは、ジグザグ配列を初期化するためであり、2D配列を初期化するためではありません。 3次元配列で2次元配列を初期化する場合は、配列要素を1つずつ挿入する必要があります。

Matrix<double> A = DenseMatrix.OfArray(new double[,] { 
    { xPointsSquared[0], xPointsSquared[1], xPointsSquared[2], xPointsSquared[3] }, 

    {yPoints[0], yPoints[1], yPoints[2], yPoints[3],}, 
    {one[0],one[1],one[2],one[3]}}); 

あなたのケースのための私の提案は、Matrixクラスのコンストラクタのための入力として、[、]最初の二重を使用する前に、[、]倍増する要素を挿入するためにforループを作ることです。

double[,] mat = new double[3,3600]; 
for(int i = 0; i < 3600;++i{ 
    mat[0,i] = xPointsSquared[i]; 
    mat[1,i] = yPoints[i]; 
    mat[2,i] = one[i]; 
} 

Matrix<double> A = DenseMatrix.OfArray(mat); 
+0

Ah!それで周りには道はありませんか?私は各配列に3600の要素を持っているからです。 – DazedNConfused

+0

forループを使用して要素を挿入してdouble [、]を入力してから、double [、]をマトリックスとして入力して – Ian

+0

Answerを更新することができます。 – Ian