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 :

Structure while avec une boucle for en test


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 45
    Points
    45
    Par défaut Structure while avec une boucle for en test
    Salut,

    j essaye d implementer la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(for(int col=0; col<m.size2(); col=col+1)
    			{
    				for(int lig=col; lig<m.size1(); lig=lig+1)
    				{m(lig,col)!=0;}
    			})
    { ....}
    Mais ca ne compile et ca me sort plein d erreur, alors je pense qu on ne peut pas implementer une telle condition dans un while, est ce que quelqu un peut me confirmer cela ?

    merci, a+

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Je confirme. La condition du while doit etre une valeur convertible en int, et une boucle for n'a pas de valeur. Que veux-tu faire exactement ?

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 45
    Points
    45
    Par défaut OBJECTIF : une decomposition LU
    En fait le but est de realiser en decomposition LU d une matrice. Et cette structure permet de gerer un cas ou l algorithme rencontre un probleme lorsqu il y a un 0 au maivais endroit dans la matrice. Dans cas cas l algorithme saute une etape et la decomposition n est alors pas termine.
    Avec cette structure while, je verifie que la decomposition est bien terminee, et si elle n est pas termine (dû a ce 0 mal place), je relance l algorithme qui en partant du debut sur la matrice issue de la premeire decomposition avortee devrait aboutir.
    Voilà, j espere que c est clair !

    Pour ceux que ca interesse je met l algorithme en entier :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #include <iostream> 
    #include <vector>
    #include <boost/numeric/ublas/matrix.hpp>
    #include <boost/numeric/ublas/io.hpp>
    using namespace std;
    using namespace boost::numeric::ublas;
     
    std::vector<matrix<float>> decomp_lu(matrix<float> m)
    {
    	std::vector<matrix<float>> V_results(m.size1());
     
    	matrix<float> l(m.size1(), m.size1());
    	cout << "dimension de la matrice soumise au LU :"<<m.size1()<<"\n";
     
    	while(for(int col=0; col<m.size2(); col=col+1)
    			{
    				for(int lig=col; lig<m.size1(); lig=lig+1)
    				{m(lig,col)!=0;}
    			})
    	{
    		for(int i=0; i<=m.size1()-2; i=i+1)//calcul de L, l'operation est faite (n-1) fois
    		{
    			//coef à 0 de la matrice L
    			for(int c=0; c<m.size1(); ++ c)
    			for(int d=0; d<m.size2(); ++ d)
    			l(c,d)=0;
    			//coef à 1 sur la diagonale de la matrice L
    			for(int c=0; c<m.size1(); ++ c)
    			l(c,c)=1;
     
    			if (m(i,i)!=0)
    			{
    			//calcul des coef non nuls de la matrice L
    			for(int j=i; j<=m.size1()-2; ++ j)
    			l(j+1,i)=-m(j+1,i)/m(i,i);
    			}
    			if (m(i,i)==0)
    			{
    				cout<< "SAUT \n";
    				goto jump;
    			}
     
    			V_results[i]=l; //ecriture de la ieme matrice de L
     
    			cout << "operation numero "<< i <<", L : "<< l <<"\n";
    			m=prod(l, m);
    			cout << "operation numero "<< i <<", U : "<< m <<"\n";
    			jump:;
    		}
    	}//fin du while
    	V_results[m.size1()-1]=m;
    	return(V_results);
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Donc tu veux quelque chose du genre :
    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
     
    bool decompositionTerminee = false;
    while(!decompositionTerminee)
    {
        // Decomposition ...
     
        decompositionTerminee = false;
     
        for(int col=0; col<m.size2(); col=col+1)
        {
            for(int lig=col; lig<m.size1(); lig=lig+1)
            {
                decompositionTerminee &= (m(lig,col)!=0);
            }
        }
    }
    Pendant que j'y suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<matrix<float>> decomp_lu(matrix<float> m);
    ne compilera pas : la chaine >> est un operateur, donc ton compilateur ne comprendra pas la declaration. Il faut mettre un espace entre les deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<matrix<float> > decomp_lu(matrix<float> m);

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 45
    Points
    45
    Par défaut
    euh ca a l air interessant ce que tu me dis, par contre comme je commence en c++ je connais pas tout les symboles :
    while(!decompositionTerminee)

    decompositionTerminee &= (m(lig,col)!=0);

    si tu peux me dire en francais ce que cela signifie.

    Sinon concernant : std::vector<matrix<float>> decomp_lu(matrix<float> m);
    ca compile sans probleme.

    Merci, a+

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par le_voisin
    while(!decompositionTerminee)
    Le ! est l'operateur booleen NON. Donc while(!condition) se lit en francais : tant que ma condition n'est pas remplie.

    Citation Envoyé par le_voisin
    decompositionTerminee &= (m(lig,col)!=0);
    Le & est l'operation booleenne ET. Les deux boucles for imbriquees verifient que tous les elements de m sont non nuls. Si l'un d'eux est nul, decompositionTerminee passe a false, et y reste.

    Citation Envoyé par le_voisin
    Sinon concernant : std::vector<matrix<float>> decomp_lu(matrix<float> m);
    ca compile sans probleme.
    Etrange. Quel compilateur utilises-tu ?

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 45
    Points
    45
    Par défaut
    ok je te remercie,
    je ne pourrais pas aussi faire un truc du style :

    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
     
     
    while( compilation_termine=false)
    {.....
     
    compilation_termine=true
     
        for(int col=0; col<m.size2(); col=col+1)
        {
            for(int lig=col; lig<m.size1(); lig=lig+1)
            {
                if(m(lig,col)!=0)
                compilation_termine=flase
            }
        }
    }
    En fait il faut que j execute mon algorithme jusqu'a ce que je n ai plus de 0 sur la triangle inferieur gauche de ma matrice.

    Je te propose ca parce que je comprend toujours pas cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    decompositionTerminee &= (m(lig,col)!=0);
    notamment l enchainement "&=", sinon j imagine que pour un booleen 0 et false sont synonymes.

    Sinon je pense que si j ecris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    decompositionTerminee &= (m(lig,col)=0);
    ca devrait me permettre de faire mon algorithme jusqu a qu il n y ai plus de que des 0

    Merci

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par le_voisin
    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
     
     
    while( compilation_termine=false)
    {
        compilation_termine=true
     
        for(int col=0; col<m.size2(); col=col+1)
        {
            for(int lig=col; lig<m.size1(); lig=lig+1)
            {
                if(m(lig,col)!=0)
                compilation_termine=false
            }
        }
    }
    Cette version la est juste, la mienne etait fausse en fait. Dans ma boucle, j'aurais du initialiser decompositionTerminee a true.

    Citation Envoyé par le_voisin
    sinon j imagine que pour un booleen 0 et false sont synonymes.
    Oui. Et n'importe quelle valeur non nulle est assimilee a true.

    Citation Envoyé par le_voisin
    Sinon je pense que si j ecris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    decompositionTerminee &= (m(lig,col)=0);
    Si tu ecris ca, tu auras un beau bug : il faudrait ecrire (m(lig,col)==0).

    Les differentes ecritures sont equivalentes (du moment que tu ne te melanges pas les pinceaux entre les true/false et/ou), donc tu peux choisir celle qui te parait la plus lisible.

  9. #9
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 45
    Points
    45
    Par défaut
    ok je te remercie, a+

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Attention à ça :
    while( compilation_termine=false)

Discussions similaires

  1. problème avec une boucle For
    Par mademoizel dans le forum ASP
    Réponses: 3
    Dernier message: 24/03/2007, 13h20
  2. Réponses: 1
    Dernier message: 31/01/2007, 12h30
  3. Problème avec une boucle for
    Par cisse18 dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 29/03/2006, 16h50
  4. Incrémentation dynamique d'un textbox avec une boucle for
    Par Etanne dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/03/2006, 15h17
  5. : remplir des zones de texte avec une boucle For
    Par Haro_GSD dans le forum Access
    Réponses: 3
    Dernier message: 20/09/2005, 21h23

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