我正在尝试返回Eigen::MatrixXf类型的值,但这会导致分段错误。尝试调试时,我发现如果返回类型是类似floatint的函数,函数中具有相应的返回值,则该函数将成功运行。我已经尝试从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)

同样,在分配Vv11的值之前,不会调整矩阵v12的大小。

最后,如PeterT所述,您是create_V_matrix返回对本地变量的MatrixXf&引用,这是未定义的行为。虽然它可能会起作用,但不是必需的。有关详细说明,请参见Q&A。如果您担心副本,则可以并且应该依靠RVO /副本删除来删除无意义的副本。

关于c++ - 使用Eigen::MatrixXf作为函数返回类型的段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58041557/

10-13 05:05