2016-08-09 1 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 루프의 세 줄을 하나로 줄이는 것과 같은 것을 의미합니까? -'vecs.row (r) * = 변형'? –

+0

@JohnnyHenly 그것은 'vecs.row (r) = vecs.row (r) * transform;'과 동일 합니다만, 일반적으로 이에 해당하지 않습니다! – immibis

+0

For 루프는 eigen과 같은 행렬 라이브러리에 대해 매우 불투명하게 보입니다. for 루프를 단일 함수 호출로 축소하는 좀 더 깔끔한 함수가있을 것으로 기대합니다. – JE42

답변

1

@ JE42가 맞습니다. Eigen에서는 루프가 거의 필요하지 않습니다. 확실히 단순화하는 것이 가능합니다. 그러나 귀하의 경우에 transform * v은 간단한 곱셈이 아니라 transform.linear() * v + transform.translation()에 해당하는 아핀 변환입니다. https://eigen.tuxfamily.org/dox-devel/group__TutorialGeometry.html

또한 "포인트"는 행이므로 추가적인 전치가 필요합니다. 하여 계산하면이 직접 Affine 매트릭스에 저장된 열 벡터의 세트에 변환을 적용 할 수

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

동등한다 (실제로는 컴파일 또는 테스트)없이 요컨대

. 벡터는 행 단위로 정렬되므로 행렬을 조 변경해야합니다. for-loop는 다음과 같이 감소합니다 :

vecs.transpose() = transform * vecs.transpose();