gpt4 book ai didi

c++ - 使用 Eigen::MatrixXf 作为函数返回类型时出现段错误

转载 作者:行者123 更新时间:2023-11-27 23:37:44 25 4
gpt4 key购买 nike

我正在尝试返回类型为 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)在作业之前是必需的。

同样,您的矩阵 V在分配来自 v11 的值之前未调整大小& v12 .

最后,如PeterT所述, 你是 create_V_matrix返回 MatrixXf&引用局部变量,这是未定义的行为。虽然它可能有效,但不是必需的。看这个Q&A一个很好的解释。如果您担心拷贝,您可以而且应该依靠 RVO/拷贝省略来删除无意义的拷贝。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com