将`Eigen :: VectorXd'的集合合并为一个大的`Eigen :: VectorXd`

时间:2017-11-05 22:39:18

标签: c++ eigen

如果您转到this Eigen page,您会看到可以使用VectorXd运算符初始化<<个对象。您还可以将一些矢量对象转储到一个大的VectorXd对象中(例如,查看“逗号初始化程序”一节中的第三个示例)。

我想将一些向量转储到一个大向量中,但是我很难编写适用于任意大小的向量集合的代码。以下不起作用,我很难以一种方式编写它(这不是一个双循环)。有什么建议吗?

#include <iostream>
#include <Eigen/Dense>
#include <vector>

int main(int argc, char **argv)
{
    // make some random VectorXds
    std::vector<Eigen::VectorXd> vOfV;
    Eigen::VectorXd first(3);
    Eigen::VectorXd second(4);
    first << 1,2,3;
    second << 4,5,6,7;
    vOfV.push_back(first);
    vOfV.push_back(second);

    // here is the problem
    Eigen::VectorXd flattened(7);
    for(int i = 0; i < vOfV.size(); ++i)
        flattened << vOfV[i];

    //shows that this doesn't work
    for(int i = 0; i < 7; ++i)
        std::cout << flattened(i) << "\n";

    return 0;
}

1 个答案:

答案 0 :(得分:1)

逗号初始值设定项不起作用。你必须从那里完全初始化矩阵。相反,分配足够大的向量并迭代并分配块。

#include <iostream>
#include <vector>

#include <Eigen/Dense>

// http://eigen.tuxfamily.org/dox/group__TopicStlContainers.html
#include <Eigen/StdVector>
EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::VectorXd)

int main()
{
    // make some random VectorXds
    std::vector<Eigen::VectorXd> vOfV;
    Eigen::VectorXd first(3);
    Eigen::VectorXd second(4);
    first << 1,2,3;
    second << 4,5,6,7;
    vOfV.push_back(first);
    vOfV.push_back(second);

    int len = 0;
    for (auto const &v : vOfV)
        len += v.size();

    Eigen::VectorXd flattened(len);

    int offset = 0;
    for (auto const &v : vOfV)
    {
        flattened.middleRows(offset,v.size()) = v;
        offset += v.size();
    }

    std::cout << flattened << "\n";
}