gdb 算术异常 - 没有被零除 - 运行时错误
gdb arithmetic exception - no division by zero - runtime error
为了获得视差图的平均值,我不得不编写自己的方法来忽略负视差值:
float Utility::calcMeanDisparity(cv::Mat const& matrix)
{
int total = 0;
int numElements = 0;
for(int r = 0; r < matrix.rows; ++r)
{
for(int c = 0; c < matrix.cols; ++c)
{
if(static_cast<float>(matrix.at<short>(r,c)) > 0)
{
total += static_cast<float>(matrix.at<short>(r,c));
++numElements;
}
}
}
float mean = total / abs(numElements);
std::cout << total << " / " << numElements << " = " << mean << std::endl;
return mean;
}
但我的代码在特定时间后因 gdb 错误而崩溃:
Program received signal SIGFPE, Arithmetic exception.
0x000000000044a992 in Utility::calcMeanDisparity (matrix=...) at src/utility.cpp:250
250 float mean = total / abs(numElements);
但是我无法除以零。这是我的代码试图计算的最后三行:
950149 / 4275 = 222
804412 / 4429 = 181
873770 / 4253 = 205
我还添加了 abs(foo)
内容以完全避免被零除。
其实我现在不知道该做什么。
也许你们中有人对此有想法。
如果matrix.rows
和matrix.cols
为0,则numElements为0,除以0。
由于您似乎知道如何使用调试器,请检查 matrix.rows
和 matrix.cols
的值以验证原因。
感谢大家的帮助,但问题比预期的要简单。
视差图有时会包含零值/负值区域。所以我传递给函数的整个子矩阵的平均值为 0,这就是忽略 if 条件的原因。所以最后的除法是 0 / 0
--> 算术异常。
为了获得视差图的平均值,我不得不编写自己的方法来忽略负视差值:
float Utility::calcMeanDisparity(cv::Mat const& matrix)
{
int total = 0;
int numElements = 0;
for(int r = 0; r < matrix.rows; ++r)
{
for(int c = 0; c < matrix.cols; ++c)
{
if(static_cast<float>(matrix.at<short>(r,c)) > 0)
{
total += static_cast<float>(matrix.at<short>(r,c));
++numElements;
}
}
}
float mean = total / abs(numElements);
std::cout << total << " / " << numElements << " = " << mean << std::endl;
return mean;
}
但我的代码在特定时间后因 gdb 错误而崩溃:
Program received signal SIGFPE, Arithmetic exception.
0x000000000044a992 in Utility::calcMeanDisparity (matrix=...) at src/utility.cpp:250
250 float mean = total / abs(numElements);
但是我无法除以零。这是我的代码试图计算的最后三行:
950149 / 4275 = 222
804412 / 4429 = 181
873770 / 4253 = 205
我还添加了 abs(foo)
内容以完全避免被零除。
其实我现在不知道该做什么。
也许你们中有人对此有想法。
如果matrix.rows
和matrix.cols
为0,则numElements为0,除以0。
由于您似乎知道如何使用调试器,请检查 matrix.rows
和 matrix.cols
的值以验证原因。
感谢大家的帮助,但问题比预期的要简单。
视差图有时会包含零值/负值区域。所以我传递给函数的整个子矩阵的平均值为 0,这就是忽略 if 条件的原因。所以最后的除法是 0 / 0
--> 算术异常。