2014-11-20 27 views
5

Có thể sử dụng cú pháp foreach của C++ 11 với ma trận Eigen không? Ví dụ, nếu tôi muốn để tính tổng của một ma trận (Tôi biết có một hàm dựng sẵn cho việc này, tôi chỉ muốn có một ví dụ đơn giản) Tôi muốn làm điều gì đó nhưVòng lặp foreach trên ma trận Eigen?

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

Tuy nhiên Eigen không dường như cho phép điều đó. Có một cách tự nhiên hơn để làm một vòng lặp foreach trên các yếu tố của một ma trận Eigen?

Trả lời

-1

Có thể lấy con trỏ tới mảng dữ liệu của ma trận bằng hàm thành viên .data().

Kích thước của mảng dữ liệu cũng có thể thu được bằng cách sử dụng hàm thành viên .size().

Sử dụng hai giá trị này, chúng tôi hiện có các con trỏ đến phần tử đầu tiên và kết thúc của mảng là a.data()a.data()+a.size().

Ngoài ra, chúng tôi biết rằng một std::vector có thể được khởi tạo bằng cách sử dụng trình vòng lặp (hoặc con trỏ mảng trong trường hợp của chúng tôi).

Vì vậy, chúng tôi có thể có được một véc tơ của các cặp đôi bao bọc các phần tử ma trận với std::vector<double>(a.data(), a.data()+a.size()).

vector này có thể được sử dụng với phạm vi dựa trên cú pháp vòng lặp được bao gồm trong đoạn mã của bạn như:

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

Điều này sẽ thực hiện một bản sao của ma trận, không lặp lại trên ma trận, có lẽ không phải là điều mà người hỏi muốn làm. – sordid

2

Phạm vi có trụ sở tại vòng cần các phương pháp .begin().end() được thực hiện trên kiểu đó , chúng không dành cho ma trận Eigen. Tuy nhiên, như một con trỏ cũng là một iterator truy cập ngẫu nhiên hợp lệ trong C++, các phương thức .data().data() + .size() có thể được sử dụng cho các hàm bắt đầu và kết thúc cho bất kỳ thuật toán STL nào.

Các vấn đề liên quan