2015-05-04 3 views
0

Для того, чтобы получить среднее значение карты неравенства я должен был написать собственный метод игнорировать отрицательные значения диспропорция:GDB арифметическое исключение - нет деления на ноль - Ошибка выполнения

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) вещи, чтобы быть полностью безопасным делений на ноль.

На самом деле я не знаю, что делать в данный момент.

Возможно, у одного из вас есть идея для этого.

+2

Не могли бы вы дать нам [минимальный полный пример] (http://stackoverflow.com/help/mcve)? – Beta

+0

Как мне сделать это еще меньше? Проблема заключается в сбое программы после неопределенного времени. Я передаю функцию с не нормированной разницей. Я не могу предоставить больше информации, потому что я действительно не понимаю, что там происходит – hGen

+0

Что думает gdb о значениях 'total' и' numElements'? –

ответ

0

matrix.rows Если и matrix.cols являются 0, numElements будет 0, и вы получите деление на 0.

Поскольку вы, кажется, знают, как использовать отладчик, проверьте значения matrix.rows и matrix.cols для проверки причина.

0

Благодаря всей помощи, но проблема была проще, чем ожидалось.

Время от времени карта несоответствия содержит области с нулевыми/отрицательными значениями в ней. поэтому вся подматрица I, прошедшая в функцию, имела среднее значение 0, поэтому условие if было проигнорировано. Таким образом, окончательный дивизион был 0/0 -> арифметическое исключение.

Смежные вопросы