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écupérer valeurs calculées dans boucle if


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2012
    Messages : 45
    Points : 28
    Points
    28
    Par défaut Récupérer valeurs calculées dans boucle if
    Bonjour,

    je souhaiterais réaliser une boucle if comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     m=[1:1:10]
     if m > 4
        a=1;
     else
        a=0;
     end
    Et je voudrais ensuite créer un tableau avec les différentes valeurs de a.
    Ici ce serait donc un tableau de 10 lignes, avec 0 dans les 4 premières lignes, et 1 dans les 6 lignes restantes.


    Si quelqu'un pouvait m'aider.

    Merci

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    tout d'abord, 1:1:10 peut être remplacé par 1:10. Ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    % avec une boucle
    m=[1:1:10];
    a= []; % NB: on peut aussi préallouer a via "a= nan(size(m));"
     if m > 4
        a(end+1)=1;
     else
        a(end+1)=0;
     end
     
    % version vectorisée, avec indexation booléenne
    m=[1:1:10];
    a= zeros(size(m)); % initialise à 0
    a(m>4)= 1: % mets des 1 aux emplacements ou m>4

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Les crochets m = [1:1:10]; sont inutiles, tu n'effectues pas de concaténation.

    On peut faire directement a = m>4;.

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Attention aux types:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    a= m>4; % vecteur de booléens
    a= zeros(size(m)); a(m>4)= 1: % vecteur de floats

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 94
    Points : 122
    Points
    122
    Par défaut
    Ou alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = +(m>4); % vecteur de flottants

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2012
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Heu, c'est quoi la différence entre booléens, floats et flottants?
    La taille des variables stockées?

    Et en fait je me suis trompé dans mon code...
    Le code que je veux faire c'est quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    l=[1 2 3 4 5 6 7 8 9 10]
     
    for m=1:10
     
      a(m>4)=  m./l; 
      a(m<=4)=0;
      ma(:,m)=[a]
     
    end

    C'est pour ça que je parlais de tableau, parce que je veux récupérer les valeurs de 'a' EN DEHORS de ma boucle for

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 94
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par clem3900 Voir le message
    Heu, c'est quoi la différence entre booléens, floats et flottants?
    La taille des variables stockées?

    Et en fait je me suis trompé dans mon code...
    Le code que je veux faire c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for m=1:10
      aa(m>4)= 1; 
      aa(m<=4)=0;
    end
    C'est pour ça que je parlais de tableau, parce que je veux récupérer les valeurs de 'a' EN DEHORS de ma boucle for
    Pour les booléens/flottants/double, je te recommande de lire ce petit passage dans la FAQ Comment déterminer approximativement la quantité de mémoire nécessaire pour le stockage d'une variable ?

    Si je comprends bien, tu vas comparer chacun des éléments compris entre 1 et 10 avec 4, et si le i-ième élément est inférieur ou égal à 4, alors a(i) = 0, sinon, a(i) = 1 ?

    Dans ce cas, pas besoin de faire de boucles, tu peux vectoriser le calcul en transformant:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    aa = zeros(1,10);
    for m=1:10
      aa(m)= m>4; 
    end

    en:
    La différence sera que dans la deuxième méthode, aa sera un vecteur de booléens, soit 10 octets pour tout le vecteur, tandis que dans l'autre cas, ce sera un vecteur de Double, soit 10*8 = 80 octets pour le vecteur.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Pour information, on peut aussi obtenir un vecteur de booléens avec une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    aa = false(1,10);
    for m=1:10
      aa(m)= m>4; 
    end

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2012
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Boumbata désolé mais j'ai changé le code après que tu ais posté...

    Ce que je veux faire c'est si m=5, alors a(5)=m./l, ce qui me donne un vecteur 1x10 (à cause de 'l' qui est de taille 1x10) que j'enregistre dans la 1ère ligne d'un tableau 'ma'. De même pour m=6,7,8,9,10. Et quand m<4, dans mon tableau j'enregistre des lignes de 0.
    A la fin j'aurai donc un tableau 10x10 dont 4 lignes seront uniquement des 0.

    J'espère que c'est plus clair...

  10. #10
    Invité
    Invité(e)
    Par défaut
    Tu as déjà pas mal d'éléments en main. Je t'invite à effectuer une recherche sur le forum avec les mots clé "indexage logique", ce genre de manipulation ayant déjà été effectué plus d'une fois.

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 94
    Points : 122
    Points
    122
    Par défaut
    a lol oui ça change un peu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    m = 1:10;
    l = rand(1,10); % je ne connais pas ton l, donc je prends random
    ma = repmat((m.*(m>4)).',size(m))./repmat(l,size(m.'));
    La fonction repmat permet de répliquer une matrice n*m fois. Cette méthode permet d'éviter les boucles for.

  12. #12
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Outre le stockage en mémoire, le simple exemple suivant plante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    m = rand(10,1)> 4; %type bool
    m==1; % erreur de type

  13. #13
    Invité
    Invité(e)
    Par défaut
    @Boumbata : On peut aussi utiliser bsxfun qui est généralement plus rapide.

    @VV33D : m possédant des valeurs logiques, quel est l'intérêt de faire m==1; ?

Discussions similaires

  1. Recupérer des valeurs calculées dans une boucle
    Par Medoou dans le forum MATLAB
    Réponses: 40
    Dernier message: 23/07/2009, 14h12
  2. récupérer valeur entre " " dans string
    Par L4BiN dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 25/10/2007, 11h35
  3. récupérer valeur sql - dans un script batch
    Par persam dans le forum SQL
    Réponses: 6
    Dernier message: 09/08/2007, 16h22
  4. Récupérer valeurs situé dans un repeater
    Par LaDeveloppeuse dans le forum ASP.NET
    Réponses: 2
    Dernier message: 20/06/2007, 12h28
  5. Réponses: 2
    Dernier message: 22/05/2007, 16h15

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