2014-11-20 11 views
5

Czy można użyć składni foreach C++ 11 z macierzami Eigen? Na przykład, jeśli chciałem obliczyć sumę macierzy (wiem nie ma wbudowaną funkcję do tego, chciałem tylko prosty przykład) Chciałbym zrobić coś takiegoPętla Foreach nad macierzami Eigen?

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

Jednak nie Eigen wydaje się na to pozwalać. Czy istnieje bardziej naturalny sposób wykonywania pętli foreach nad elementami macierzy Eigen?

Odpowiedz

-1

Wskaźnik do macierzy danych macierzy można uzyskać za pomocą funkcji składowej .data().

Rozmiar tablicy danych można również uzyskać za pomocą funkcji składowej .size().

Używając tych dwóch, mamy teraz wskaźniki do pierwszego elementu i końca tablicy jako a.data() i a.data()+a.size().

Wiemy również, że std::vector można zainicjować za pomocą iteratorów (lub wskaźników tablicowych w naszym przypadku).

W ten sposób możemy uzyskać wektor podwójnych elementów, które owijają elementy matrycy za pomocą std::vector<double>(a.data(), a.data()+a.size()).

Wektor ten może być używany z zakresu oparte na składni pętli, która jest zawarta w fragmencie kodu jako:

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

Spowoduje to wykonanie kopii macierzy, a nie iteracyjne nad samą macierzą, prawdopodobnie nie jest to coś, co osoba pytająca chce zrobić. – sordid

2

Zakres oparte na pętle muszą metody .begin() i .end() być realizowane na tego typu , które nie są dla matryc Eigen. Jednakże, ponieważ wskaźnik jest również poprawnym iteratorem dostępu losowego w C++, metody mogą być używane dla funkcji początkowej i końcowej dla dowolnego z algorytmów STL.