C++:如何将 std::vector 转换为 Eigen::MatrixXd?
C++: how to convert std::vector to Eigen::MatrixXd?
我的 std::vector<double> param
长度为 (n + n * n),我需要将最后 (n * n) 个元素移动到 MatrixXd。我是这样做的:
MatrixXd cov(n, n);
for(int i = 0 ; i < n ; ++i) {
for(int c = 0 ; c < n ; ++c) {
cov(i, c) = param(n + i * n + c);
}
}
有更好的方法吗?
编辑:更好意味着更快;)
如果保证vector的元素是连续存储的,最简单最快的方法是:
std::vector<double> param;
//code//
.
.
.
//code//
double *v = ¶m[n];
Eigen::Map<Eigen::MatrixXd> matrix(v,n + n * n,1);
这样就复用了param的内存
很好,除了如果你想使用矢量化,Eigen::Map
不知道它是否对齐,因此没有矢量化。如果需要,您需要制作数据的 副本 而不仅仅是映射到它。
Eigen::MatrixXd copiedMatrix = Eigen::Map<Eigen::MatrixXd>(¶m[n], n, n);
我的 std::vector<double> param
长度为 (n + n * n),我需要将最后 (n * n) 个元素移动到 MatrixXd。我是这样做的:
MatrixXd cov(n, n);
for(int i = 0 ; i < n ; ++i) {
for(int c = 0 ; c < n ; ++c) {
cov(i, c) = param(n + i * n + c);
}
}
有更好的方法吗?
编辑:更好意味着更快;)
如果保证vector的元素是连续存储的,最简单最快的方法是:
std::vector<double> param;
//code//
.
.
.
//code//
double *v = ¶m[n];
Eigen::Map<Eigen::MatrixXd> matrix(v,n + n * n,1);
这样就复用了param的内存
Eigen::Map
不知道它是否对齐,因此没有矢量化。如果需要,您需要制作数据的 副本 而不仅仅是映射到它。
Eigen::MatrixXd copiedMatrix = Eigen::Map<Eigen::MatrixXd>(¶m[n], n, n);