2012-01-25 9 views
1

2次元の図形をポイントのベクトルであるかのようにやりとりできるような方法で表現したい、とくに私は呼び出したいオペレータ[]at()があり、2D点のように動作するものへの参照が返されます。現在、私はちょうどメンバ変数が点のベクトルであり、その要素上にポイントワイズに定義されたさまざまな算術演算と幾何学演算を持つクラスを使用しています。Eigen :: Vectorを点のベクトルのようにする

しかし、私のコードの他の部分では、2n次元空間の要素としてn点のベクトルを扱い、その上で基本線形代数を実行する必要があります(例えば、ベクトルをR^2nの部分空間に投影する)。現在私はEigen::VectorXdオブジェクトを作成していますが、これを実行してから、これらの操作を実行した後で変換しています。私はこれをやりたくはありません。私は変換を頻繁にして、すべてのコピーが顕著な非効率性の源泉であるようにします。

データをdouble/float/intのフラットな配列として格納していた場合、そのn番目の要素へのポインタをPointへのポインタにキャストできます(メンバはdouble/floats/intのペアになります)。 )。しかし、Eigenがベクトルに使用する内部表現はわからないので(それはうまく変わる可能性があります)、これは不可能です。

これを解決するには賢明な方法がありますか?私はちょうどEigen::Vectorをどこでも使うことができますが、私は本当にコードの大部分がポイントのセットを扱っていることをふりまとめたいと思っています。

答えて

2

しかし、エイゲンがベクトルに使用する内部表現はわかりません(それはうまく変わる可能性があります)。これは不可能です。

Eigenは、プレーンアレイをEigen構造にマッピングできるようにするMapクラスを提供します。例:

double numbers[2]; 
Eigen::Vector2f::Map(numbers).dot(Eigen::Vector2f::Constant(1)); 
+0

ありがとうございます。他の方向では、稠密なマトリックスのデータは連続していることが保証されていますか?すなわち、マット .data()がTsの配列へのポインタを返すと仮定するのは安全でしょうか? – theotherphil

+0

@ user967771:私はそう思う(「密行列」の定義によって)、しかし証拠はない。 'PlainObjectBase'の' data'メンバーは、連続した格納がなければ意味をなさないでしょう。 – thiton

+0

それはそうです。ありがとう。 – theotherphil

関連する問題