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 :

Trouver le vecteur C complémentaire de B par rapport au vecteur A


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    Points : 19
    Points
    19
    Par défaut Trouver le vecteur C complémentaire de B par rapport au vecteur A
    Bonjour,
    petite question ...

    j'ai un vecteur A, j'utilise la fonction "find" pour définir un nouveau vecteur B suivant les conditions désirées sur d'autres vecteurs.
    maintenant, je veux le vecteur C qui serait les autres valeurs de A

    sachant, que mes conditions sont diverses et nombreuses, je ne veux pas faire un "find" pour mon C.
    comment puis-je obtenir C, qui est donc le vecteur A sans les lignes de B ??


    merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Points : 100
    Points
    100
    Par défaut
    Vu ici :

    http://www.developpez.net/forums/d68...ments-vecteur/

    La fonction à utiliser serait setdiff.

    Bonne journée
    Pour ceux qui veulent bronzer avec autre chose que des tubes cathodiques : quelques idées de balades !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    Bon, je vais préciser ma question

    je ne cherche pas à enlever les valeurs identiques mais les lignes

    A ==> B ==> C
    a1 a2 a1
    a2 a4 a3
    a3 an a5
    a4
    a5
    an

    sachant que les valeurs de a1 peuvent etre egales a a2, par exemple

  4. #4
    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 830
    Points
    14 830
    Par défaut
    Peux-tu montrer exactement comment tu as trouvé B ?
    Normalement avec find tu récupères les indices.
    Donc les indices des lignes restantes sont facilement récupérables avec SETDIFF.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A=rand(1,10)
    idx=find(A>0.5)
    B=A(idx)
    C=A(setdiff(1:length(A),idx))
    Sachant que cela peut s'écrire plus "joliment" avec l'indexage logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A=rand(1,10)
    idx=A>0.5
    B=A(idx)
    C=A(~idx)
    Règles du Forum

    Adepte de la maïeutique

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par j_ere_my Voir le message
    Bon, je vais préciser ma question

    je ne cherche pas à enlever les valeurs identiques mais les lignes

    A ==> B ==> C
    a1 a2 a1
    a2 a4 a3
    a3 an a5
    a4
    a5
    an

    sachant que les valeurs de a1 peuvent etre egales a a2, par exemple
    ??? Tu dis ne pas vouloir enlever les valeurs mais les lignes. (a1 peut être égal à a2). Donc si je reprends ton exemple avec des chiffres tu veux :
    A : 1 1 2 3 4 5
    B : 1 2 3
    C : 1 4 5

    Je ne vois pas comment cela est possible, vu que avec les éléments que tu nous donne, on a aucun moyen de distinguer le premier "1" du second "1".
    Pour ceux qui veulent bronzer avec autre chose que des tubes cathodiques : quelques idées de balades !

  6. #6
    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 830
    Points
    14 830
    Par défaut
    Citation Envoyé par Loïc B. Voir le message
    Je ne vois pas comment cela est possible, vu que avec les éléments que tu nous donne, on a aucun moyen de distinguer le premier "1" du second "1".
    Si par les indices.
    La solution que j'ai proposée fonctionnera très bien.
    Règles du Forum

    Adepte de la maïeutique

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    ok ca a marche, merci beaucoup

    en fait, il me faut 3 vecteurs dans A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    strat=find(cl1pv12>3 & cl2pv12>3 & cl3pv12>3 & cl4 .....
    xst=x(strat);
     
    tropo=find(cl1pv12<2 & cl2pv12<2 & cl3pv12<2 & cl4pv12<2 .....
    xtr=x(tropo);
    je veux donc toutes les lignes n'appartenant ni a strat ni a tropo, appelé suspe2

    j'ai fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    suspe=x(setdiff(1:length(x),strat));  !!!! j'enleve le vecteur strat
        suspe2=suspe(setdiff(1:length(suspe),tropo));    !!!!! j'enleve le vecteur tropo
    mais j'ai pas lenght x = lenght tropo + lenght strat + lenght suspe2
    j'ai un leger excedent dans le total des termes de droites

    si qq'un peut m'aider ....



    >> size (x)

    ans =

    28217 1

    >> size (strat)

    ans =

    6364 1

    >> size (suspe)

    ans =

    21853 1

    >> size (tropo)

    ans =

    3536 1

    >> size (suspe2)

    ans =

    18949 1

  8. #8
    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 830
    Points
    14 830
    Par défaut
    Ah ben non ça ne peut pas marcher !

    Dans la variable tropo tu as les indices par rapport à x pas par rapport à suspe.

    Pourquoi ne donnes-tu pas sa chance à l'indexage logique ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    strat=cl1pv12>3 & cl2pv12>3 & cl3pv12>3 & cl4 .....
    xst=x(strat);
     
    tropo=cl1pv12<2 & cl2pv12<2 & cl3pv12<2 & cl4pv12<2 .....
    xtr=x(tropo);
     
    suspe2=x(~strat & ~tropo)
    Règles du Forum

    Adepte de la maïeutique

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    ??? Error using ==> and
    Matrix dimensions must agree.

    Error in ==> clustplot at 359
    suspe=x(~strat & ~tropo);

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    bon ca a marché

    je te remercie caroline, j'ai laissé sa chance à l'indexage logique

    Bonne soiree

  11. #11
    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 830
    Points
    14 830
    Par défaut
    Ah oui le problème c'est que tes conditions ne sont pas sur le vecteur x...
    Par curiosité c'est quoi les variables cl1pv12 ... ?
    Est-il possible d'avoir les lignes entiètes des conditions ?

    Parce que si tu utilises FIND il faut quand même bien que tu trouves des indices par rapport à x (sinon ce n'est pas logique, et tu risques de tomber sur des indices qui ne sont pas dans 1:length(x)).
    Règles du Forum

    Adepte de la maïeutique

  12. #12
    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 830
    Points
    14 830
    Par défaut
    Citation Envoyé par j_ere_my Voir le message
    bon ca a marché

    je te remercie caroline, j'ai laissé sa chance à l'indexage logique

    Bonne soiree
    Bon nos messages se sont croisés.

    J'espère surtout que tu as compris comment cela fonctionne afin de pouvoir le réutiliser par la suite
    Règles du Forum

    Adepte de la maïeutique

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    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
     
    cl1pv12=x1(:,13); .....
    cl1pv12=cl1pv12(~isnan(x.*y))....
     
    strat=(cl1pv12>3 & cl2pv12>3 & cl3pv12>3 & cl4pv12>3 & cl5pv12>3 & cl1pv24>3 & cl2pv24>3 & cl3pv24>3 & cl4pv24>3 & cl5pv24>3 & cl1pv36>3 & cl2pv36>3 & cl3pv36>3 & cl4pv36>3 & cl5pv36>3 & cl1pv48>3 & cl2pv48>3 & cl3pv48>3 & cl4pv48>3 & cl5pv48>3 & cl1pv60>3 & cl2pv60>3 & cl3pv60>3 & cl4pv60>3 & cl5pv60>3 & cl1pv72>3 & cl2pv72>3 & cl3pv72>3 & cl4pv72>3 & cl5pv72>3);
     
    xst=x(strat);
    yst=y(strat);
     
    tropo=(cl1pv12<2 & cl2pv12<2 & cl3pv12<2 & cl4pv12<2 & cl5pv12<2 & cl1pv24<2 & cl2pv24<2 & cl3pv24<2 & cl4pv24<2 & cl5pv24<2 & cl1pv36<2 & cl2pv36<2 & cl3pv36<2 & cl4pv36<2 & cl5pv36<2 & cl1pv48<2 & cl2pv48<2 & cl3pv48<2 & cl4pv48<2 & cl5pv48<2 & cl1pv60<2 & cl2pv60<2 & cl3pv60<2 & cl4pv60<2 & cl5pv60<2 & cl1pv72<2 & cl2pv72<2 & cl3pv72<2 & cl4pv72<2 & cl5pv72<2);
    % 
    xtr=x(tropo);
    ytr=y(tropo);
     
     
     
        suspe=x(~strat & ~tropo);
        xsus=x(suspe);
        ysus=y(suspe);
     
     
    fprintf(fid,'%f %f....\n',x1(suspe,1),x1(suspe,2)....);    
    fclose(fid);
     
    figure (1)
        %hold on;
     
       scatter(xsus,ysus,3,'k')
    j'ai bien la bonne taille pour suspe, xsus, ysus
    mais qd je trace mon scater, g plus du tt le meme nombre de points, et mon ficher fid pareil

    tu as raison, je dois m'embrouiller dans les indexations

    pour répondre à ta curiosité, les conditions clnpvn correspondent à des informations lagrangiennes de rétrotrajectoires dans le temps, notamment ici, le tourbillon potentiel , traceur de masses d'aires.

  14. #14
    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 830
    Points
    14 830
    Par défaut
    Donc je suppose que tous les vecteurs utilisés pour tes conditions ont exactement la même taille que tes vecteur x et y (?).

    Là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        suspe=x(~strat & ~tropo);
        xsus=x(suspe);
        ysus=y(suspe);
    suspe devient un sous-ensemble de x.
    Si tu veux que suspe correspondent aux indices, il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        suspe=~strat & ~tropo;
        xsus=x(suspe);
        ysus=y(suspe);
    Règles du Forum

    Adepte de la maïeutique

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    ok

    derniere question ....
    je veux donc écrire dans un fichier les colonnes, au nombre de 100, qui correspondent au sous-ensemble "suspe"
    quand je fais mon fprintf , cela me met tous dans le désordre, en rassemblant les mêmes valeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fprintf(fid,'%f %f %f %f %f  ....\n,x1((suspe),1),x1((suspe),2),x1((suspe),3),x1((suspe),4),x1((suspe),5),x1((su.......
    fclose(fid);
    !!!! x1 étant la matrice de départ (n,100)
    et je pense que j'en aurais fini avec mes questions

    en tout cas, merci, je vois un peu mieux comment marche MATLAB si l'on opère en vecteur et pas en boucle

  16. #16
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 304
    Points : 52 889
    Points
    52 889
    Par défaut
    Jette un oeil à la fonction DLMWRITE

    Sinon, dans ton cas, il aurait fallut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fmt = [repmat('%f ',1,99) '%f\n'];
    fid = fopen('data.txt','wt');
       fprintf(fid, fmt, x1(suspe,:).');
    fclose(fid);
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  17. #17
    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 830
    Points
    14 830
    Par défaut
    Ne me dit pas que pour ton fprintf tu as écrit tous tes x1(suspe,i) ??

    Un conseil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %Création du format
    n=100;%on veut 100 colonnes de float
    str=repmat('%f ',1,100);
    fprintf(fid,[str,'\n'],x1(suspe,:));
    devrait fonctionner (à moins que x1 ait plus de 100 colonnes ?).

    Par contre je ne comprends pas ce que tu entends par "dans le désordre, en rassemblant les mêmes valeurs".
    MATLAB écrit ce que tu lui demandes d'écrire, donc peut-être que tes x1(suspe,i) ne correspondent pas à ce que tu attendais.
    Règles du Forum

    Adepte de la maïeutique

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    bon c'est génial, ca marche

    euh non j'ai pas écrit toutes les colonnes

    merci beaucoup

  19. #19
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 304
    Points : 52 889
    Points
    52 889
    Par défaut
    Citation Envoyé par Caro-Line Voir le message
    Par contre je ne comprends pas ce que tu entends par "dans le désordre, en rassemblant les mêmes valeurs".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    X = [1 2 3
         1 2 3
         1 2 3]
    
    fprintf('%d %d %d\n',X)
    fprintf('\n')
    fprintf('%d %d %d\n',X.')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    X =
     
         1     2     3
         1     2     3
         1     2     3
     
    1 1 1
    2 2 2
    3 3 3
     
    1 2 3
    1 2 3
    1 2 3
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

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

Discussions similaires

  1. [Débutant] Tri une matrice par rapport à un vecteur
    Par linda05 dans le forum MATLAB
    Réponses: 4
    Dernier message: 29/03/2014, 15h48
  2. [Débutant] tri sélectif de matrices par rapport à un vecteur
    Par Lalaine dans le forum MATLAB
    Réponses: 4
    Dernier message: 26/03/2009, 21h27
  3. Trier un vecteur par rapport à un autre
    Par jinrs dans le forum MATLAB
    Réponses: 3
    Dernier message: 07/09/2007, 15h58
  4. Trouver l'emplacement d'un pixel unique par sa couleur
    Par avigeilpro dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 06/07/2006, 14h57
  5. [SAX] Erreur pour trouver la DTD d'un fichier XML parsé!
    Par gdawirs dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 14/01/2006, 15h28

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