2017-06-06 3 views
4

柔軟性のために、C++ライブラリEigenを使用してデータを動的サイズの行列(例:Eigen::MatrixXf)に読み込みます。私はパラメータとして混合または固定サイズの行列を必要とするいくつかの関数を書いています(例えば、Eigen::Matrix<float, 3, Eigen::Dynamic>またはEigen::Matrix4f)。行と列のサイズに対して適切なアサーションを行うと仮定すると、動的行列(実行時に設定されるサイズ)を固定行列(コンパイル時に設定されるサイズ)に変換するにはどうすればよいですか?動的行列をEigenの固定行列にキャスト

私は考えることができる唯一の解決策は、例えば、それをマップすることです:

Eigen::MatrixXf dyn = Eigen::MatrixXf::Random(3, 100); 
Eigen::Matrix<float, 3, Eigen::Dynamic> fixed = 
    Eigen::Map<float, 3, Eigen::Dynamic>(dyn.data(), 3, dyn.cols()); 

しかし、それはどちらか動作する場合は、固定サイズのマップコンストラクタはのように行と列を受け付けないので、それは私には不明ですパラメータはthe docsです。より良い解決策はありますか?ダイナミック - 固定サイズの行列を代入するだけでは機能しません。例えば、

+1

柔軟性のために動的サイズを使用し、固定サイズにキャストして関数を呼び出すと、矛盾のように聞こえる。あなたは本当に入力が動的なサイズである必要がありますか?私はどういうわけかあなたの関数が特定のサイズを期待しているようだ... – user463035818

+0

@ tobi303:理由は、私はデータの異なるコレクションのために同じローダー関数を使用しているということです。次に、私がロードしたデータに応じて、混合型または固定サイズのパラメータを必要とする処理関数を呼び出します(typedefのため) – marcman

+0

はい、これはうまくいくはずです。最近のバージョン(少なくとも3.2.9から)では、 'Eigen :: Map'を使わなくてもできるはずです。 – m7913d

答えて

5

あなたはそれがあなたのケースでの使用ですが、その目的のためにRefを使用することができますが、単純である、そしてそれはあなたのためのランタイムアサーションチェックを行います。

MatrixXf A_dyn(4,4); 
Ref<Matrix4f> A_fixed(A_dyn); 

あなたも、固定された外側-ストライドが必要になることがありますし、整列メモリ:この場合

Ref<Matrix4f,Aligned16,OuterStride<4> > A_fixed(A_dyn); 

A_fixedは本当にMatrix4fのようなものです。

関連する問題