gpt4 book ai didi

c++ - 将 `Eigen::VectorXd` 的集合合并为一个大的 `Eigen::VectorXd`

转载 作者:行者123 更新时间:2023-11-28 04:55:58 25 4
gpt4 key购买 nike

如果你去this Eigen page ,你会看到你可以初始化 VectorXd带有 << 的对象运算符(operator)。您还可以将一些 vector 对象转储到一个大的 VectorXd 中。对象(例如,查看“逗号初始值设定项”一节中的第三个示例)。

我想将几个 vector 转储到一个大 vector 中,但我很难编写适用于任意大小的 vector 集合的代码。以下行不通,我很难以行之有效的方式编写它(这不是双 for 循环)。有什么建议吗?

#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;
}

最佳答案

逗号初始值设定项不是那样工作的。您必须从中完全初始化矩阵。相反,分配一个足够大的 vector 并迭代和分配 block 。

#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";
}

关于c++ - 将 `Eigen::VectorXd` 的集合合并为一个大的 `Eigen::VectorXd`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47127412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com