C++:如何将std :: vector转换为Eigen :: MatrixXd?

4

我有一个长度为 (n + n * n) 的 std::vector<double> param,我需要将最后的 (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);
    }
}

有更好的方法吗?
编辑:更好的意思是更快 ;)

你可以使用Map。https://eigen.tuxfamily.org/dox/group__TutorialMapClass.html - Amin Ya
2个回答

7

Roger的回答很好,但是如果你想利用向量化,Eigen::Map不知道它是否对齐,因此不能进行向量化。如果你想要向量化,你需要复制数据而不仅仅是映射到它。

Eigen::MatrixXd copiedMatrix = Eigen::Map<Eigen::MatrixXd>(&param[n], n, n);

3
如果您保证向量存储其元素是连续的,最简单和最快的方法如下所示:
std::vector<double> param;
//code//
.
.
.
//code//
double *v = &param[n];
Eigen::Map<Eigen::MatrixXd> matrix(v,n + n * n,1);

以此方式重复利用param的内存。

4
std::向量始终将其元素连续存储在内存中。 - Jonas
谢谢!它可以工作,但实际上应该是: double *v = &param(n); Eigen::Map<Eigen::MatrixXd> matrix(v, n, n); - Poia
只有..[n]..在Mac上能正常工作。我不知道为什么。double *v = &param[n]; Eigen::MapEigen::MatrixXd matrix(v, n, n); - Wc Chang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接