从函数返回两个浮点数组和 Eigen::Matrix3f

Posted

技术标签:

【中文标题】从函数返回两个浮点数组和 Eigen::Matrix3f【英文标题】:Return two float arrays and Eigen::Matrix3f from a function 【发布时间】:2021-08-29 06:45:57 【问题描述】:

我想从我的函数中返回两个浮点数组和一个 3 x 3 特征矩阵。这是我正在使用的代码:

std::tuple<float[3], float[3], Eigen::Matrix3f> dual_quadric_to_ellipsoid_params(Eigen::Matrix4f Q) 
    Q = Q / -Q(3,3);
    float center[3] = Q(0,3), Q(1,3), Q(2,3);
    Eigen::Matrix4f T;
    T.block(0, 0, 3, 3) = Eigen::Matrix3f::Identity();
    T.col(3) << -center[0], -center[1], -center[2], 1;
    Eigen::Matrix4f Q_cent = T*Q*T.transpose();
    Eigen::JacobiSVD<Eigen::MatrixXf> svd(Q_cent.block(0, 0, 3, 3), Eigen::ComputeFullU | Eigen::ComputeFullV);
    Eigen::Vector3f singular_vals = svd.singularValues();
    float axes[3] = singular_vals[2], singular_vals[1], singular_vals[0];
    Eigen::Matrix3f R = svd.matrixV();
    return center, axes, R;

我收到一个错误:

could not convert ‘center, axes, R’ from ‘<brace-enclosed initializer list>’ to ‘std::tuple<float [3], float [3], Eigen::Matrix<float, 3, 3, 0, 3, 3> >’

【问题讨论】:

不要使用float[3],使用std::array&lt;float, 3&gt; 【参考方案1】: 这里的解决方案是将float[3] 的每个实例更改为std::array&lt;float, 3&gt;

您创建数组的方式,float center[3],通常称为 c 样式数组。 center 这里实际上是float* 类型,这就是为什么你得到错误center, axe, R 无法转换为你想要的类型。它实际上是std::tuple&lt;float*, float*, Eigen::Matrix3f&gt; 类型。

但是,您也不想这样做。原因是您的float*s 指向在该函数中创建的临时对象。这些对象将在该函数结束时被销毁,并使您的指针无效。


这里的解决方案是使用std::array,因为它会在函数之后存储信息:

std::tuple<std::array<float, 3>, std::array<float, 3>, Eigen::Matrix3f> foo() 
     ⋮
    std::array<float, 3> center = Q(0,3), Q(1,3), Q(2,3);
     ⋮
     ⋮
    std::array<float, 3> axes = singular_vals[2], singular_vals[1], singular_vals[0];
     ⋮
    return center, axes, R;

【讨论】:

center 不是指针,给定返回类型不能创建指针元组。问题是数组不能直接初始化。

以上是关于从函数返回两个浮点数组和 Eigen::Matrix3f的主要内容,如果未能解决你的问题,请参考以下文章

如何从函数返回浮点数组?

如何正确地将浮点指针从 C 库传递到其 C# 包装器

使用jquery从一个函数返回两个数组[重复]

从浮点数组iOS Swift播放音频

如何从swift将一组浮点数组传递给C++函数

为啥 main() 函数不返回浮点值?