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

R Discussion :

Indiçage de matrice


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Agent de voyage
    Inscrit en
    Mai 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pologne

    Informations professionnelles :
    Activité : Agent de voyage
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2017
    Messages : 18
    Par défaut Indiçage de matrice
    Bonjour tout le monde,

    J'utilise le langage r et voici mon problème:

    Je dispose de 6 matrices de 6027 lignes et 49 colonnes chacune. Ces 6 matrices ne contiennent que TRUE ou FALSE.
    Je souhaite faire varier i (indice de colonne de la première matrice) de 1 a 49, j (indice de colonne de la seconde matrice) de 1 a 49,
    k (indice de colonne de la troisième matrice) de 1 a 49, l (indice de colonne de la quatrième matrice) de 1 a 49, m (indice de colonne de la cinquième matrice) de 1 a 49, n (indice de colonne de la sixième matrice) de 1 a 49 afin de générer une nouvelle matrice de 6027 lignes et 6 colonnes.

    Sur cette nouvelle matrice, je veux effectuer un test sur chacune de ses 6027 lignes: si, sur la même ligne, il y a 6 fois TRUE, le test retourne TRUE, si cette condition n'est pas remplie, le test retourne FALSE.
    Je "stocke" ensuite la valeur du test (TRUE ou FALSE) de chaque ligne dans une septième colonne et compte le nombre de TRUE dans cette colonne et stocke ce nombre que j'appelle "nombre de succès".

    Je veux ensuite remplir une nouvelle matrice de 2 colonnes et d'un nombre de lignes égal au nombre de combinaisons possibles des indices i, j, k, l, m et n ce qui doit faire, si je ne me pas trompé, 49*49*49*49*49*49 lignes. La première colonne de cette matrice contiendra la valeur de i, j, k, l, m et n et la seconde colonne, la valeur de "nombre de succès" .

    Mon problème: je ne parviens pas à trouver une relation mathématique qui me permettrait de trouver la valeur de l'indice ligne de cette nouvelle matrice en fonction de la valeur des indices i, j, k, l, m et n afin que ma nouvelle matrice puisse être remplie.

    Voila, j'espère que mes explications sont claires...

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 235
    Par défaut
    Tu as 6 matrices
    M1[6027,49] et idem M2 M3 M4 M5 et M6 : ces 6 matrices contiennent Vrai ou Faux dans chaque case.

    Tu veux créer une matrice P[6027,6] Mais dans l'explication que tu donnes, on dirait que tu utilises le contenu de P pour savoir quoi mettre dans P.
    Refais ton explication, en utilisant les noms de matrice M1 M2 M3 M4 M5 M6 et P comme moi.

  3. #3
    Membre averti
    Homme Profil pro
    Agent de voyage
    Inscrit en
    Mai 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pologne

    Informations professionnelles :
    Activité : Agent de voyage
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2017
    Messages : 18
    Par défaut
    J'ai 6 matrices M1, M2, M3, M4, M5 et M6 [6027,49]:
    Je fais varier chacun des indices de colonne de ces 6 matrices de 1 a 49 afin de générer une nouvelle matrice P [6027,6] (la première colonne de celle-ci ayant une des 49 colonnes de M1, la seconde, une des 49 colonnes de M2,etc ...
    Pour chaque valeur des indices i, j, k, l, m et n, j'effectue un test sur chaque ligne de P: s'il y a 6 fois TRUE, le test retourne TRUE, FALSE sinon et je stocke le résultat du test sur chaque ligne dans un vecteur qui contient donc 6027 valeurs.
    Je compte ensuite le nombre de TRUE qu'il y a dans ce vecteur et stocke la valeur dans "nb de succès" et associe à cette valeur la valeur respective de i, j, k, l, m et n.

    Je souhaite remplir une nouvelle matrice R[49*49*49*49*49*49, 2], R[,1] contenant la valeur respective de i, j, k, l, m et n et R[,2] contenant la valeur de "Nb de succès"

    Je ne parviens pas à déterminer la relation mathématique qui permet de trouver la valeur de l'indice ligne de R en fonction de i, j, k, l, m et n.

    Voila, j'espère avoir été plus clair.

    Le code que j'ai écrit est le suivant:
    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
    COMBINAISONS.TEST<- function(i,j,k,l,m,n){
      Five.True<- rep(NA, length(Test.N1.A[,1]))
      Matrice.Test<- cbind(Test.N1.A[,i], Test.N2.B[,j], Test.N3.C[,k],
                         Test.N4.D[,l], Test.N5.E[,m], Test.N6.G[,n], Five.True)
      Matrice.Test<- Matrice.Test[50:length(Matrice.Test[,1]),] #remove NA's
      for (p in 1:length(Matrice.Test[,1])) {
      if (Matrice.Test[p,1]==TRUE & Matrice.Test[p,2]==TRUE & 
          Matrice.Test[p,3]==TRUE & Matrice.Test[p,4]==TRUE & 
          Matrice.Test[p,5]==TRUE & Matrice.Test[p,6]==TRUE){
        Matrice.Test[p,7]<- TRUE 
      }else{
        Matrice.Test[p,7]<- FALSE
      }
      }
      nb.Succes<- length(which(Matrice.Test[,7]==TRUE)) 
    }
    Results<- matrix(data=NA, nrow = 49*49*49*49*49*49, ncol= 2)
    for (i in 1:49) {
      for (j in 1:49) {
        for (k in 1:49) {
          for (l in 1:49) {
            for (m in 1:49) {
              for (n in 1:49) {
                Results[i,1]<- COMBINAISONS.TEST(i,j,k,l,m,n)
                Results[i,2]<- paste("i=",i,",","j=",j,",","k=",k,",","l=",l,",","m=",m,",","n=",n)
              }
            }
          }
        }
      }
    }
    Test.N1.A, Test.N2.B, Test.N3.C,Test.N4.D, Test.N5.E, Test.N6.G sont les 6 matrices de depart.(contenant soit True soit False)
    Mon souci est d'exprimer le i de Results en fonction de j, k, l, m et n.

  4. #4
    Membre averti
    Homme Profil pro
    Agent de voyage
    Inscrit en
    Mai 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pologne

    Informations professionnelles :
    Activité : Agent de voyage
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2017
    Messages : 18
    Par défaut
    Ok, j'ai un peu progressé mais cela ressemble à du bricolage...
    Voilà mon code maintenant:

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    COMBINAISONS.TEST<- function(i,j,k,l,m,n){
      Five.True<- rep(NA, length(Test.N1.A[,1]))
      Matrice.Test<- cbind(Test.N1.A[,i], Test.N2.B[,j], Test.N3.C[,k],
                         Test.N4.D[,l], Test.N5.E[,m], Test.N6.G[,n], Five.True)
      Matrice.Test<- Matrice.Test[50:length(Matrice.Test[,1]),] #remove NA's
      for (p in 1:length(Matrice.Test[,1])) {
      if (Matrice.Test[p,1]==TRUE & Matrice.Test[p,2]==TRUE & 
          Matrice.Test[p,3]==TRUE & Matrice.Test[p,4]==TRUE & 
          Matrice.Test[p,5]==TRUE & Matrice.Test[p,6]==TRUE){
        Matrice.Test[p,7]<- TRUE 
      }else{
        Matrice.Test[p,7]<- FALSE
      }
      }
      nb.Succes<- length(which(Matrice.Test[,7]==TRUE)) 
    }
    Results<- matrix(data=NA, nrow = 49*49*49*49*49*49, ncol= 2)
    for (i in 1:49) {
      for (j in 1:49) {
        for (k in 1:49) {
          for (l in 1:49) {
            for (m in 1:49) {
              for (n in 1:49) {
                if (j==1 & k==1 & l==1 & m==1 & n==1){
                  s<- i
                }
                Results[s,1]<- paste("i=",s,",","j=",j,",","k=",k,",","l=",l,",","m=",m,",","n=",n)
                Results[s,2]<- COMBINAISONS.TEST(s,j,k,l,m,n)
     
                if (i==1 & k==1 & l==1 & m==1 & n==1){
                  s<- (i*k*l*m*n)+(49-j+(j-2))+j
                }
                Results[s,1]<- paste("i=",i,",","j=",s,",","k=",k,",","l=",l,",","m=",m,",","n=",n)
                Results[s,2]<- COMBINAISONS.TEST(i,s,k,l,m,n)
     
                if (i==1 & j==1 & l==1 & m==1 & n==1){
                  s<- (i*j*l*m*n)+(49-k+(k-2))+k
                }
                Results[s,1]<- paste("i=",i,",","j=",j,",","k=",s,",","l=",l,",","m=",m,",","n=",n)
                Results[s,2]<- COMBINAISONS.TEST(i,j,s,l,m,n)
     
                if (i==1 & j==1 & k==1 & m==1 & n==1){
                  s<- (i*j*k*m*n)+(49-l+(l-2))+l
                }
                Results[s,1]<- paste("i=",i,",","j=",j,",","k=",k,",","l=",s,",","m=",m,",","n=",n)
                Results[s,2]<- COMBINAISONS.TEST(i,j,k,s,m,n)
     
                if (i==1 & j==1 & k==1 & l==1 & n==1){
                  s<- (i*j*k*l*n)+(49-m+(m-2))+m
                }
                Results[s,1]<- paste("i=",i,",","j=",j,",","k=",k,",","l=",l,",","m=",s,",","n=",n)
                Results[s,2]<- COMBINAISONS.TEST(i,j,k,l,s,n)
     
                if (i==1 & j==1 & k==1 & l==1 & m==1){
                  s<- (i*j*k*l*m)+(49-n+(n-2))+n
                }
                Results[s,1]<- paste("i=",i,",","j=",j,",","k=",k,",","l=",l,",","m=",m,",","n=",s)
                Results[s,2]<- COMBINAISONS.TEST(i,j,s,l,m,s)
     
                }
              }
            }
          }
        }
    }
    J'ai mis des conditions pour obtenir la valeur de s mais je ne les ai pas toutes. Reste à écrire les autres conditions.

    Par ailleurs, je me demande ce que donnerait un tel code en terme de performances car le nombre de combinaisons possibles s'élève à 13 841 287 201

  5. #5
    Membre averti
    Homme Profil pro
    Agent de voyage
    Inscrit en
    Mai 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pologne

    Informations professionnelles :
    Activité : Agent de voyage
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2017
    Messages : 18
    Par défaut
    N'y aurait-il pas la possibilité d'écrire un fichier externe contenant les résultats de la boucle, fichier qui s'écrirait à chaque itération de i, j, k, l , m et n. Chaque itération créerait une nouvelle ligne dans ce fichier externe?

  6. #6
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    Bonjour,
    tu peux effectivement créer un fichier et ensuite rajouter ligne par ligne mais vu la taille que devrait faire ce dernier le temps de calcul serait très long, ou alors il faudrait trouver un moyen d'optimiser l'export des données.

    Pour le reste tu peux t'affranchir de certaines boucles. Par exemple si tu crées un data.frame de toutes les combinaisons possibles pour l, m et n tu passerais de trois boucles pour ces indices à une seule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lmn <- expang.grid(l = 1:49, m = 1:49, n = 1:49)
    Voir même tu peux le faire pour k aussi.
    Ensuite cette partie du code peut-être simplifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (p in 1:length(Matrice.Test[,1])) {
      if (Matrice.Test[p,1]==TRUE & Matrice.Test[p,2]==TRUE & 
          Matrice.Test[p,3]==TRUE & Matrice.Test[p,4]==TRUE & 
          Matrice.Test[p,5]==TRUE & Matrice.Test[p,6]==TRUE){
        Matrice.Test[p,7]<- TRUE 
      }
      else {
        Matrice.Test[p,7]<- FALSE
      }
    C'est typiquement le genre d'opération qui peut-être vectoriser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # tout le code peut se remplacer par :
    Matrice.Test[,7] <- rowSums(Matrice.Test[,1:6]) == 6
    J'espère que ça t'aidera.
    cdlt

Discussions similaires

  1. matrices * vecteur
    Par delire8 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 07/09/2002, 14h15
  2. [CR] entête et pied sur page 1/B de matrice
    Par chloe.j3 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 04/09/2002, 12h07
  3. Matrice de filtrage ?
    Par gimlithedwarf dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 24/08/2002, 09h44
  4. Gestion de matrice
    Par bzd dans le forum C
    Réponses: 4
    Dernier message: 12/08/2002, 18h19
  5. Comment définir le type matrice ?
    Par charly dans le forum Langage
    Réponses: 7
    Dernier message: 15/06/2002, 21h01

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