2016-08-03 3 views
1

저는 Eigen의 초보자입니다. 제가하고있는 것은 행렬에서 다른 행을 추출하고 계산을하는 것입니다. 이Eigen의 행렬에서 벡터를 추출하는 올바른 방법은 무엇입니까?

MatrixXd mat(5, 10); 
VectorXd vec1 = mat.row(1); 
VectorXd vec2 = mat.row(2); 
// do some calculation with vec1 and vec2 

그래서 문제는, VectorXd vec = mat.row(1)처럼 수행하여, 성능에 좋지 수 있습니다 메모리 할당/메모리 복사있다처럼

코드가 보인다. 계산을 위해서만 사용하고 있으므로 밑에있는 행렬을 전혀 변경하지 않으므로 더 좋은 방법이 있습니까?

Eigen::Block을 사용해 보았지만 Block은 일부 매트릭스 연산을 지원하지 않습니다 (확실하지 않습니다).

답변

2

.row() 자체는 성능에 전혀 나쁜 것은 아니며 Eigen의 블록 표현식 중 하나입니다.

블록 표현식은 rvalues와 lvalues ​​둘 다로 사용할 수 있습니다. Eigen 표현식이있는 과 같이이 추상화는 컴파일러를 최적화 할 수 있도록 제공하면 런타임 시간이 인 제로입니다.

계산식을 표현식으로 공식화하면 컴파일러에서 모든 유형의 최적화를 수행 할 수 있습니다. 당신은 아이겐을 최적화 할 수 있습니다 컴파일 타임에 충분한 정보를 제공,이와

mat.row(2) = 2 * mat.row(0) + mat.row(1); 
float x = (mat.row(0) - mat.row(1)).squaredNorm(); 

: 여기

은 몇 가지 예입니다.

Eigen::Block의 의미를 모르면 가장 일반적인 용도는 행렬 .block()이어야합니다. https://eigen.tuxfamily.org/dox/group__TutorialBlockOperations.html

관련 문제