我正在尝试返回Eigen::MatrixXf
类型的值,但这会导致分段错误。尝试调试时,我发现如果返回类型是类似float
或int
的函数,函数中具有相应的返回值,则该函数将成功运行。我已经尝试从here的Eigen文档中诊断问题,但是没有任何帮助。
MatrixXf& create_V_matrix(cv::Mat H) {
// Gather V matrix
MatrixXf v11 = get_vij_matrix(H, 0, 0);
MatrixXf v12 = get_vij_matrix(H, 0, 1);
MatrixXf v22 = get_vij_matrix(H, 1, 1);
MatrixXf V;
V << v12.transpose(),
(v11-v12).transpose();
return V;
}
MatrixXf get_vij_matrix(cv::Mat H, int i, int j) {
// Create v matrix at i and j
MatrixXf vij;
vij << H.at<float>(0, i)*H.at<float>(0, j),
H.at<float>(0, 1)*H.at<float>(1, j) +
H.at<float>(1, i)*H.at<float>(0, j),
H.at<float>(1, i)*H.at<float>(1, j),
H.at<float>(2, i)*H.at<float>(0, j) +
H.at<float>(0, i)*H.at<float>(2, j),
H.at<float>(2, i)*H.at<float>(1, j) +
H.at<float>(1, i)*H.at<float>(2, j),
H.at<float>(2, i)*H.at<float>(2, j);
return vij;
}
当
Segmentation fault(core dumped)
时,这会导致create_V_matrix(cv::Mat H
叫做。 最佳答案
在函数et_vij_matrix
中,您需要先设置MatrixXf
的大小vij
,然后再使用operator <<
分配值。否则,为vij
分配的存储大小为零,并且您的分配将超出范围。我计算了您要分配的6个值,因此分配前需要vij.resize(1,6)
,vij.resize(2,3)
,vij.resize(3,2)
或vij.resize(6,1)
。
同样,在分配V
和v11
的值之前,不会调整矩阵v12
的大小。
最后,如PeterT所述,您是create_V_matrix
返回对本地变量的MatrixXf&
引用,这是未定义的行为。虽然它可能会起作用,但不是必需的。有关详细说明,请参见Q&A。如果您担心副本,则可以并且应该依靠RVO /副本删除来删除无意义的副本。
关于c++ - 使用Eigen::MatrixXf作为函数返回类型的段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58041557/