Ошибка сегментации при использовании Eigen :: MatrixXf в качестве типа возврата функции - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь вернуть значение типа Eigen::MatrixXf, но это приводит к ошибке сегментации.Пытаясь отладить, я обнаружил, что если тип возвращаемого значения - это что-то вроде float или int с соответствующим возвращаемым значением в функции, функция выполняется успешно.Я попытался диагностировать проблему из документации 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).

1 Ответ

2 голосов
/ 22 сентября 2019

В вашей функции 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 / copy elision для удаления бессмысленной копии.

...