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 :

Mieux utiliser la fonction intersect [Débutant]


Sujet :

MATLAB

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut Mieux utiliser la fonction intersect
    Bonjour,

    Ce sujet rejoint un ensemble de sujets consacrés au même thème. Je vais essayer de formaliser au mieux ce que je fais afin d'obtenir, si c'est possible, une aide.

    Je me donne d'abord les deux vecteurs suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ev_Imp1_LM=[3 8
    16 19
    22 24
    ];
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ev_Imp2_LM=[1 3
    8 16
    19 24];
    Il se trouve que je dispose d'une fonction appelée creerbis.m qui appliquée à l'un ou l'autre de ces vecteurs permet d'écrire en une colonne les lignes de l'un ou l'autre par pas de 1, c'est-à-dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ev_Imp1_LM_colonne=[3
    4
    5
    6
    7
    8
    16
    17
    18
    19
    22
    23
    24];
    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
    ev_Imp2_LM_colonne=[1
    2
    3
    8
    9
    10
    11
    12
    13
    14
    15
    16
    19
    20
    21
    22
    23
    24];
    Ensuite, je réalise l'intersection de ces derniers vecteurs colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ev_Imp12_LM_colonne=[3
    8
    16
    19
    22
    23
    24];
    Voilà, pour finir je dispose d'une fonction deb_fin_extrema.m qui à partir de ce dernier vecteur colonne va me réécrire le vecteur à deux colonnes correspondant en rassemblant les résultats par intervalles (il n'y aura donc plus trace du pas de 1) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ev_Imp12_LM=[3 3
    8 8
    16 16
    22 24];
    C'est tout. Mais je n'ai pas l'impression d'avoir obtenu l'intersection "matricielle" de ev_Imp1_L et ev_Imp2_L de mes deux premiers vecteurs c'est-à-dire l'intersection d'un intervalle d'une ligne i de l'un avec l'intervalle correspondant de la même ligne de l'autre : par exemple l'intersection de [3:8] avec [1:3] est [3:3], celle de [16:19] avec [8:16] est [8 8] puis la suivante est [22:24] mais dans le résultat ci-dessus il y a [16 16] qui ne correspond pas à une intersection ligne par ligne des deux premiers vecteurs.

    Bref, je sens bien qu'il y a quelque chose de faux dans mon raisonnement ou des histoires d'inclusions mais où ? L'autre problème c'est que les deux premiers vecteurs ont le même nombre de lignes mais pas forcément le même nombre de colonnes. C'est pourquoi j'ai "contourné" la difficulté en faisant une sorte de passe-passe : en passant à 1 colonne puis en repassant à 2 à la fin.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Je ne suis pas sûr d'avoir bien suivi mais ne devrais-tu pas utiliser la fonction union à la place de intersect ?
    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)

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci Dut pour ta réponse, en fait j'y ai déjà pensé. Mais, malgré tout, je me trouve dans une sorte d'impasse : j'ai l'impression que ce que j'ai fait jusque-là n'a pas de sens, de même que ce que je demande. Déjà, si je veux faire l'intersection "matricielle" de ev_Im1_LM et ev_Imp2_LM ci-dessus au sens où je l'entends, c'est-à-dire voir chaque ligne comme un intervalle d'entier : donc pas [3 8] mais [3:8] par exemple, je ne pourrais pas le faire ligne par ligne si les deux vecteurs n'ont pas le même nombre de lignes. De plus, Il se trouve qu'ils n'ont jamais le même nombre de lignes en fait.

    Finalement, cela paraît bête à dire mais je n'arrive plus à comprendre ce que j'obtiens dans le vecteur en bas ev_Im12_LM :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ev_Imp12_LM=[3 3
    8 8
    16 16
    22 24];
    Je ne sais pas quel sens donner aux événements que j'obtiens dans ce dernier vecteur : en passant les vecteurs à 2 colonnes en vecteurs à 1 colonne puis en faisant leur intersection et enfin en repassant le vecteur obtenu en vecteur à 2 colonnes, qu'est-ce que j'obtiens finalement ? C'est ces opérations dont je ne suis pas sûr.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Bonjour,

    Je poursuis sur ce sujet puisque j'ai un problème relativement similaire :

    J'ai d'abord le vecteur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    tab=[60 68
    61 66
    136 138
    158 164]
    A nouveau j'appelle événements les intervalles [60:68], [61:66] comptés par pas de 1 : [60:68]={60 61 62 63 64 65 66 67 68} par exemple. J'ai besoin de trouver les intervalles inclus les uns dans les autres : dans l'exemple tab il n'y a qu'un seul cas comme cela : [61:66] est inclus dans [60:68] et je voudrais remplacer dans tab les deux lignes 60 68 et 61 66 par une seule ligne qui serait les bornes de l'union de ces deux lignes, [60 68] ici. Voilà, pour l'union je vois comment faire mais comment formaliser la recherche des inclusions ? On pourrait peut-être voir le problème avec des intersections.

    EDIT:

    J'ai une idée qui est la suivante : faire l'intersection deux à deux des événements et voir quand celle-ci n'est pas nulle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    ligne=[];
    for i=1:size(tab,1)-1
        deb=tab(i,1:2);
        fin=tab(i+1,1:2);
        if ~isempty(intersect([deb(1):deb(end)],[fin(1):fin(end)]))
            ligne=[ligne;i];
        end
     
    end

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

Discussions similaires

  1. [ASP] Utiliser la fonction PAD
    Par Hell dans le forum ASP
    Réponses: 4
    Dernier message: 31/03/2005, 16h23
  2. manuel d'utilisation de fonction
    Par SteelBox dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 11/10/2004, 01h28
  3. Utiliser des fonctions Pascal
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/03/2004, 15h43
  4. Réponses: 11
    Dernier message: 22/12/2003, 21h06
  5. impossible d'utiliser ma fonction dans un insert
    Par caramel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/04/2003, 15h04

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