如何将 std::vector<std::pair<double, double>> dataVector 转换为 Eigen::MatrixXd rtData(dataVector.size(), 2)

How to convert std::vector<std::pair<double, double>> dataVector to Eigen::MatrixXd rtData(dataVector.size(), 2)

下面有没有快速转换的方法?

使用“std::vector> dataVector”来初始化“Eigen::MatrixXd rtData(dataVector.size(), 2)”

我假设您希望根据堆叠在向量中的一堆对创建一个两列矩阵。

据我在文档中所见,MatrixXdMatrix<double,dynamic,dynamic> 的 typedef,因此第一个潜在问题是您希望用 int 值填充 double 矩阵。

由于 MatrixXd 只是一个 typedef,我认为 Eigen 库中没有合适的构造函数供您进行快速转换。

只需编写一个代码或一个函数来遍历您的向量并填充矩阵。在 C++14 中:

int itt=0;
for (const auto& [first, second] : dataVector)
{
   rtData(itt,0) = first;
   rtData(itt,1) = second;
   itt++;
}

这是一个简洁的 for 循环,可以遍历对向量,您仍然需要元素的索引,因为特征矩阵没有像 STL 那样的 push_back 方法。 再次注意,如果您用整数而不是双精度填充它,我会建议 MatrixXi

假设 sizeof(std::pair<int,int>) == 2*sizeof(int)(即 std::pair 未添加任何填充)您可以使用 row-major 整数矩阵的 Eigen::Map,然后将其转换为 double。像这样:

typedef Eigen::Matrix<int, Eigen::Dynamic, 2, Eigen::RowMajor> MatrixX2i_r;
Eigen::MatrixXd rtData
    = Eigen::Map<MatrixX2i_r const>(&(dataVector[0].first), dataVector.size(), 2).cast<double>();

您也可以直接使用该表达式而不将其存储到 MatrixXd 中(每次使用该表达式时都会即时进行转换——所以如果您多次使用 rtData,存储一次可能会更好。