2017-11-15 4 views
1

2つのEigen::ArrayX3dオブジェクトがあります。これはN行と3列です。これを具体的にするために、第1のアレイは、N個の粒子の3d速度からなる。もう1つは、各粒子の位置における磁場ベクトルからなる。私はローレンツの力、v x Bを計算しようとしています - これは私が行の各ペアを取ってクロス製品を計算しなければならないことを意味します。 Pythonでは、単にnumpy.cross(v, B)を実行することを意味します。配列間の固有の列方向のクロス積

私はEigenでこれを行う方法を理解しようとしています。あたかもcrossMatrixVectorにのみ定義されているようですが、私のデータをMatrixとして保管することは実際には意味がありません。

この操作を実行するための合理的な方法はありますか?私はどんな指針にも非常に感謝しています。

このセットアップは良い例です::

ArrayX3d a(4,3); 
    ArrayX3d b(4,3); 
    a <<1,0,0, 
     0,1,0, 
     0,0,1, 
     1,0,0; 
    b <<0,1,0, 
     0,0,1, 
     1,0,0, 
     0,1,0; 

X bの操作だけで、各行の右側に1位で1つのをシフトすべきの適用が成功。

+0

'Array'は' .matrix() 'を使って行列やベクトルとして見ることができます。この方法で、クロス・プロダクト機能にアクセスできます。 – ggael

+1

確かに、v.matrix()。cross(B.matrix())はできないので、それは本当に役に立たない。私はこれを "配列全体の間"にしようとはしていませんが、行ごとに行います。私は '.rowwise()'を使いこなそうとしましたが、うまくいきませんでした。 – Perfi

答えて

1

私は行列や配列使用して結果を得ることができます。配列で

MatrixX3d a(4, 3); 
    MatrixX3d b(4, 3); 
    a << 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0; 
    b << 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0; 
    for(int i = 0; i < a.rows(); i++){ 
     cout << a.row(i).cross(b.row(i)) << endl; 
    } 

を:

出力は
ArrayX3d a(4, 3); 
    ArrayX3d b(4, 3); 
    a << 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0; 
    b << 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0; 
    for(int i = 0; i < a.rows(); i++){ 
     cout << a.row(i).matrix().cross(b.matrix().row(i)) << endl; 
    } 

0 0 1 
1 0 0 
0 1 0 
0 0 1 

この結果はに保存することができ行列または配列を作成します。

+1

これは唯一の方法です。ライブラリの限界のようなものだとは思いませんか? – Perfi

関連する問題