Help us understand the problem. What is going on with this article?

Eigenを用いるときの注意(メンバ変数,STLコンテナ,値渡し)

More than 3 years have passed since last update.

行列/ベクトル演算ライブラリEigenのクラスの内,Eigen::Matrix4fEigen::Affine3fなどの特定のクラスを使用するとき,メモリの配置から生じる問題(公式ドキュメント)に関して,ほぼ公式サイトの要約です.

この問題はEigenのクラスでも特定のクラスにのみ生じる問題なので,該当しないクラスでは気にする必要はないですが,Eigen::Matrix4fEigen::Affine3fは座標変換などでEigenを使う場合にはよく利用するクラスかと思うで,注意が必要です.

具体的に,この問題が生じるのは,以下の場合です.
1. メンバ変数に用いる場合
2. STLコンテナに用いる場合
3. 関数に値渡しする場合

メンバ変数に用いる場合(公式ドキュメント)

メンバ関数で用いる場合には,publicでマクロを定義する.

class Foo
{
  ...
  Eigen::Vector2d v;
  ...
public:
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW // このマクロを追加.
  ...
};

STLコンテナに用いる場合(公式ドキュメント)

STLコンテナを用いる場合には,用意されたallocatorを使う.
例えばstd::vectorの場合には,次のようにする.

#include<Eigen/StdVector>
std::vector<Eigen::Vector4f> v; // こうではなく. 
std::vector<Eigen::Vector4f,Eigen::aligned_allocator<Eigen::Vector4f> > v; //こうする.

値渡しする場合(公式ドキュメント)

関数には,値渡しではなく参照を使う.そもそもC++なら参照を使っているはず...

void my_function(Eigen::Vector2d v); // 値渡しではなく,
void my_function(const Eigen::Vector2d& v); // 参照渡しで.
vs4sh
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした