2012-08-17 27 views
6

Tôi muốn ánh xạ một mảng gấp đôi với cấu trúc MatrixXd hiện có. Cho đến nay tôi đã quản lý để ánh xạ ma trận Eigen thành một mảng đơn giản, nhưng tôi không thể tìm ra cách để làm nó trở lại.Lập bản đồ mảng trở lại ma trận Eigen hiện có

void foo(MatrixXd matrix, int n){ 

double arrayd = new double[n*n]; 
// map the input matrix to an array 
Map<MatrixXd>(arrayd, n, n) = matrix; 

    //do something with the array 
      ....... 
// map array back to the existing matrix 

} 
+1

Chức năng Bản đồ <> này là gì? Bạn có thể hiển thị nó? –

+0

Đó là tất cả những gì tôi biết http://eigen.tuxfamily.org/dox/TutorialMapClass.html – Manolete

Trả lời

13

Tôi không chắc chắn bạn muốn gì, nhưng tôi sẽ cố gắng giải thích.

Bạn đang trộn đôi và nổi trong mã của bạn (một MatrixXf là một ma trận mà mỗi mục nhập là một phao). Tôi sẽ giả định cho thời điểm này là vô tình amd rằng bạn muốn sử dụng gấp đôi ở khắp mọi nơi; xem bên dưới nếu đây thực sự là ý định của bạn.

Hướng dẫn Map<MatrixXd>(arrayd, n, n) = matrix sao chép các mục nhập của matrix vào arrayd. Nó tương đương với vòng lặp

for (int i = 0; i < n; ++i) 
    for (int j = 0; j < n; ++j) 
     arrayd[i + j*n] = matrix(i, j); 

Để sao chép các mục của arrayd vào matrix, bạn sẽ sử dụng sự phân nghịch đảo: matrix = Map<MatrixXd>(arrayd, n, n).

Tuy nhiên, thường các kỹ thuật sau đây là hữu ích hơn:

void foo(MatrixXd matrix, int n) { 
    double* arrayd = matrix.data(); 
    // do something with the array 
} 

điểm Bây giờ arrayd các mục nhập trong ma trận và bạn có thể xử lý nó như bất kỳ ++ mảng C. Dữ liệu được chia sẻ giữa matrixarrayd, do đó bạn không phải sao chép bất kỳ nội dung nào vào cuối. Ngẫu nhiên, bạn không cần phải vượt qua n đến chức năng foo(), bởi vì nó được lưu trữ trong ma trận; sử dụng matrix.rows() và matrix.cols() để truy vấn giá trị của nó.

Nếu bạn muốn sao chép một MatrixXf thành một mảng đôi, thì bạn cần bao gồm diễn viên một cách rõ ràng. Cú pháp trong Eigen cho điều này là: Map<MatrixXd>(arrayd, n, n) = matrix.cast<double>().

+0

xin lỗi về sự nhầm lẫn với phao và đôi. Đã cập nhật! – Manolete

+0

Đó là một lời giải thích rất tốt. Điều gì sẽ xảy ra nếu dữ liệu hoàn toàn mới được sao chép vào arrayd? Dữ liệu này có được chia sẻ trong ma trận không? Ý tưởng là gửi arrayd tới GPU, thực hiện tính toán và quay lại CPU có dữ liệu vào MatrixXd – Manolete

+0

@Manolete Có, điều đó sẽ hoạt động –

8

Bạn không cần thực hiện bất kỳ thao tác ngược nào.

Khi sử dụng Eigen :: Ánh xạ bạn ánh xạ một mảng thô đến một lớp Eigen. Điều này có nghĩa là bây giờ bạn có thể đọc hoặc viết nó bằng các hàm Eighen.

Trong trường hợp bạn sửa đổi mảng được ánh xạ, các thay đổi đã có sẵn. Bạn chỉ có thể truy cập vào mảng ban đầu.

float buffer[16]; //a raw array of float 

//let's map the array using an Eigen matrix 
Eigen::Map<Eigen::Matrix4f> eigenMatrix(buffer); 

//do something on the matrix 
eigenMatrix = Eigen::Matrix4f::Identity(); 


//now buffer will contain the following values 
//buffer = [1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1] 
Các vấn đề liên quan