Problem to detect minimum value of a negative number



  • Hi guys,

    I'm trying to detect the maximum and the minimum y value from a plot. The maximum is ok. But I can not detect the correct negative number. I guess the problem may be the variable type, however I could not solve.

    My code is:

       auto plot10 = ui->customPlot_10;
       double y_max = 0.0;
       double y_min = 0.0;
    
       QVector<double> x(256), y(256);
    
           for (int i=0; i<x.size(); ++i)
           {
           x[i] = plot10->graph(0)->data()->at(i)->key;
           y[i] = plot10->graph(0)->data()->at(i)->value;  
                 
           if (y[i]>=y_max) y_max = y[i];
           if (y[i]<=y_min) y_min = y[i];
           qDebug () << "Min i: " << y_min;
           qDebug () << "Max i: " << y_max;
    
           }
    

    The Debug result shows that the code ignore the number signal, as you can see:

    Min i:  -0.14
    Min i:  -0.14
    Min i:  -0.14
    Min i:  -0.14
    Min i:  0.18
    Min i:  0.22
    Min i:  0.26
    Min i:  0.28
    Min i:  0.31
    Min i:  0.33
    Min i:  0.34
    //...
    

    Could someone help me?

    Cheers,


  • Lifetime Qt Champion

    Hi
    I would start by doing

    qDebug () << "value: " << y[i];
    to see the input data.

    You are using doubles so it should not be the issues since its mostly doing ==
    (is equal that can be tricky )

    That said
    You could use
    #include <algorithm>
    double min = *std::min_element(vec.constBegin(), vec.constEnd());
    double max = *std::max_element(vec.constBegin(), vec.constEnd());
    If you build the vector first.



  • HI, I don't think this will work with both <= and >= conditions. They should be just < or > and you should init them with y_max as a smaller value than the range you expect and y_min with a larger value than the range you expect.

    y_max = REAL_MIN; // or something else very small
    y_min = REAL_MAX; // or something else very large
    ...
    if (y[i]>y_max) y_max = y[i];
    if (y[i]<y_min) y_min = y[i];
    

    should work better.


  • Qt Champions 2018

    Don't reinvent the wheel

    QSharedPointer<QCPGraphDataContainer > graphData = ui->customPlot_10->graph(0)->data();
    const double y_max = std::max_element(graphData->cbegin(),graphData->cend(),[](const QCPGraphData& a, const QCPGraphData& b)->bool{return a.value<b.value;})->value;
    const double y_min = std::min_element(graphData->cbegin(),graphData->cend(),[](const QCPGraphData& a, const QCPGraphData& b)->bool{return a.value<b.value;})->value;
    const double x_max = std::max_element(graphData->cbegin(),graphData->cend(),[](const QCPGraphData& a, const QCPGraphData& b)->bool{return a.key<b.key;})->key;
    const double x_min = std::min_element(graphData->cbegin(),graphData->cend(),[](const QCPGraphData& a, const QCPGraphData& b)->bool{return a.key<b.key;})->key;
    


  • Thank you guys your solutions are great and i'm gonna to use in different applications!!

    Cheers,


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.