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 :

Retenir valeurs d'un vecteur selon conditions [Débutant]


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 15
    Points
    15
    Par défaut Retenir valeurs d'un vecteur selon conditions
    je possède deux vecteurs x et y je veux trié leurs valeurs en utilisant des intervalles a fin de pouvoir éliminer le surplus comment faire !! 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 : 40
    Localisation : France

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

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

    Pourrais-tu mettre un exemple de ce que tu veux faire (un apercu des vecteurs d'entrée et du résultat souhaité)?

    Par exemple si tu veux supprimer toutes les valeurs inférieures à 0 d'un vecteur A tu peux faire de la façon suivante:
    Duf

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 15
    Points
    15
    Par défaut rep
    merci!!
    voila un exemple:
    deux vecteurs contenant 100 chiffres chaque un je veux tracer l'un en fonction de l'autre !! en utilisant des intervalles bien déterminer je dois éliminer les valeurs dont j'en ai pas besoin !!(posant des conditions) voila

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Sans plus de précision, je te propose ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    x = 1:100;
    y = rand(100,1);
    idx = y < 0.5; % Ici on ne retient que les valeurs de y inférieures à 0.5, à adapter selon ton cas
    plot(x(idx),y(idx))
    %% Ou:
    x(~idx) = [];
    y(~idx) = [];
    figure,plot(x,y)

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 15
    Points
    15
    Par défaut rep
    Merci c'est exactement se que je voulais mais j'ai essayé le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for'x'>0.3
        idx='y'>09
        for  0.31<'x'<0.7
            idx= 0.2<'y'<0.9
            for 'x'>0.7
                idx='y'<=0.2
            end
        end 
    end 
    plot(x(idx),y(idx))
    ça m'affiche
    Error: 
    Unexpected MATLAB expression
    . !! j'ai mis mes varraibles entre parantheses rien n'y est ??

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ton code n'a aucun sens
    Pourquoi as-tu mis des guillemets? 'x' et 'y' sont alors des caractères et non les variables définies avant.
    Les boucles n'ont pas leur utilité avec l'indexage logique.
    Essai de comprendre mon message précédent en exécutant ligne par ligne mon code, et regardant le contenu à chaque fois.

    PS: Pour avoir deux conditions (a < x < b, a et b scalaires), il te faut faire idx = a < x & x < b;. Attention de n'utiliser dans ce cas qu'un seul &.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 15
    Points
    15
    Par défaut rep
    x et y c'est des vecteurs
    et je dois conditionner sur les valeurs appartenant à ces deux la !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    idx= x < 0.3 % je prends les valeurs x inf à 0.3
    idx= y >= 0.9 % je lui fais correspondre  des y>=0.9
    ainsi de suite !!
    idx= 0.31<x & x<0.2
    idx= 0.21<y & y< 0.9
    idx=x>0.7 
    idx=y >= 0.2
    plot(x(idx),y(idx),'+')
    je me demande toujours si c'est correcte ou pas ?? MERCI D'avance

  8. #8
    Invité
    Invité(e)
    Par défaut
    Alors la syntaxe est maintenant bonne, cependant, il y a un problème de logique:
    En effet la façon dont tu le fais ne cumule pas les résultats, mais les remplace à chaque ligne.
    C'est comme si tu faisais (en simplifié):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    idx = 2;
    idx = 3;
    idx = 1;
    ...
    idx = 6;
    Seule la dernière ligne compte, idx sera égal à la fin à 6, quelles que soient les lignes précédentes.
    Autrement dit dans ton cas, seule la ligne idx=y >= 0.2 sera retenue.

    Pour réunir toutes ces conditions, tu as deux posibilités:
    - Soit tu fais le tout en une seule ligne en combinant les opérateurs logiques & et | comme dans mon précédent post avec idx = a < x & x < b.
    - Soit tu fais plusieurs lignes, et dans ce cas tu gardes la première ligne tel quelle, mais les autres seront de la forme idx = idx & y >= 0.9; ou idx = idx | y >= 0.9; à voir selon ton cas.
    Dernière modification par Invité ; 23/03/2019 à 14h21.

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 15
    Points
    15
    Par défaut rep
    bonsoir !!
    j'ai toujours le meme problème avec le programme voila une pièce jointe pour bien éclairer les choses !
    Images attachées Images attachées  

  10. #10
    Invité
    Invité(e)
    Par défaut
    Il te faut donc lier les conditions sur x et y avec des & et les intervalles par des |. Ce qui donnerait si j'ai bien compris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    % Valeurs x et y juste pour l'exemple, à remplacer par les tiennes
    x = (0:0.01:1)';
    y = rand(101,1);
    N1 = length(x(x<0.3));
    N2 = length(x(0.3<=x & x<=0.7));
    N3 = length(x(0.7<x));
    sup = [ones(1,N1) , linspace(1,0.3,N2) 0.3*ones(1,N3)]';
    inf = [0.9*ones(1,N1) , linspace(0.9,0.2,N2) 0.2*ones(1,N3)]';
    idx = inf<=y & y<=sup;
    plot(x,y),hold on
    plot(x(idx),y(idx),'rp')
    plot(x,inf,'g')
    plot(x,sup,'g')
    Dernière modification par Invité ; 21/05/2011 à 13h36.

  11. #11
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 15
    Points
    15
    Par défaut rep
    bonsoir !! le programme proposé ne fonctionne pas et la fonction 'hold on' je vois pas son utilité

    bon je vais expliqué d'une autre manière !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    je dois éliminer les valeurs y inférieurs à 0.9  et les valeurs   x inférieurs à 0.3 (référez  vous à l'image )
    sachant que les valeurs appartenant au vecteurs  y et x sont anarchiques (dire que je dois les trier )  
     
     
    suite: pour x ϵ [0.3,0.7] j'elimine les valeurs  0.2>y>0.9
             pour les x >=0.7 j'elimine les valeurs  y>=0.2
    merci infiniment pour votre patience !!

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ce n'est pas vraiment ce que représente ton image
    Mais en t'inspirant du code que je t'ai fourni et le premier message de Duf42, tu devrais y arriver.

    Exécute mon code avec et sans hold on et tu verras la différence.

  13. #13
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 15
    Points
    15
    Par défaut rep
    bonsoir !!
    bon voila je désespère des tests logiques!! j'essaye les boucles peut etre c'est plus facile

    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
    for i =1,n  vecteur 
    if  0<x & x<=0.3
          0.9<y & y<=1
    then (j'ouvre un fichier pour stocker  les valeurs retenus  )
    else if 0.3<x & x<=0.7
             0.2<y & y<0.9
    then (j'ouvre un 2ieme fichier pour stocker  les valeurs retenus  )
    else if x >0.7
             y >=0.2
    then  (j'ouvre un 3ieme fichier pour stocker  les valeurs retenus  )
     
    end 
    end 
    end 
    end
    après je trace mon graphe !! je ne sais pas si c'est réalisable sur matlab mais au moin est- ce que l'idée est juste merci d'avance !!

  14. #14
    Invité
    Invité(e)
    Par défaut
    D'après ton post#11, le graphique ressemblerait plutôt à ceci (pièce jointe), les zones blanches étant les zones à retenir.
    Donc est-ce que c'est cela ou pas?

    Si toutefois ça l'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idx = x<0.7 & y>=0.9 | x>0.3 & y<0.2;
    plot(x,y,x(idx),y(idx),'r.')
    Images attachées Images attachées  

  15. #15
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    malheureusement pas


    pour la première et la troisième partie on dois faire le contraire dire que la partie hachurée est a éliminer ; pour la second dans l'intervalle 0.3 et 0.7 j'elimine les valeurs sup a 0.9 et inf a 0.2 'les points appartenant a la surface limité par les deux pentes représenté sur mon image "!! voila :

  16. #16
    Invité
    Invité(e)
    Par défaut
    Dans ce cas, tu peux reprendre le code de mon post#14 pour x<0.3 et 0.7, mais vu que tes
    y et x sont anarchiques
    pour 0.3 < x < 0.7, il te faudra pour les pentes interpoler les valeurs obtenues par la fonction linspace (post#10) par les valeurs des xi correspondants. Tu pourras faire cela grâce à la fonction interp1

  17. #17
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 15
    Points
    15
    Par défaut rep
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idx = kt<0.3 & fr>=0.9 |kt>0 & fr<1
    idx =idx =kt>0.7 & fr>=0.2
    Inacceptable sur matlab , comme vous avez dis la seconde ligne efface automatiquement la première !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    plot(kt(idx),fr(idx),'+')
    N2 = length(x(0.3<=kt  & kt<=0.7))
     
    sup = [ones(1,N1) , linspace(1,0.3,N2) 0.3*ones(1,N3)]';
    inf = [0.9*ones(1,N1) , linspace(0.9,0.2,N2) 0.2*ones(1,N3)]';
    idx = inf<=y & y<=sup;
    je ne me retrouve pas avec ces fonction la c'est trop difficile a comprendre !!

    ps:si ya moyen pour ouvrir un fichier à fin de stocker des données je suis prise svp !!

  18. #18
    Invité
    Invité(e)
    Par défaut
    Si j'ai bien compris cette fois-ci:
    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
    %% Génération des valeurs x et y
    N = 1000;
    x = rand(N,1);
    y = rand(N,1);
    %% Premier et dernier intervalle
    idx1N3 = x<0.3 & y>=0.9 | 0.7<x & y<=0.2; % Indexage logique
    %% Deuxième intervalle
    x2 = x(0.3<=x & x<=0.7); % Sélection des valeurs x telles que 0.3<= x <=0.7 
    y2 = y(0.3<=x & x<=0.7); % Sélection des valeurs y telles que 0.3<= x <=0.7 
    inf = linspace(1,0.3,length(x2));   % Pente du dessus
    inf = interp1(linspace(0.3,0.7,length(x2)),inf,x2); % Ajustement par rapport aux valeurs de x2
    sup = linspace(0.9,0.2,length(x2)); % Pente du dessous
    sup = interp1(linspace(0.3,0.7,length(x2)),sup,x2); % Ajustement par rapport aux valeurs de x2
    idx2 = y2<sup | y2>inf; % Indexage logique
    %% Affichage
    plot(x,y,'.'),hold on
    plot(x2(idx2),y2(idx2),'g.')
    plot(x(idx1N3),y(idx1N3),'r.')
    plot([0 0.3 0.3 0.7 0.7],[0.9 0.9 1 0.3 1],'k:')
    plot([0.3 0.3 0.7 1],[0 0.9 0.2 0.2],'k:')
    Si ça ne correspond pas tout à fait aux valeurs à retenir, tu as juste à mettre les bons signes et valeurs aux bons endroits.
    Pour écrire dans un fichier: fopen/fprinft/fclose, une recherche dans le forum te fournira des exemples.

    PS: Prends l'habitude de toujours regarder la documentation Matlab des fonctions que tu veux utiliser (en tapant doc nom_de_la_fonction) tu y trouveras des exemples pour justement comprendre leur fonctionnement.

  19. #19
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 15
    Points
    15
    Par défaut rep
    bonsoir !! le programme n'as pas fonctionné !!
    j'ai essayé avec l'autre code :import data je sépare mes vecteurs de la matrice a l'aide de x=m(:,1)
    y=m(:,2)
    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
    for n=1:100
        if  x(n)>0.3
            1  > y(n)>0.9
        end
        %je voulais nommer le vecteur résultat
        res=[]
        k=1
        for n=1:
            res(k)=ans(n)
            k=k+1
        end
        % je stocke mes valeurs dans un fichier txt
        fid =fopen(stock.'txt'.'wt');
        for k=1:
            fprintf(fid,'%0.2f/t',res(k));
        end
        fprintf(fid,'\n');
        fcolse(fid);
    ext ce que quelqu'un peut me corrigé ce code !! merci d'avance

  20. #20
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Dire "ça n'a pas fonctionné" ne donne aucun renseignement utile

    Essaye de comprendre au moins ce que tu fais.

    La ligne 3 est censée faire quoi ?

    Tes boucles FOR sont incomplètes : il manque la borne supérieure. Comme WinJérôme l'a dit lis la documentation : doc forLigne 9 : d'où vient cette variable ANS ? C'est dangereux d'utiliser une variable nommée ANS puisque c'est une fonction de MATLAB. Toujours pareil voir doc ansEt puis pourquoi utiliser 2 variables n et k qui vaudront la même chose ?

    Ligne 13 : c'est quoi stock ?


    Bref beaucoup d'erreurs que MATLAB te signale et qui sont évitables en LISANT LA DOCUMENTATION.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/02/2013, 10h04
  2. [2008] Changement de valeur d'une colonne selon condition
    Par jubourbon dans le forum SSIS
    Réponses: 3
    Dernier message: 08/03/2012, 18h14
  3. [CR 9] appel valeur selon condition formule
    Par perezlyon dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 16/02/2011, 14h19
  4. [PHP 5.3] Changement de valeur variable selon condition
    Par arthuro45 dans le forum Langage
    Réponses: 10
    Dernier message: 20/06/2010, 21h36
  5. Condition sur toutes les valeurs d'un vecteur
    Par Newenda dans le forum MATLAB
    Réponses: 2
    Dernier message: 11/06/2009, 15h50

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