2017-11-15 9 views
1

두 개의 행과 열인 Eigen::ArrayX3d 개체가 있습니다. 이를 구체적으로 표현하기 위해 첫 번째 배열은 N 개의 입자로 이루어진 3 차원 속도로 구성됩니다. 다른 하나는 각 입자의 위치에서 자기장 벡터로 구성됩니다. 로렌츠 힘을 계산하려고합니다. v x B - 이것은 행 쌍을 가져 와서 교차 제품을 계산해야한다는 것을 의미합니다. 파이썬에서는 단순히 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; 

단지 각 행의 오른쪽에 한 장소에서 1 년대를 이동해야 X B 작업의 성공적인 응용 프로그램입니다.

+0

'배열'은'.matrix()'를 사용하여 행렬이나 벡터로 볼 수 있습니다. 이렇게하면 교차 제품 기능에 액세스 할 수 있습니다. – ggael

+1

물론, 'v.matrix(). cross (B.matrix())'를 수행 할 수 없기 때문에 그다지 도움이되지 않습니다. 나는 이것을 "전체 배열"사이에서 행하려고하지는 않지만, 행 방향 (row-wise)이다. '.rowwise()'를 사용하여 엉망으로 만들려고했으나 제대로 작동하지 않았습니다. – Perfi

답변

1

I가 매트릭스 또는 어레이를 사용하여 결과를 얻을 수 갖추어

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