2014-11-20 3 views
5

Eigen 행렬과 함께 C++ 11의 foreach 구문을 사용할 수 있습니까? 내가 매트릭스 (난 그냥 간단한 예를 원, 이것에 대한 내장 함수가 알고)의 합을 계산하려는 경우 예를 들어, 나는 그러나 아이겐하지 않습니다고유 행렬에 대한 Foreach 루프?

Matrix2d a; 
a << 1, 2, 
    3, 4; 
double sum = 0.0; 
for(double d : a) { 
    sum += d; 
} 

같은 일을하고 싶습니다 그것을 허용하는 것 같습니다. Eigen 행렬 요소에 대해 foreach 루프를 수행하는보다 자연스러운 방법이 있습니까?

답변

-1

행렬의 데이터 배열에 대한 포인터는 멤버 함수 .data()을 사용하여 얻을 수 있습니다.

데이터 배열의 크기는 멤버 함수 .size()을 사용하여 얻을 수도 있습니다.

이 두 가지를 사용하여 배열의 첫 번째 요소와 끝 부분에 대한 포인터를 a.data()a.data()+a.size()으로 지정합니다.

또한 우리는 std::vector이 이터레이터 (이 경우에는 배열 포인터)를 사용하여 초기화 될 수 있음을 알고 있습니다.

따라서, std::vector<double>(a.data(), a.data()+a.size())으로 행렬 요소를 래핑하는 복소의 벡터를 얻을 수 있습니다.

이 벡터는 함께 사용할 수있는 범위를 기반으로 사용자의 코드에 포함되어 루프 구문 : 루프 방법 .begin().end() 그 유형에 구현 될 필요가에 대한 범위가 기반

Matrix2d a; 
    a << 1, 2, 
     3, 4; 
    double sum = 0.0; 
    for(double d : std::vector<double>(a.data(), a.data()+a.size())) { 
     sum += d; 
    } 
+1

이것은 매트릭스의 사본을 수행하며, 매트릭스 자체를 반복하지는 않습니다. 아마도 묻는 사람이 원하는 것은 아닙니다. – sordid

2

, 그들은 Eigen 행렬이 아닙니다. 그러나 포인터가 C++의 유효한 임의 액세스 반복기이기 때문에 .data().data() + .size() 메서드는 STL 알고리즘의 시작 및 종료 함수로 사용할 수 있습니다.