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

MATLAB Discussion :

Réinitialiser une boucle


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Par défaut Réinitialiser une boucle
    Bonjour

    Je suis étudiant en classe prépa BCPST, et en option informatique, on nous demande de manipuler MATLAB. Notre section étant à dominante biologie/chimie, et à raison de deux heures d'infos par semaine, nous sommes loin d'être des flèches dans cette discipline

    Ma question va donc sûrement vous parraître trivial, mais croyez moi, ça fait plusieurs heures que je planche dessus

    Voici mon problème :
    j'ai une boucle
    dans cette boucle j'ai une condition
    j'aimerais que lorsque cette condition est réalisée, que la boucle se réinitialise, c'est à dire qu'elle reprenne de 1 !

    voici la fonction en question (j'ai indiqué la boucle problématique en commentaire).
    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
    %%%Fonction reproduction
    %%%% fait une troncature de p1 à différent rang et accole les valeurs de 
    %%%% p2 en prenant gare qu'elles ne se trouvent pas déjà dans la troncature
    %%%% de p1
    %%%% exemple : p1= [1 2 3 4 5 6]
    %%%%           p2= [3 6 4 1 2 5]
    %%%%r = 1 3 6 4 2 5
    %%%%    1 2 3 6 4 5
    %%%%    1 2 3 6 4 5
    %%%%    1 2 3 4 6 5
    %%%%    1 2 3 4 5 6
    %%%%    1 2 3 4 5 6
     
     
    function r=reproduction(p1,p2)
    n1=size(p1)
    n=n1(1,2)
    r=zeros(n,n)
    for k=1:n  %%%Ces deux boucles créent les n troncature de p1
        for j=1:k
            r(k,j)=p1(j)
        end
    end
     
    for m=1:(n-1)
        q=0
     
        for o=(m+1):n
     
            for p=1:m   %%%BOUCLE PROBLEMATIQUE
                if p2(o-m+q)==r(m,p)
                    q=q+1
                    p=1
                end
            end
            r(m,o)=p2(o-m+q)
     
        end
    end
    Donc voilà, ma boucle va de 1 à m, ( for p=1:m)
    si je fais p=1 à la fin de la boucle, ma boucle "l'ignore", et si par exemple elle était à 3, elle passe à 4 :s

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Par défaut
    Bonjour,

    Pour celà une solution serait d'utiliser une boucle WHILE au lieu d'une boucle FOR:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while j < nb_iterations
     
    if (....)
        j = 1;
    else
        j = j+1;
    end
    end
    Par contre, fait attention à ne pas faire une boucle infinie (sauf si c'est le but recherché).

    Duf

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Par défaut
    Salut

    Merci pour ta réponse

    Le problème est que je ne connais pas le nombre d'itération à l'avance

    Cordialement

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Par défaut
    Rebonjour,

    j'ai un peu réfléchi pour passer par un while plutôt que par un for :

    le problème étant maintenant que dans mon "while" je dois vérifier n choses :

    while truc ou bidule ou machin ou chose ou....


    En gros, il faudrait que while vérifie n choses, sans que j'ai à les indiquer puisque le nombre de choses à vérifier va dépendre des conditions initiales !

    est ce possible avec matlab d'avoir quelque chose de ce genre ?

  5. #5
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Par défaut
    Pourrais-tu donner un exemple concret parce que là j'ai un peu du mal à te suivre...

  6. #6
    Membre émérite Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Par défaut
    salut
    tu ne t'y prends pas forcément de la façon la plus simple.
    il faut te dire qu'avec Matlab il faut éviter au maximum les boucles.
    l'dée est de supprimer d'abord de p2 les valeurs apparaissant déjà. Pour cela la fonction ISMEMBER peut t'être utile (avec de l'indexation logique).

    Je te mets mon code (qui peut sûrement encore être optimisé) mais je te conseille de réfléchir encore aux différentes façons d'obtenir le résultat voulu avant de le regarder.
    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
    function r=reproduction(p1,p2)
    %    Fonction REPRODUCTION
    % r=reproduction(p1,p2) fait une troncature de p1 à différent rang et accole les valeurs de
    % p2 en prenant gare qu'elles ne se trouvent pas déjà dans la troncature
    % de p1
    % exemple : p1= [1 2 3 4 5 6]
    %           p2= [3 6 4 1 2 5]
    % r = 1 3 6 4 2 5
    %     1 2 3 6 4 5
    %     1 2 3 6 4 5
    %     1 2 3 4 6 5
    %     1 2 3 4 5 6
    %     1 2 3 4 5 6
     
    lp = length(p1);
    r=zeros(lp,lp);
    for i=1:lp
        r(i,1:i) = p1(1:i);
        p3 = p2(~ismember(p2,p1(1:i)));
        r(i,i+1:lp) = p3(1:lp-i);
    end
    Remarque : mettre comme je l'ai fait des lignes de commentaires juste après le nom de la fonction permet d'avoir l'aide lorsque l'on tape
    dans la ligne de commande

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Par défaut
    Citation Envoyé par duf42 Voir le message
    Pourrais-tu donner un exemple concret parce que là j'ai un peu du mal à te suivre...

    j'ai un vecteur [1 2 3 0 0 0] et [ 2 3 4 5 1 6]

    la finalité c'est d'avoir un vecteur de 6 coordonnée avec les trois premières coordonnée du premier vecteur, et trois coordonnée du deuxième vecteur différentes du premier mais dans leur ordre d'apparition

    ce qui donne [1 2 3 4 5 6] ici

    donc en gros dans le while, je veux prendre les coordonnée de mon deuxième vecteur une par une et les vérifier avec les trois premières coordonnées du premier vecteur

    ici vu que yen a 6 ça peut se faire, mais il peut très bien y en avoir n :o

  8. #8
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Par défaut
    Un essai (non testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    p1 = [1 2 3 0 0 0];
    p2 = [ 2 3 4 5 1 6];
     
    % Définition des indices de p2 non inclus dans p1
    p2_idx = find(~arrayfun(@(x) ismember(x,p1),p2));
     
    % Création du vecteur de sortie
    p = [p1(1:3), p2(p2_idx(1:3))];

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Par défaut
    Bonsoir

    Merci pour vos réponses

    J'essaye de me servir un minimum des fonctions intégrées à Matlab (en fait on est pas censé les connaître mais se débrouiller avec les trucs de bases...)

    Toujours est il que je suis arrivé à résoudre le problème en prenant un chemin détourné.

    Voici 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    function r=reproduction3(p1,p2)
    % Fonction reproduction
    % fait une troncature de p1 à différent rang et accole les valeurs de 
    % p2 en prenant gare qu'elles ne se trouvent pas déjà dans la troncature
    % de p1
    % exemple : p1= [1 2 3 4 5 6]
    %           p2= [3 6 4 1 2 5]
    % r =1 3 6 4 2 5
    %    1 2 3 6 4 5
    %    1 2 3 6 4 5
    %    1 2 3 4 6 5
    %    1 2 3 4 5 6
    %    1 2 3 4 5 6
     
    n1=size(p1)
    n=n1(1,2)
    r=zeros(n,n) 
    for k=1:n  %%%Ces deux boucles créent les n troncature de p1
    for j=1:k  %%%et les placent dans une matrice de dim n*n
        r(k,j)=p1(j)
    end
    end
     
    for m=1:(n-1) %%%Boucle parcourant les différentes lignes
     
        for o=(m+1):n %%%Boucle parcourant les différentes colonne d'une ligne fixée
            p=(p2(o-m)==r(m,:)) %%%Principe : comparer la première valeur de p2
            s=0                 %%%avec celles de la première ligne de la matrice
            t=0                 %%%des troncatures
            if p==zeros(1,n)    %%%Si la matrice ne comporte que des zéros
            else                %%%cela signifie que p2(1) différent de toutes
                s=s+1           %%%les valeurs de la première ligne de la matrice
                t=t+1           %%%sinon, incrémente s (qui va jouer le rôle de valeur
            end                 %%%d'arrêt du "while") et t (qui compte le décalage à opérer).
            while s==1
                 p=(p2(o-m+t)==r(m,:))   %%%Principe identique
                s=0
               if p==zeros(1,n)
            else
                s=s+1
                t=t+1
            end
            end
            r(m,o)=p2(o-m+t)
        end
    end

Discussions similaires

  1. Réinitialiser une boucle for en cours d'exécution
    Par torquemada dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 18/06/2014, 10h16
  2. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  3. réinitialiser un vector dans une boucle
    Par befalimpertinent dans le forum SL & STL
    Réponses: 8
    Dernier message: 31/10/2007, 14h39
  4. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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