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

 C++ Discussion :

Vecteur Matlab en C++


Sujet :

C++

  1. #1
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut Vecteur Matlab en C++
    Bonjour,
    j'ai pour projet de passer en C++ un programme fait sous matlab,

    j'ai donc un vecteur sous matlab de cette forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    p=[705 710 715 720 725 730 736 741 746 752 ... 
    757 762 768 773 779 784 790 795 801 807 ... 
    812 818 824 830 835 841 847 853 859 865 ... 
    871 877 883 890 896 902 908 915 921 927 ... 
    934 940 947 953 960 967 973 980 987 994 ... 
    1001 1007 1014 1021 1028 1035 1042 1050 1057 1064]


    Pour faire la même chose en C je sèche un peu, car un tableau à remplir case par case serait trés long et fastidieux sachant qu'en réalité il y a plus de 1000 valeur dans ce vecteur matlab...
    il y a aussi des vecteurs en C++ mais je ne sais pas si il est possible de mettre plusieurs valeur différente dans un vecteur? Ou si vous avec une autre solution...

    Merci d'avance

    PS: j'utilise Visual studio

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour et bienvenu,
    En C de base, tu peux faire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int mon_vecteur[]={
    1,2,3,4,5,6,7,8,9
    10,11,12,13,14,15,16
    ...
    }
    Cependant, attention. Déclarer un tableau de grande dimension sur la pile peut provoquer de sérieux dégâts.
    Comme nous sommes sur le forum C++, je te préconiserais d'utiliser une solution C++ : std::vector pour ton vecteur et Boost.Assign pour te faciliter la vie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <vector>
    #include <boost/assign/std/vector.hpp>
    using namespace boost::assign;
    int main()
    {
       std::vector<int> mes_int;
       mes_int += 
          1,2,3,4,5,6,7,8,9,
          10,11,12,13,14,15,16,17,18,19,
    ...
       ;
    Pour Boost.Assign, tu pourras trouver un tutoriel ici.
    Sur les vecteurs de la STL, tu pourras trouver des infos ici ou dans la FAQ.

  3. #3
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    merci beaucoup,

    je vais lire tout sa et essayer de faire un truc correct

  4. #4
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    j'ai donc essayer cette méthode mais pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include <boost/assign/std/vector.hpp>
    visual me dit:
    fatal error C1083: Impossible d'ouvrir le fichier include*: 'boost/assign/std/vector.hpp'*: No such file or directory
    ou ce trouve donc ce fichier? est ce qu'il faut le rajouter?

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    C'est boost, c'est pas la librairie standard. Il faut donc la télécharger
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Tu trouveras des infos dans la section consacrée à Boost (FAQ et tutoriels).
    Tu peux télécharger la version sur le site de Boost. Elle est gratuite, pour la partie Boost.Assign ne nécessite pas de compilation et peut être utilisée aussi bien sur des programmes libres que commerciaux.

  7. #7
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    Salut,

    j'ai donc utilisé cette methode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <vector>
    #include <boost/assign/std/vector.hpp>
    using namespace boost::assign;
    int main()
    {
       std::vector<int> mes_int;
       mes_int += 
          1,2,3,4,5,6,7,8,9,
          10,11,12,13,14,15,16,17,18,19,
    ...
       ;
    par contre je voudrai savoir comment recupérer une valeur ensuite dans le vecteur.
    Par exemple si je veux la 3e valeur...
    si j'avais un tableau de je ferai

    a=Tab[3];

    mais j'ai pas compris comment faire avec les vecteur

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par vtk37 Voir le message
    par contre je voudrai savoir comment recupérer une valeur ensuite dans le vecteur.
    Par exemple si je veux la 3e valeur...
    si j'avais un tableau de je ferai

    a=Tab[3];

    mais j'ai pas compris comment faire avec les vecteur
    Pareil, c'est cela la beauté du vector.

    Par contre, j'ai un horrible doute sur l'initialisation du vector. Cela marche comme cela ? Le résultats est correct ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    La réponse dépend de ce que tu veux en faire. Si tu dois parcourir tout ton tableau, il est plus judicieux d'utiliser les algorithmes de la STL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void DoIt(int i_)
    {
          // blablabla
    }
     
    // plus loin dans ton code :
    std::for_each(
        mes_int.begin(),
        mes_int.end(),
        DoIt
    );
    Ca va appeler DoIt pour toutes les entrées de ton vecteur.
    Pour les différents algos de la STL, ce tutoriel te donnera des infos.

    Avec les itérateurs, c'est toi qui fait le parcours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::vector<int>::const_iterator it(mes_int.begin());
    while(it!=mes_int.end())
    {
         // traitement
         somme+= *it;// *it permet d'obtenir la valeur
         ++it; // on passe à l'élément suivant.
    }
    Enfin, si tu ne dois accéder qu'à quelques éléments, alors doit suffire.

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Cela marche comme cela ? Le résultats est correct ?
    Si tu parles de l'initialisation, c'est grâce à Boost.Assign (cf début)

  11. #11
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Si tu parles de l'initialisation, c'est grâce à Boost.Assign (cf début)
    Ha OK alors !!
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  12. #12
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    merci beaucoup pour votre aide je devrai m'en sortir avec ça

    j'avais essayé de récupérer une valeur seul mais sa me donner 0 j'ai juste redémarrer visual et sa marche

  13. #13
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    bonsoir

    j'aurais encore besoin de vos lumières

    si je prend ce bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<int>::const_iterator it(mes_int.begin());
    while(it!=mes_int.end())
    {
         // traitement
         somme+= *it;// *it permet d'obtenir la valeur
         ++it; // on passe à l'élément suivant.
    }

    au lien de le faire parcourir le vecteur jusqu'au bout je voudrai que cela s'arrête à une valeur precise cela est il possible?
    faut il utiliser operator comme me propose visual ?

    et pour somme comment doit-ont le declarer idéalement?

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par vtk37 Voir le message
    bonsoir

    j'aurais encore besoin de vos lumières

    si je prend ce bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<int>::const_iterator it(mes_int.begin());
    while(it!=mes_int.end())
    {
         // traitement
         somme+= *it;// *it permet d'obtenir la valeur
         ++it; // on passe à l'élément suivant.
    }

    au lien de le faire parcourir le vecteur jusqu'au bout je voudrai que cela s'arrête à une valeur precise cela est il possible?
    Il suffit de modifier ta boucle pour sortir dès que la valeur que tu souhaites atteindre est atteinte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<int>::const_iterator it(mes_int.begin());
    while((it!=mes_int.end())&&((*it)!=valeur_limite))
    {
         // traitement
         somme+= *it;// *it permet d'obtenir la valeur
         ++it; // on passe à l'élément suivant.
    }
    Citation Envoyé par vtk37 Voir le message
    faut il utiliser operator comme me propose visual ?
    Que te propose Visual ?
    Citation Envoyé par vtk37 Voir le message
    et pour somme comment doit-ont le declarer idéalement?
    C'est une accumulation des valeurs de std::vector<int>, donc somme devrait être un int

  15. #15
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Ou alors utilisé la SL a fond avec :

    std::accumulate().
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  16. #16
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<int>::const_iterator it(mes_int.begin());
    while((it!=mes_int.end())&&((*it)!=valeur_limite))
    {
         // traitement
         somme+= *it;// *it permet d'obtenir la valeur
         ++it; // on passe à l'élément suivant.
    }
    j'avait essayé while(it!=valeur_limite)

    mais sans * visual me disait donc qu'il y avait une erreur et le débogueur me proposer un exemple avec operator

  17. #17
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    it est un itérateur. C'est à dire qu'il te permet de parcourir les éléments de ton vecteur les uns après les autres. Mais en soit, il n'est pas la valeur de l'élément. Pour obtenir sa valeur, tu dois le déréférencer (un peu comme un pointeur). C'est pourquoi tu dois utiliser *it pour obtenir la valeur.
    Attention de maintenir la première condition it!=mes_int.end() au cas où ta valeur ne serait pas dans ton vecteur. Car déréférencer un itérateur qui est positionné sur end(), c'est comme déréférencer un pointeur invalide -> plantage

  18. #18
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Comme je suis pas sur qu'on me message est était vu :

    utilise std::accumulate() c'est fait pour.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  19. #19
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    je vais testé les 2 méthodes je suis en trin de regarder comment fonctionne acumulate

  20. #20
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Goten Voir le message
    Comme je suis pas sur qu'on me message est était vu :

    utilise std::accumulate() c'est fait pour.
    Sisi, mais :
    A la nuance près qu'il faut modifier l'itérateur pour qu'il s'arrête à une valeur précise.

Discussions similaires

  1. stockage des vecteur + matlab
    Par hanen2010 dans le forum MATLAB
    Réponses: 1
    Dernier message: 22/04/2010, 08h28
  2. Réponses: 8
    Dernier message: 11/06/2009, 20h46
  3. matlab et gros vecteurs
    Par gtkill dans le forum MATLAB
    Réponses: 9
    Dernier message: 09/06/2009, 13h48
  4. matrice vecteurs matlab
    Par momo032114 dans le forum MATLAB
    Réponses: 10
    Dernier message: 14/08/2008, 12h17
  5. [Débutant] MATLAB et les vecteurs
    Par fares.26 dans le forum MATLAB
    Réponses: 5
    Dernier message: 05/02/2008, 11h44

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