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 :

Matrice contenant l'ensemble des combinaisons de plusieurs chiffres de 0 à n


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Matrice contenant l'ensemble des combinaisons de plusieurs chiffres de 0 à n
    Bonjour à tous !

    Je me permet de de faire appel à vous car je suis dans une impasse.

    Je cherche à créer une fonction Matlab (ou autre) qui génère une matrice correspondant à l’ensemble des combinaisons de chiffres de 0 à n.
    Chaque ligne correspond à une solution différente et chaque colonne contient un des chiffres.
    En gros il me faudrait une matrice de cette forme dans le cas d'une combinaison de 4 chiffres:

    a b c d
    0 0 0 0
    0 0 0 1
    0 0 0 2
    0 0 0 n
    0 0 1 0
    0 0 n 0
    0 0 n n
    n n n n


    J'ai pensé à imbriquer plusieurs boucles mais c'est assez lourd si le nombre de chiffre est important.

    Pour ceux que ça intéresse, je veux utiliser cette matrice pour calculer l'ensemble des solutions d'une fonction de type:

    R= Lb-(a*L1+b*L2+c*L3+d*L4)

    afin de déterminer la combinaison des entiers a,b,c,d bornés qui permettent d'obtenir Rmini.

    Si vous trouvez une autre solution je suis preneur aussi!!!

    Merci d'avance pour votre aide !

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    une petite idee avec la fonction nchoosek et n = 4

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    >>>> n = 4;
    >> A = sort(repmat(0:n-1,1,n))
     
    A =
     
      Columns 1 through 14
     
         0     0     0     0     1     1     1     1     2     2     2     2     3     3
     
      Columns 15 through 16
     
         3     3
     
    >> B = unique(nchoosek(A,4),'rows')
     
    B =
     
         0     0     0     0
         0     0     0     1
         0     0     0     2
         0     0     0     3
         0     0     1     1
         0     0     1     2
         0     0     1     3
         0     0     2     2
         0     0     2     3
         0     0     3     3
         0     1     1     1
         0     1     1     2
         0     1     1     3
         0     1     2     2
         0     1     2     3
         0     1     3     3
         0     2     2     2
         0     2     2     3
         0     2     3     3
         0     3     3     3
         1     1     1     1
         1     1     1     2
         1     1     1     3
         1     1     2     2
         1     1     2     3
         1     1     3     3
         1     2     2     2
         1     2     2     3
         1     2     3     3
         1     3     3     3
         2     2     2     2
         2     2     2     3
         2     2     3     3
         2     3     3     3
         3     3     3     3

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par Dombrai Voir le message
    une petite idee avec la fonction nchoosek et n = 4

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    >>>> n = 4;
    >> A = sort(repmat(0:n-1,1,n))
     
    A =
     
      Columns 1 through 14
     
         0     0     0     0     1     1     1     1     2     2     2     2     3     3
     
      Columns 15 through 16
     
         3     3
     
    >> B = unique(nchoosek(A,4),'rows')
     
    B =
     
         0     0     0     0
         0     0     0     1
         0     0     0     2
         0     0     0     3
         0     0     1     1
         0     0     1     2
         0     0     1     3
         0     0     2     2
         0     0     2     3
         0     0     3     3
         0     1     1     1
         0     1     1     2
         0     1     1     3
         0     1     2     2
         0     1     2     3
         0     1     3     3
         0     2     2     2
         0     2     2     3
         0     2     3     3
         0     3     3     3
         1     1     1     1
         1     1     1     2
         1     1     1     3
         1     1     2     2
         1     1     2     3
         1     1     3     3
         1     2     2     2
         1     2     2     3
         1     2     3     3
         1     3     3     3
         2     2     2     2
         2     2     2     3
         2     2     3     3
         2     3     3     3
         3     3     3     3
    Ce ne sont pas toutes les combinaisons.

    Est-ce que ceci te convient?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    k=4;x = mod(floor((0:(k^k-1))'*(k.^(-((k-1):-1:0)))),k)
    EDIT : Ou, plus généralisée, essaie ces deux exemples pour voir leur effet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    k=4;n=2;x = mod(floor((0:(n^k-1))'*(n.^(-((k-1):-1:0)))),n)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    k=2;n=4;x = mod(floor((0:(n^k-1))'*(n.^(-((k-1):-1:0)))),n)

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 265
    Points : 352
    Points
    352
    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
    clear all;close all;clc
    clear all;close all;clc
    n=2;
    vect=0:n;
    vect2=ones(n+1,1);
    M=zeros(n+1,n+1);
     
    I=zeros((n+1)^(n+1)-1,n+1);
     
    for i=0:(n+1)^(n+1)-1
     
    s=i;
     
    for j=n:-1:0
     
        I(i+1,j+1)=floor(s/((n+1)^(j)));
        s=s-I(i+1,j+1)*(n+1)^j;
     
    end
     
     
     
     
    end
     
    disp(I)
    0 0 0
    1 0 0
    2 0 0
    0 1 0
    1 1 0
    2 1 0
    0 2 0
    1 2 0
    2 2 0
    0 0 1
    1 0 1
    2 0 1
    0 1 1
    1 1 1
    2 1 1
    0 2 1
    1 2 1
    2 2 1
    0 0 2
    1 0 2
    2 0 2
    0 1 2
    1 1 2
    2 1 2
    0 2 2
    1 2 2
    2 2 2
    il y a possibilité d'aller plus vite en collant des segments de vecteur de taille n mais il faudrait reflechir un peu ^^

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    oups, autant pour moi, je n'avais pas compris le post initial

    en plus je m'etait forcé à enlever des solutions.

    Ceci :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    >> n = 3
     
    n =
     
         3
     
    >> A = repmat(0:n-1,1,n)
     
    A =
     
         0     1     2     0     1     2     0     1     2
     
    >> B = unique(nchoosek(A,n),'rows')
     
    B =
     
         0     0     0
         0     0     1
         0     0     2
         0     1     0
         0     1     1
         0     1     2
         0     2     0
         0     2     1
         0     2     2
         1     0     0
         1     0     1
         1     0     2
         1     1     0
         1     1     1
         1     1     2
         1     2     0
         1     2     1
         1     2     2
         2     0     0
         2     0     1
         2     0     2
         2     1     0
         2     1     1
         2     1     2
         2     2     0
         2     2     1
         2     2     2
     
    >>
    devrait fonctionner

    apres, le nombre de lignes c'est du N^N, ça va exploser assez vite

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Ah super !
    Ca semble être ce que je cherche! Je vais essayer ça rapidement et je vous tiens au courant !
    Merci beaucoup !

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    J'ai donc bien réussi avec le code de ERCO503!!

    Merci beaucoup pour votre aide!

    Je me suis d’ailleurs penché sur l'éventualité ou chaque chiffre pouvait être défini sur in intervalle différent.
    Pour ça j'ai créer deux boucle parcourant la matrice et supprimant les ligne correspondantes à un chiffre trop grand.
    Si vous connaissez plus rapide je suis preneur.

    En tout cas, problème résolu !

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n = [4,2,3,4]; x = mod(floor((0:(prod(n)-1))'*(fliplr([1,cumprod(n(end:-1:2))]).^-1)),ones(prod(n),1)*n)

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

Discussions similaires

  1. Intégration d'une matrice contenant des fonctions
    Par Keudon dans le forum MATLAB
    Réponses: 2
    Dernier message: 18/05/2012, 15h55
  2. Ensemble des combinaisons de paires possibles
    Par benoit.abm dans le forum R
    Réponses: 8
    Dernier message: 20/10/2011, 19h25
  3. Réponses: 2
    Dernier message: 21/04/2010, 09h26
  4. Réponses: 7
    Dernier message: 13/09/2007, 15h22
  5. Stocker des données dans plusieurs matrices différentes
    Par setsuko974 dans le forum Langage
    Réponses: 6
    Dernier message: 23/03/2007, 23h48

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