2016-11-09 77 views
2

2次元の倍精度配列をEigen :: Matrixにマップすることが可能かどうか、またどのようにしてマップすることはできません。 double** pとして受け取った配列double d[][]をEigen :: Matrixにマップできますか?2次元配列をEigen :: Matrixにマップする

1次元配列は正常に機能しますが、pEigen::Map<Eigen::Matrix<double, n, n>>にマッピングできませんでした。それは可能なのですか?サイズnは実際には一定ではありませんが、ハードコードされたサイズを受け入れることができます。


私はいくつかのバージョンを試しましたが、うまくいきませんでした。私は次のことがうまくいくと思った(サイズnは4と仮定する)。

Eigen::Map<Eigen::Matrix<double, 4, 4>> p_OUTPUT(&p[0][0]); 

コードはコンパイルされ実行されますが、最初の列の要素と2番目の列の最初の要素のみが正しい値をマップします。引数としてp[0]を使用すると同じ結果が得られます。 私が試した他のバージョン(たとえば、&なし)はコンパイルされませんでした。

+0

はあなたがしようとしたものを表示し、あなたが達成したいことはできますか? 'n'はコンパイル時定数ですか?そして、あなたは 'p'が 'double **'ですか? –

+0

@AviGinsburgご返信ありがとうございます、私は私の質問を完了しました。サイズ 'n'は定数ではありませんが、ハードコードされたサイズはOKです。 そして、 'p [row] [col] + = ...'が機能するので、 'p'は' double ** 'です。 – AnBr

+0

[this](http://stackoverflow.com/a/33669013/2899559)の記事を参照してください。 –

答えて

3

完全性のために、私は解決策を見つけました。前述のように、hereまたはhereは、連続したメモリではない記憶域が問題です。

次の解決策が私に役立ちました。

Eigen::MatrixXd ConvertToEigenMatrix(std::vector<std::vector<double>> data) 
{ 
    Eigen::MatrixXd eMatrix(data.size(), data[0].size()); 
    for (int i = 0; i < data.size(); ++i) 
     eMatrix.row(i) = Eigen::VectorXd::Map(&data[i][0], data[0].size()); 
    return eMatrix; 
} 
0

あなた自身を与えた答えは手がかりのようなものです:

m(0,0) m(0,1) m(0,2) 
m(1,0) m(1,1) m(1,2) 
m(2,0) m(2,1) m(2,2) 

ビッグに格納されています。この行列の要素があることを意味し、固有値、列主要形式のデフォルト、店の行列によりますリニアアレイ:(あなたの答えから判断)

[m(0,0), m(1,0), m(2,0), m(0,1), m(1,1), m(2,1), m(0,2), m(1,2), m(2,2)] 

あなたのデータはあなたの配列からメモリの連続行を引き抜くと、あなたの結果の行にそれらを割り当てている理由である行優先形式です。あなたは、あなたのデータはRowMajor形式であることをMapを伝えることができ、そしてそれは正しくデータを読み込む必要があります。

Eigen::Map<Eigen::Matrix<double, 4, 4, Eigen::RowMajor>> p_OUTPUT(p); 
+0

いいえ、 'p'はメモリの連続したセクションを指していると仮定します。 'double ** 'は保証されません。 –

+0

元の質問によると、それは 'double []'であり、 'double ** 'として関数に渡されます。配列として宣言されている場合は、メモリ内で連続しています。 –