IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Trouver la valeur "la plus proche de" dans une liste

  1. #1
    Membre averti
    Homme Profil pro
    Technicien conception industrielle
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien conception industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Par défaut Trouver la valeur "la plus proche de" dans une liste
    Bonsoir

    Voila mon problème ( encore)

    l'utilisateur rentre une valeur cible ( ici 1/1.5 donc 0.66666666...)

    J'ai une liste de valeur double dans laquelle je dois trouver la plus proche de ma cible .

    jai voulu procéder ainsi :

    >je parcours une partie de la liste ( pas la liste entière ,c'est volontaire).
    >trouver valeur directement supérieur a la cible
    >trouver la valeur directement inférieur a la cible
    >calculer la différence valeur supérieur - cible
    >calculer la différence valeur inférieur - cible
    >choisir entre les 2 valeurs celle dont la valeur absolue de l'écart avec la cible est la petite.

    mais pour le calcul de valeur inférieur il me sort 0 ???

    le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    //CALCUL DE AOA :
     
            int k =listeangle.indexOf(anglePMHapro);
                        if (k!=-1)
                            index_pmh = k;
     
    valAOAmax= listeLevee1Netmm[0];
    valAOAmin= listeLevee1Netmm[0];
      double valAOAtmp = 0;
      double valAOAtmp2 =0;
            for ( int i=0; i<index_max;i++)
          {
    //valeur superieur a valeur choisie:
              if (listeLevee1Netmm[i]>(ValChoixlevee/ValRapportCulbuteur) && listeLevee1Netmm[i]<valAOAmax)
     
                valAOAmax = listeLevee1Netmm[i];
    //valeur inferieur a valeur choisie:
              if (listeLevee1Netmm[i]<(ValChoixlevee/ValRapportCulbuteur) && listeLevee1Netmm[i]<valAOAmin)
     
                 valAOAmin = listeLevee1Netmm[i];
            }
     
    //difference valeur sup -valeur choisie:
         valAOAtmp = valAOAmax - (ValChoixlevee/ValRapportCulbuteur);
     
    //differnece valeur inf-valeur choisie:
         valAOAtmp2 = valAOAmin - (ValChoixlevee/ValRapportCulbuteur);
     
    //choix de la valeur dont la difference absolue  (valeur sup/inf-valeur choisie) est la plus petite:
     
         if (abs(valAOAtmp)<abs(valAOAtmp2))
                          valAOA = valAOAmax;
     
         if (abs(valAOAtmp)>abs(valAOAtmp2))
                          valAOA = valAOAmin;
    et le resultat: ( valAOAmin =0=

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    index max = 504
    angle levée maxi 354.15
    valeur AOAmin = 0
    valeur AOAmax = 0.672195
    valAOAtmp = 0.00552861
    valAOAtmp2 = -0.666667
    Valeur de levee AOA = 0.672195
    angle AOA = 18
    pourtant dans la liste jai :
    Nom : Capture.jpg
Affichages : 198
Taille : 45,1 Ko

    merci à vous

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 752
    Par défaut


    La solution que je regarderais en priorité, c'est un std::min_element sur une liste transformée par transform_iterator (de Boost, bibliothèque extrêmement courante en C++ : https://www.boost.org/doc/libs/1_73_..._iterator.html) : ce que tu cherches, c'est le minimum de Formule mathématique.

    Une autre solution, toujours à base de std::min_element, c'est d'utiliser l'argument de comparateur. Par défaut, il utilise juste l'opérateur < : l'élément minimum est celui qui est < à tous les autres. Ici, on peut changer cette manière de comparer les éléments de la liste. Ceci a une chance de fonctionner (code non testé, ni même compilé), avec une lambda (fonction anonyme) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double sought = 2./3.;
    auto pos_closest = std::min_element(list.begin(), list.end(), [sought](double a) { return abs(a - sought); })
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Tu compliques un peu les choses en cherchant 2 valeurs, à la fin tu résous en utilisant la valeur absolue, alors que tu pourrais effectuer la valeur absolue en premier pour finalement rechercher la plus proche en valeur absolue.
    De plus tu te trimbales une division de 2 termes. Je crains que l'erreur ne soit due à cette division (par exemple la division de nombres entiers est la division entière des 2 nombres.)

    On peut effectuer en une ligne la recherche comme l'a écris dourouc05, mais la fonction std::min_element attend un comparateur pas un élément type à comparer. Ça donnerais une ligne un peu plus lourde.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double  sought = 2./3.;
    size_t nb_items_to_check = 12;
    auto  pos_closest = std::min_element(list.begin(), list.begin()+nb_items_to_check,
              [sought](auto const& a,auto const& b) { return abs(a-sought)<abs(b-sought); });
    std::cout << "valeur de l'élément " << *pos_closest << " indice e l'élément " << pos_closest-list.begin() << '\n';

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 746
    Par défaut
    Moi je pense à tes 2 tests ligne 14 et ligne 18, digne du meilleur copié-collé - surtout la deuxième partie qui est identique listeLevee1Netmm[i]<valAOAmin) et listeLevee1Netmm[i]<valAOAmax).

    Ensuite je n'arrive pas à expliquer pourquoi cela ne fonctionne pas (la première valeur doit avoir 1 influence) et même j'aurais tendance à dire que c'est + la valeur valAOAmax qui est erronée que valAOAmin

    Et au passage mets ValChoixlevee/ValRapportCulbuteur dans 1 variable

  5. #5
    Membre averti
    Homme Profil pro
    Technicien conception industrielle
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien conception industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Par défaut
    merci a vous je vais essayer de comprendre ça

    Foetus pour la mise en variable de Levee/rapport c'est fait du coup

    DalFab , si j'ai bien saisie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double  sought = 2./3.;
    size_t nb_items_to_check = 12;
    2./3. c'est la valeur cible et 12 c'est le nombre d'éléments de la liste ?

    Dourouc05 : merci , effectivement cette bibliothèque à l'air assez fournie . Au passage ya t'il une liste( non exhaustive) des bibliothèques existantes pour C++/QT ? Car j'en découvre par votre aide mais si il existe unindex des bibliothèques je pourrais allez deja fouiner dedans avant de poster ( ceci dis je poste quand jai déja bien epuisé mes recherches et essais , ce n'est pas mon genre de reclamer une réponse sans y avaoir reflechie avant.)

Discussions similaires

  1. Trouver la valeur la plus proche de X dans un vecteur
    Par emiliepin_43 dans le forum MATLAB
    Réponses: 4
    Dernier message: 03/04/2015, 00h37
  2. [XL-2007] Extraire la valeur la plus proche supérieure d'une liste
    Par atk_49 dans le forum Excel
    Réponses: 11
    Dernier message: 04/07/2014, 07h30
  3. Trouver la valeur la plus proche (deux dimensions)
    Par cscerim3 dans le forum SAS STAT
    Réponses: 0
    Dernier message: 28/03/2014, 16h14
  4. Trouver la valeur la plus proche dans une ligne
    Par tavita987 dans le forum Excel
    Réponses: 5
    Dernier message: 05/02/2014, 11h12
  5. Réponses: 5
    Dernier message: 02/01/2014, 10h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo