我想知道如何将
std::vector<double>
转换为 std::vector<Eigen:Vector3d>
。上下文是我正在从一个 HDF5 文件中读取点云数据(x,y,z 点),该文件已被展平为一维数组,进入 std::vector<double>
,所以 std::vector<double>
总是有 nx3 个点。
我正在使用 libeigen3-dev (3.3.7)。
之前,我将 h5 文件中的数据读入
std::vector<double>
,然后使用 Eigen::Map
转换为 Eigen::VectorXd
,如下所示:
Eigen::VectorXd readH5Data(H5::DataSet &dataset, H5::VarLenType memType, H5::DataSpace &dataspace, H5::DataSpace &memspace, int index) {
// Initialize hyperslabs
hsize_t dataCount[1];
hsize_t dataOffset[1];
hsize_t memCount[1];
hsize_t memOffset[1];
// Select hyperslabs
dataCount[0] = 1;
dataOffset[0] = index;
memCount[0] = 1;
memOffset[0] = 0;
dataspace.selectHyperslab(H5S_SELECT_SET, dataCount, dataOffset);
memspace.selectHyperslab(H5S_SELECT_SET, memCount, memOffset);
// Read out the data as std::vector<double>
std::vector<hvl_t> varlenSpecs(1);
dataset.read(varlenSpecs.data(), memType, memspace, dataspace);
auto dataPtr = static_cast<double*>(varlenSpecs[0].p);
std::vector<double> readOut(dataPtr, dataPtr + varlenSpecs[0].len);
H5free_memory(varlenSpecs[0].p);
// Convert std::vector<double> to Eigen::VectorXd
double* ptr = &readOut[0];
Eigen::Map<Eigen::VectorXd> dataOut(ptr, readOut.size());
return dataOut;
}
然后我可以将 1d
Eigen::VectorXd
转换为 nx3 Eigen::MatrixXd
,如下所示,并进行任何额外处理:
Eigen::VectorXd points = readH5Data(datasetPts, memTypeDbl, dataspacePts, memspacePts, 0);
Eigen::MatrixXd ptsMat = Eigen::Map<Eigen::MatrixXd>(points.data(), 3, nPoints).transpose();
但是,我现在需要用这些数据点构造一个Open3D PointCloud,构造如下:
PointCloud (const std::vector< Eigen::Vector3d > &points)
所以我要求数据设置为
std::vector<Eigen::Vector3d>
。所以,理想情况下,我想修改我的 readH5Data 函数以返回std::vector<Eigen::Vector3d>
。我相信我可以像这样从Eigen::MatrixXd
进行转换:
std::vector<Eigen::Vector3d> vec(ptsMat.colwise().begin(), ptsMat.colwise().end());
但我想知道我是否可以避免中间步骤并直接从
std::vector<double>
到std::vector<Eigen::Vector3d>
。