如何解决从函数返回两个浮点数组和 Eigen::Matrix3f
我想从我的函数中返回两个浮点数组和一个 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,Q(2,3)};
Eigen::Matrix4f T;
T.block(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,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,R}’ from ‘<brace-enclosed initializer list>’ to ‘std::tuple<float [3],float [3],Eigen::Matrix<float,3> >’
解决方法
- 此处的解决方案是将
float[3]
的每个实例更改为std::array<float,3>
。
您创建数组的方式 float center[3]
通常称为 c 样式数组。这里的 center
实际上是 float*
类型,这就是为什么您会收到错误 {center,axe,R}
cannot be convert to your required type。它实际上是 std::tuple<float*,float*,Eigen::Matrix3f>
类型。
但是,您也不想这样做。原因是这里的 float*
指向在该函数中创建的临时对象。这些对象将在该函数结束时销毁,并使您的指针无效。
这里的解决方案是使用std::array
,因为即使在函数之后它也会存储信息:
std::tuple<std::array<float,3>,std::array<float,Eigen::Matrix3f> foo() {
⋮
std::array<float,3> center = {Q(0,3),Q(1,Q(2,3)};
⋮
⋮
std::array<float,3> axes = {singular_vals[2],singular_vals[1],singular_vals[0]};
⋮
return {center,axes,R};
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。