2016-08-09 9 views
2

トランスフォームを適用する方法はありますか?Eigenのベクトルを含む行列に変換を適用する短い方法?

auto vecs = Matrix<float, Dynamic, 3>(); //vector in each row. 
Affine3f transform = ...; // some Affine3 transform 

for (int r = 0; r < vecs.rows(); r++) { 
    Vector3f v = vecs.row(r); 
    v = transform * v; 
    vecs.row(r) = v; 
} 
+0

短いとは、あなたのforループの3つの行を1つに凝縮するようなものですか? - 'vecs.row(r)* = transform'? –

+0

@JohnnyHenlyこれは 'vecs.row(r)= vecs.row(r)* transform;と同じですが、これは一般的には同等ではありません! – immibis

+0

Forループは、固有ベクトルのような行列ライブラリにとって非常に厄介です。私は、単一の関数呼び出しにforループを折りたたむいくつかのより良い機能が期待されます。 – JE42

答えて

1

@ JE42が正しい。というのも、Eigenではループがほとんど必要ないからである。 簡単にすることができます。ただし、あなたの場合のtransform * vは単純な乗算ではなく、transform.linear() * v + transform.translation()に相当するアフィン変換です。 https://eigen.tuxfamily.org/dox-devel/group__TutorialGeometry.html

また、「ポイント」は行であるため、追加のトランスポーズが必要です。要するに

、(実際にそれをコンパイルしたりテストなし)あなたの計算は

vecs.transpose() = (transform.linear() * vecs.transpose()).array() + transform.translation(); 
0

と同等でなければなりませんあなたは直接Affineが行列に保存された列ベクトルの集合に変換を適用することができます。あなたのベクトルは行単位で配列されているので、行列を転置する必要があります。あなたのforループは次のように短縮されます:

vecs.transpose() = transform * vecs.transpose(); 
関連する問題