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

时间:2016-11-28 20:19:27

标签: c++ eigen stdvector

我的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);
    }
}

有更好的方法吗?

编辑:更好意味着更快;)

2 个答案:

答案 0 :(得分:3)

Roger's answer很好,但是如果你想利用矢量化,Eigen::Map不知道它是否对齐,因此没有矢量化。如果您需要,您需要对数据进行复制,而不仅仅是映射到它。

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

答案 1 :(得分:2)

如果您保证向量连续存储其元素,则最简单,最快速的方法如下:

std::vector<double> param;
//code//
.
.
.
//code//
double *v = &param[n];
Eigen::Map<Eigen::MatrixXd> matrix(v,n + n * n,1);

通过这种方式,可以重用param的内存。