从函数返回两个浮点数组和 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<float, 3>
【参考方案1】:
这里的解决方案是将float[3]
的每个实例更改为std::array<float, 3>
。
您创建数组的方式,float center[3]
,通常称为 c 样式数组。 center
这里实际上是float*
类型,这就是为什么你得到错误center, axe, R
无法转换为你想要的类型。它实际上是std::tuple<float*, float*, Eigen::Matrix3f>
类型。
但是,您也不想这样做。原因是您的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的主要内容,如果未能解决你的问题,请参考以下文章