将具有双精度数组的自定义结构映射到 Eigen::Matrix

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

我有来自第三方库的这个 c 结构:

typedef struct Point3d
{
#ifdef __cplusplus  
  enum{ SIZE = 3 };
  typedef double value_type;                                          ///< type export 
  double&       operator[](size_t index)       { return vec[index];}  ///< random-access
  const double& operator[](size_t index) const { return vec[index];}  ///< random-access
#endif

  double vec[3];        ///< point data, e.g. 0=x,1=y,2=z
  void* data; ///< pointer to additional user-defined data
} Point3d;

这个结构体用作数组,如下所示:

Point3d* mypoints = new Point3d[200];

我现在想要将这个数组 - 特别是 Point3d::vec 中保存的 3 个双精度数 - 映射到 Eigen::Matrix。 我按照这个答案来做到这一点:

https://stackoverflow.com/a/58980755/10825362

这导致了这个功能:

Eigen::Matrix<double, 3, Eigen::Dynamic> exportToEigen(Point3d *points, int size)
{
    Eigen::MatrixXd result(size, 3);
    constexpr int stride = sizeof(ALG3D_Point3d)/sizeof(double);

    Eigen::VectorXd X = 
        Eigen::Map<Eigen::VectorXd, Eigen::Unaligned, Eigen::InnerStride<stride>>(
            &points[0].vec[0], size
        );

    Eigen::VectorXd Y = 
        Eigen::Map<Eigen::VectorXd, Eigen::Unaligned, Eigen::InnerStride<stride>>(
            &points[0].vec[1], size
        );

    Eigen::VectorXd Z = 
        Eigen::Map<Eigen::VectorXd, Eigen::Unaligned, Eigen::InnerStride<stride>>(
            &points[0].vec[2], size
        );

    result << X, Y, Z;
    return result.transpose();
}

现在我想知道这是否可以在不需要临时 X、Y、Z

Eigen::VectorXd
s 的情况下完成?

c++ eigen3
1个回答
0
投票

您可以直接映射到

Eigen::Matrix<double, 3, Eigen::Dynamic, RowMajor>
,这可以避免创建中间向量。

using Mat = Eigen::Matrix<double, 3, Eigen::Dynamic, RowMajor>;
constexpr int Stride = sizeof(ALG3D_Point3d)/sizeof(double);
return Eigen::Map<Mat, Eigen::Unaligned, Eigen::OuterStride<Stride>>;
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.