如何将 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)”
我假设您希望根据堆叠在向量中的一堆对创建一个两列矩阵。
据我在文档中所见,MatrixXd
是 Matrix<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
,存储一次可能会更好。
下面有没有快速转换的方法?
使用“std::vector
我假设您希望根据堆叠在向量中的一堆对创建一个两列矩阵。
据我在文档中所见,MatrixXd
是 Matrix<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
,存储一次可能会更好。