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

Qt Discussion :

somme de vecteurs


Sujet :

Qt

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut somme de vecteurs
    Bonjour,

    Je voudrai savoir comment calculer la somme de plusieurs "qvector" qui n'ont pas forcément la même taille.

    Le but étant de calculer la moyenne de plusieurs courbes stocké dans des container de type qvector.

    J'ai regardé un peu la doc, il me semblait que l'on pouvait le faire avec l'opérateur += ? ?

    merci d'avance,

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    tu veut sommer tous les elements contenu dans plsieur QVector?

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Tu peux utiliser les algorithmes de la STL, en particulier accumulate (http://r0d.developpez.com/articles/a...dex.php/#LII-D) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <numeric>
    QVector<int> v;
    int r = std::accumulate(v.begin(), v.end(), 0);
    Si tu veux vraiement le faire "à la main", tu peux effectivement utiliser += :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QVector<int> v;
    int r = 0;
    for(QVector<int>::Iterator it=v.begin(); it!=v.end(); ++it)
        r += *it;
    ou avec foreach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QVector<int> v;
    int r = 0;
    foreach(int i, v)
        r += i;
    EDIT : conflit de réponse. En lisant la réponse Yan, j'ai relu la question initiale.. et effectivement, elle n'est pas claire J'ai donné la solution pour la faire la somme d'un vecteur. Je ne sais pas si c'est ce qui est demandé

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    Desolé je me suis mal exprimé,

    en faite je veux faire la somme element par element de chaque vecteur, puis diviser element par element le nombre de vecteur.

    le but etant de calculer la moyenne de courbes contenus dans des vecteurs

    merci

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Ok

    Par contre, ça ne sera pas aussi simple que cela si tu as des vecteurs de tailles différents.

    Pour des vecteurs de meme taille, tu pourrais simpement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    QVector< QVector< double > > data;
    QVector< double > result;
    result.resize(data[0].size());
    for(int i=0; i<data.size(); ++i)
    {
        foreach(QVector< double > v, data)
            result[i] += v[i];
    }
    foreach(double d, result)
        d /= data.size();
    Tes courbes sont représentées comment ?
    - QVector<double> avec x = index et y = vector[index] ?
    - un QVector< QPoint > ou QVector < QPointF > ?
    - 2 QVector< double > ?
    - des QPolygon ou des QPolygonF ?

    En fait, c'est plus un problème d'algorithmique que de Qt : recherche sur google "c++ courbe moyenne"

    EDIT :
    un algorithme simple de "mean shift" : pour chaque point, tu calcules la moyennes des positions sur une fenêtre de largeur fixée à l'avance :
    par exemple pour des points pour lesquels x = [0,100]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1. creer un vecteur de taille fixé contenant la courbe moyenne (par exemple 100 points)
    2. fixer une "largeur de fenêtre" (par exemple L = 10)
    3. pour chaque position X de la courbe moyenne
        3.1. rechercher tous les points pour lesquels x = [X-L/2,X+L/2]
        3.2. faire la moyenne des y pour ces points
    C'est pas très compliqué a programmer, les performances et les résultats sont très variable (en fonction des données et des paramètres)

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    mes courbes sont représenté par deux qvector<double>. et effectivement les courbes n'ont pas forcement la meme taille, mais leur taille n'est pas trés éloigné.

    par contre comme sur la fin de la courbe les points ne sont pas représentatif. je peux ou les supprimer, pour les courbes ai la meme taille, ou alors prendre les données de la courbes la plus grande, car c'est un calcul de moyenne.

    voila j'ai une structure courbe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct courbe
    {
         qvector<double> x;
         qvector<double> y;
    };
    ensuite j'ai une qList qui contient les différentes courbes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Qlist<courbe> courbes
    cette Qlist contient donc différentes courbes et je voudrai faire une fonction du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    courbe MaFonctionQuiCalculLaMoyenneDesCourbes(QList<courbe> courbes)
    {
        courbe courbeMoyenne;
     
        return courbeMoyenne;
    }

    voila, j'espere que c'est plus clair

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Si tous tes points n'ont pas les mêmes valeurs de x, ça ne sert à rien de tronquer tes courbes : tu ne pourras pas de toute façon calculer une moyenne point par point

    Ensuite, tu as les techniques de regression, avec ou sans modèle... mais il vaut mieux lire un cours de stat dans ce cas

    EDIT : pour info, il existe une class QPolygonF dans Qt (http://qt.developpez.com/doc/latest/qpolygonf.html) qui permet de travailler sur des vecteur de points et qui implémente quelques functions (intersections de courbes, appartenance d'un point, etc.)

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    oui mais, c'est quand faite mes courbes sur les derniers points sont la, mais ne servent. je ne vais pas faire une regression linéaire, ou meme quadratique ou de n'importe quelle type, vu que cela ne sert a rien.

    si j'ai une courbe A qui 100 point et une autre courbe B avec 90 points.

    je calcul la moyenne entre la courbe A et B sur les 90 premiers point, puis je rajoute les 10 autres points de la courbe A.

    voila, merci

  9. #9
    Membre confirmé
    Avatar de bobti89
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Par défaut
    Par contre juste un conseil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct courbe
    {
         qvector<double> x;
         qvector<double> y;
    };
    est quand même bien plus compréhensible comme ca : (sans parler que c'est bien meilleur niveau gestion mémoire !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct courbe
    {
         QVector< QPointF > points;
    }

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Je voudrai savoir comment calculer la somme de plusieurs "qvector" qui n'ont pas forcément la même taille.
    Il n'y a pas de méthode préfaite permettant de faire ça dans Qt. Il faut le faire à la main.

    Si tous tes points n'ont pas les mêmes valeurs de x, ça ne sert à rien de tronquer tes courbes : tu ne pourras pas de toute façon calculer une moyenne point par point
    En effet, si toutes tes valeurs de x sont constantes, alors c'est un jeu d'enfant (2 boucles imbriquées). Sinon, selon ce que tu veux, ça va demander un peu plus de travail.

    G.

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    Merci, pour toutes vos réponses,

    J'ai finalement réussi a faire ce que je voulais faire. je vous montre pas le code, parce que ya plein de test encore derriere que je n'ai pas expliqué auparavant, donc inutile.

    merci a tous, bonne fin de journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. somme de vecteur <int>
    Par adel25 dans le forum SL & STL
    Réponses: 2
    Dernier message: 20/02/2009, 15h07
  2. [Débutant] Somme de termes d'un vecteur
    Par cpt.blake dans le forum MATLAB
    Réponses: 3
    Dernier message: 24/04/2008, 13h37
  3. somme à un rang detreminé d'un vecteur
    Par ENSAM-ALAMI dans le forum MATLAB
    Réponses: 3
    Dernier message: 07/04/2008, 21h15
  4. Réponses: 3
    Dernier message: 29/09/2007, 14h45
  5. [math] somme de plusieurs vecteurs à 3 dimensions
    Par teska dans le forum Mathématiques
    Réponses: 5
    Dernier message: 04/06/2003, 21h40

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