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 matrix
và arrayd
, 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>()
.
Nguồn
2012-08-17 14:33:37
Chức năng Bản đồ <> này là gì? Bạn có thể hiển thị nó? –
Đó là tất cả những gì tôi biết http://eigen.tuxfamily.org/dox/TutorialMapClass.html – Manolete