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 :

Un array un peu spécial [Débutant]


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Un array un peu spécial
    Bonjour,

    Je suis sur un projet : on me demande de le faire sur Matlab, je n'ai malheureusement aucune base en Matlab... Quoi qu'il en soit, voici mon problème.

    J'ai I individus (I est pair) et je souhaite pouvoir faire une matrice contenant par ligne toutes les paires possibles.

    Exemple :

    4 individus nommée 1, 2, 3 et 4. Je cherche à obtenir la matrice M comme suit :

    M = { [1 2] [3 4] ; [1 3] [2 4] ; [1 4] [2 3] }
    C'est donc un 3X2X2

    À prendre en compte : [1 2] [3 4] est identique à [1 2] [4 3] ou à [2 1] [3 4] ou finalement à [2 1] [4 3], donc je ne souhaite pas avoir une "simple" permutation des 4 chiffres.

    Avec 6 individus, ça devient tout de suite plus fastidieux :

    M = { [1 2] [3 4] [5 6] ; [1 2] [3 5] [4 6] ; [1 2] [3 6] [4 5] ; ... ; [1 6] [2 5] [3 4] }
    C'est donc un 15x3x2

    La matrice devrait donc être pour I

    [produit cumulé de 1 à I/2 de 2*I-1]x[I/2]x[2]

    Avez vous une idée comment procéder?

    Merci beaucoup pour toute aide!

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Bonjour,

    Quel est ton problème puisqu'à priori tu connais ton algol ?

    Christophe
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    En fait, je ne connais pas mon algorithme. Je sais ce qu'il doit donner (ayant fait à la main pour I = 2, 4 et 6), mais je n'ai aucune idée de comment obtenir cette matrice M avec uniquement le vecteur des individus (ex : ind= [1 2 3 4]) ou éventuellement juste I (ex : I=10).

    J'ai eu comme idée de faire une fonction qui se rappelle elle-même... mais n'étant pas programmeur, j'ai un problème beaucoup plus profond : je ne raisonne sans doute pas de la bonne manière.

    Si vous avez une idée de comment obtenir cette "matrice de vecteur" M...

    Stefan

  4. #4
    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 160
    Points
    53 160
    Par défaut
    Je ne suis pas sûr d'avoir bien compris le schéma de permutation...

    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    I = [1 2 3 4];
     
    M = perms(I);
     
    M(:,1:2) = sort(M(:,1:2),2);
    M(:,3:4) = sort(M(:,3:4),2);
     
    M = unique(M,'rows')
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    M =
     
         1     2     3     4
         1     3     2     4
         1     4     2     3
         2     3     1     4
         2     4     1     3
         3     4     1     2
    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)

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Merci, mais c'est malheureusement pas ce que je souhaite obtenir.

    En effet, avec ta méthode, je peux regrouper les termes 2 par 2 assez facilement, mais alors la ligne 1 et la ligne 8 sont les mêmes :
    Avoir 2 groupes [1 2] et [3 4] ou avoir 2 groupes [3 4] et [1 2], c'est la même chose pour moi.

    Mais je vais essayer de mieux comprendre ton code car il donne déjà un résultat intéressant. Cela dit, si tu comprends mieux ce que je cherche à faire et qu'il t'est facile de faire le code, je t'en serai très reconnaissant!

    Merci beaucoup pour ta réponse.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Voilà, alors maintenant, j'ai deux problèmes :

    1. La fonction "perms" est très très lente : prend déjà un certain temps, alors quand je vais devoir l'appliquer à mon problème concret de 100 individus, ça va me prendre la nuit Mais bon, si ce n'était encore que ça...

    1. À partir de la matrice que tu as créé, j'ai cherché un moyen d'éliminer les lignes superficiels... (dans ta matrice M, les ligne 1-6, 2-5 et 3-4 sont identique) Je ne sais vraiment pas comment faire...


    J'ai, ceci dit, créé deux fonctions avec à l'intérieur une boucle qui permet de faire ta matrice pour un I donné. Voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function [M] = AllMatching(I)
    I = 1:I;
    M = perms(I);
    for i = 1:size(I,2)/2
        M = permutation(M,i);
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function [M] = permutation(M,i)
    M(:,2*i-1:2*i) = sort(M(:,2*i-1:2*i),2);
    M = unique(M,'rows');
    Donc j'en vois pas encore le bout...

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Voici une idée que je n'arrive pas à réaliser.

    Disons que I=[1 2 3 4 5 6]

    Je sais que dans un groupe, il faudra bien que l'individu "1" y soit. Donc je cherche toutes les paires possible avec "1" : [1 2] [1 3] [1 4] [1 5] [1 6].

    En suite, je prend le vecteur des individus qui n'ont pas encore de groupe ; dans le cas de [1 2], c'est le vecteur [3 4 5 6]. Et je recommence! Il faut bien que le premier individu de ce nouveau I soit dans un groupe, et les possibilités sont [3 4] [3 5] [3 6]. Et dans le cas particulier de [3 4], il ne me serte plus que [5 6], qui formeront le dernier groupe!

    Ainsi , j'ai une sort d' "arbre" avec les 5 premières branches ([1 2] [1 3] [1 4] [1 5] [1 6]), à chaque branche, il y a encore 3 branches ([3 4] [3 5] [3 6] dans le cas de la première branche [1 2]) et finalement une seul branche pour le dernier cas. J'ai donc 5x3x1 matching possible. Le but est de réussir à le faire de façon général avec seulement I comme donnée de départ.

    Et c'était mon idée de départ (d'où le titre) : créer un array qui aurait I/2 colonnes, mais la première colonne aurait I-1 ligne,la deuxième (I-1)(I-3) lignes, etc jusqu'à (I-1)(I-3)...(3)(1) lignes pour la dernière colonnes (qui sera le même nombre de ligne que l'avant-dernière avec (I-1)(I-3)...(3) lignes).

    Avec un tel array, je pense être capable de créer la matrice M.

    C'est vraiment compliqué à expliquer... mais si vous avez une idée comment y parvenir, c'est très volontiers!

  8. #8
    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 160
    Points
    53 160
    Par défaut
    Citation Envoyé par dspot Voir le message
    je cherche toutes les paires possible avec "1" : [1 2] [1 3] [1 4] [1 5] [1 6].
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    I = 1:4;
    P = nchoosek(I,2)
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    P =
     
         1     2
         1     3
         1     4
         2     3
         2     4
         3     4
    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)

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    C'est très intéressant, cette fonction "nchoosek"! Je vais voir ce que je peux faire avec ça, "sort" et "unique" ce soir.

    Merci beaucoup

    (Je ne clos pas encore le sujet. Je donnerai la solution (si je la trouve) puis je terminerai le sujet)

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Il reste ce dernier bastion à prendre :
    Obtenant P comme tu le fais, y a-t-il une fonction qui peut faire les permutation unique (donc [1 2] [3 4] est la même chose que [3 4] [1 2]) avec tous les vecteurs-ligne en gardant la contrainte que les vecteurs choisis pour la permutation n'est aucune valeur interne identique (donc pas de permutation entre [1 3] [1 4] par exemple) ? Si c'est possible de faire ça, je pense que la matrice M est toute proche!

  11. #11
    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 160
    Points
    53 160
    Par défaut
    Encore une idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    I = 1:4;
    P = nchoosek(I,2);
     
    N = nchoosek(1:size(P,1),2);
     
    M = [P(N(:,1),:) P(N(:,2),:)];
     
    MM = sort(M,2);
     
    s = diff(MM,[],2);
     
    idx = any(s==0,2);
     
    M(idx,:) = [];
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    M =
     
         1     2     3     4
         1     3     2     4
         1     4     2     3
    Pour 6 termes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    I = 1:6;
    P = nchoosek(I,2);
     
    N = nchoosek(1:size(P,1),3);
     
    M = [P(N(:,1),:) P(N(:,2),:) P(N(:,3),:)];
     
    MM = sort(M,2);
     
    s = diff(MM,[],2);
     
    idx = any(s==0,2);
     
    M(idx,:) = [];
    ce qui donne :
    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
    M =
     
         1     2     3     4     5     6
         1     2     3     5     4     6
         1     2     3     6     4     5
         1     3     2     4     5     6
         1     3     2     5     4     6
         1     3     2     6     4     5
         1     4     2     3     5     6
         1     4     2     5     3     6
         1     4     2     6     3     5
         1     5     2     3     4     6
         1     5     2     4     3     6
         1     5     2     6     3     4
         1     6     2     3     4     5
         1     6     2     4     3     5
         1     6     2     5     3     4
    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)

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    WAHOO! C'est exactement ça!! Il y a en effet 15 coalitions possible! J'ai vérifié les matrices M, c'est parfait!

    Voilà finalement le code une fois que j'ai dynamisé ta matrice M :
    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
    function [M]=coal(R)
    I = 1:R;
    P = nchoosek(I,2);
    N = nchoosek(1:size(P,1),R/2);
    M = [];
    for i = 1:R/2
        M = [M P(N(:,i),:)];
    end
     
    MM = sort(M,2);
     
    s = diff(MM,[],2);
     
    idx = any(s==0,2);
     
    M(idx,:) = [];
    Je te remercie énormément pour ton aide! Vraiment, merci!

  13. #13
    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 160
    Points
    53 160
    Par défaut
    On pourrait en savoir un peu plus sur l'utilité de ce code ?
    Quel est ton domaine d'étude ?
    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)

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Ah! Volontiers!

    Alors je suis en train de rendre un papier en théorie des jeux (je suis en Master en Économie en Suisse) et l'idée c'est de faire une simulation de ce qui se passe dans une classe d'étudiants lorsque le prof donne un devoir de groupe. Il me fallait donc une façon de faire ces dits-groupes. Pour l'instant, on utilise des statistiques assez basiques, mais ce modèle, bien qu'étant pas réaliste du tout, peut se complexifier assez facilement (mais se résoudrait beaucoup moins facilement, par contre...).

    Voilà pour la petite histoire.

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

Discussions similaires

  1. Requête SELECT un peu spéciale
    Par Kokito dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/04/2005, 12h42
  2. envois de var $_GET un peu spécial
    Par frechy dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 24/11/2004, 12h00
  3. contrainte d'unicité un peu spéciale....
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/11/2004, 18h54
  4. Réponses: 4
    Dernier message: 05/07/2004, 14h17
  5. ORDER BY un peu spécial
    Par gromez dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 29/04/2004, 12h17

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