将 std::vector<double> 转换为 std::vector<Eigen:Vector3d>

问题描述 投票:0回答:0

我想知道如何将

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>

c++ eigen hdf5 open3d
© www.soinside.com 2019 - 2024. All rights reserved.