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 :

Recherche conditionelle et extraction de valeurs dans un tableau [Débutant]


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 31
    Points : 13
    Points
    13
    Par défaut Recherche conditionelle et extraction de valeurs dans un tableau
    Bonjour,

    J'ai une question de programmation concernant l'utilisation des données d'un tableau sous matlab.

    Mon problème est le suivant :

    J'ai un tableau avec n nombre de ligne et m nombre de colonne. Dans ce tableau je voudrais chercher dans une mième colonne toute les valeur supérieur a une condition et pour cette condition rempli prendre les valeurs de toute la ligne.

    Existe t-il une fonction qui remplisse directement cette fonction ou alors faut -il passer par une programmation du type boucle.


    Merci d'avance

    a+

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

    L'indexage logique suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    n = 5;
    m = 5;
    M = rand(n,m);
    condition = 0.5;
    colonne = 3;
    M(M(:,colonne)>condition,:)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Merci pour ces premières infos.

    En fait j'importe un fichier xls sous matlab que je met dans mon workspace et c'est à partir de ce fichier ou j'ai mes lignes et colonnes que je veux appliquer mon programme. Le truc c'est que j'arrive pas a dire a Matlab que mes n et m lignes et colonnes correspondent a celles du tableau pour venir piocher les infos dedans.

    a+

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour, ce serait plus simple si tu nous montrais le code que tu as testé et les résultats ou message d'erreur que tu as obtenu.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    mon tableau c'est :

    nom:essai1

    1	12	456
    2	36	478
    3	548	495
    4	56	41
    mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    D=essai1(3,2);
    T=essai1(:,1);
    G=essai1(:,2);
    R=essai1(:,3);
     
    for i=1:n
        for j=1:m
            if G>20
                Tbis=T(i,j);
            end
        end
    end
    quand je demande a matlab de me donner Tbis il me marque :

    ??? Undefined function or variable 'Tbis'.
    l'idée c'était de créer une nouvelle matrice avec les nouvelles valeurs qui remplissent m conditions.

    merci encore pour votre aide.

    a+

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ta boucle for n'a pas de sens:
    - Tu utilises T(i,j) alors que
    T =
    
         1
         2
         3
         4
    - Tu vérifies à chaque itération si toutes les valeurs de G sont supérieures à 20.

    Avec ce que tu demandes, ce serai plutôt une boucle du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Tbis = [];
    for i = 1:n
        if G(i)>20
            % à toi de voir entre:
            Tbis = [Tbis ; T(i)] % les valeurs de T
            Tbis = [Tbis ;essai1(i,:)] % toute la ligne
        end
    end
    Et avec mon code du post précédent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %% Toute les lignes : 
    Tbis = essai1(essai1(:,2)>20,:) 
    Tbis = essai1(G>20,:) % même chose avec G
    %% Juste la 1ère colonne T:
    Tbis = essai1(essai1(:,2)>20,1) 
    Tbis = essai1(G>20,1) % même chose avec G
    Tbis =T(G>20) % même chose avec T et G
    Dernière modification par Invité ; 17/12/2011 à 22h18.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Merci pour cet aide.

    Quand je le test ca marche mais que pour une condition si par exemple je veux rajouter une autre condition du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i = 1:n
            if G(i)>20 
            Tbis = [Tbis ;essai1(i,:)]
            elseif R(i)>100
            Tbis = [Tbis ;essai1(i,:)]
            end
    end
    Il me donne toute la matrice initiale et ne respecte donc pas les conditions.
    Et si j'ecris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Tbis = [];
    for i = 1:n
     
            if G(i)>20 
            %Tbis = [Tbis ;essai1(i,:)]
            elseif R(i)>100
            Tbis = [Tbis ;essai1(i,:)]
            end
    end
    il me donne :

    Tbis =
    
         1    12   456
    donc rien a voir avec la condition.

    Merci encore pour l'aide.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Avec ton exemple,
    [G R] = 
    
        12   456
        36   478
       548   495
        56    41
    Donc toutes les lignes remplissent au moins une des conditions R(i)>100 et G(i)>20 Il est alors normal que tu obtiennes toute ta matrice initiale puisque tu remplis Tbis dans chaque condition.

    Avec ton 2nd code, c'est comme si tu faisais la condition not(G(i)>20) && R(i)>100, autrement dit seulement la première ligne.
    Il me vient donc une question: Qu'est-ce que tu cherches à faire exactement?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    en fait je voudrais que les deux conditions soient rempli c'est à dire que dans mon tableau je veux trouver les valeurs pour lesquelles ma deuxieme colonne (G>20)et ma troisieme colonne (R>100) donc en théorie il me sortirai :

    2 36 478
    3 548 495

    merci d'être patient.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    en essayant ton code précédant avec la condition (G(i)>20 && R(i)>100) j'ai bien les deux lignes du milieu.

    Merci beaucoup pour ton aide je peux continuer d'avances dans mon programme.

    Merci beaucoup.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Dans ce cas, il te faut réunir les deux conditions ensemble et non les séparer par un elseif (signifiant si G(i)>20 est faux, mais R(i)>100 est vérifié):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Tbis = [];
    for i = 1:n
        if G(i)>20 && R(i)>100
            Tbis = [Tbis ;essai1(i,:)]
        end
    end
    Ou avec ma méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tbis = essai1(G>20 & R>100,:)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/11/2014, 21h49
  2. Rechercher la plus proche valeur dans un tableau
    Par neoMatrix dans le forum MATLAB
    Réponses: 2
    Dernier message: 16/05/2007, 11h45
  3. rechercher la plus proche valeur dans un tableau ?
    Par Slumpy dans le forum VB.NET
    Réponses: 3
    Dernier message: 13/04/2007, 14h06
  4. Rechercher une valeur dans un tableau
    Par pafi76 dans le forum Access
    Réponses: 2
    Dernier message: 29/06/2006, 14h23
  5. [Tableaux] Extraction de valeur dans un tableau
    Par pirouette_07 dans le forum Langage
    Réponses: 6
    Dernier message: 21/10/2005, 17h54

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