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 :

Boucle R vs Matlab


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 173
    Par défaut Boucle R vs Matlab
    Bonjour à tous,


    J'ai un traitement de données sur une boucle de 1,5 millions d'itérations.

    Je traduit le code de Matlab à R et sur un petit échantillon je retrouve bien les même résultats.

    Cependant sur pour le calcul en entier matlab met 20min et R 22h!!

    Es-ce normal? Du faite que Matlab et plus que rapide que R?

    (J'ai pas pu testé les 22h pour voir si j'avais le même résultat sur les 1.5 millions itérations mais pour 5000 j'ai le même résultat)

  2. #2
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Par défaut
    Bonjour,

    Comment savez-vous que R met 22h si vous n'avez pas testé ?

    Comment avez-vous procédé pour transcrire votre code Matlab en R ? Le problème vient peut-être d'une histoire d'optimisation...

    Personnellement je n'ai jamais cherché à comparer des temps de calcul R et Matlab, donc difficile de vous aider plus que ça.

    Peut-être qu'en postant votre code R cela pourra nous permettre de remarquer d'éventuels problèmes d'optimisation ?


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 173
    Par défaut
    Merci,

    Juste un produit en croix pour une approximation de temps, enfin tout ca pour dire que R semble bcp bcp plus lent.

    J'ai traduit le code comme ça à la main :

    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
    for (i in 1:fin)
    {
     
    #Suivi boucle
     
       print(paste(i,date(),sep=" : "))
       flush.console()
     
    	if ( Tempo[i+1,1] == Tempo[i,1] ){
    		temp=temp+1
     
    	}else if ( Tempo[i+1,1] != Tempo[i,1] ){
    			deb=i+1-temp
    			Xtemp = Tempo[deb:i,]
    	#--------------------tirage aléatoire en abscence de RA-------------------#
    		#l=sample(nb_DAR, 1)
    		l=2
    		if ( sum(Xtemp[,10])==0 & temp>= l ){
    		count=count+1
    		Xf[count,]=Xtemp[l,]
     
    	#--------------------- tirage de tous les RA -----------------------------%
    		}else if ( sum(Xtemp[,10]) != 0 ){
    		for (k in 1:temp)
    		{
    			if (Xtemp[k,10] != 0) Temp_RA=k
    		}
    		count=count+1
    		Xf[count,]=Xtemp[Temp_RA,]
    		}
     
    		temp=1
     
    		}
    }
    Le fin étant fixé en amont qui est en réalité le nombre de lignes d'un fichier que j'importe

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		#l=sample(nb_DAR, 1)
    		l=2
    Vu que je tire un nombre aléatoire, je l'ai fixé à 2 dans R et Matlab pour effectivement faire la même simulation

  4. #4
    Membre chevronné
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Par défaut
    Citation Envoyé par Stepsbysteps Voir le message
    Merci,

    Juste un produit en croix pour une approximation de temps, enfin tout ca pour dire que R semble bcp bcp plus lent.
    Bonjour,

    Si tu travailles avec des dates tu peux les passer en numeric() des fois ca fait gagner du temps de calcul.

    Dans tous les cas le problème c'est que tu n'utilises pas le langage vectoriel et que tu fais appel individuellement aux indices de tes vecteurs (si ca passe sous MatLab tant mieux mais quitte à coder comme ca autant ne pas utiliser un langage vectoriel).

    Par exemple au lieu d'incrémenter plein de fois, pour avoir directement ton vecteur des temp (de faille fin) tu peux faire:
    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
     
    etape<-rep(0,fin)
    temp<-rep(0,fin)
    deb<-rep(0,fin)
     
    etape[Tempo[2:(fin+1),1]!=Tempo[1:fin,1]]<-(1:(fin))[Tempo[2:(fin+1),1]!=Tempo[1:fin,1]] 
    deb<-etape #hop au passage ceci correspond à ta variable deb
    etape<-cumsum(etape)
    #Marque de façon unique les différents sauts de tempo pour pouvoir reinitialiser temp à chaque fois que le tempo augmente
     
    temp[Tempo[2:(fin+1),1]==Tempo[1:fin,1]]<-1
    #A chaque fois que le tempo reste constant on met 1 dans le vecteur
     
    temp<-unlist(tapply(temp,etape,cumsum))+1
    #On fait la somme cumulative des temp sur chacun des segments constants de Tempo et on unlist ca pour rechopper un vecteur de taille fin.
    Exemple concret:

    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
    > Tempo<-as.matrix(c(1,1,1,2,2,2,3,3,3))
    > Tempo
          [,1]
     [1,]    1
     [2,]    1
     [3,]    1
     [4,]    2
     [5,]    2
     [6,]    2
     [7,]    3
     [8,]    3
     [9,]    3
    > fin=8
    > 
    > 
    > etape<-rep(0,fin)
    > temp<-rep(0,fin)
    > deb<-rep(0,fin)
    > 
    > 
    > etape[Tempo[2:(fin+1),1]!=Tempo[1:fin,1]]<-(1:(fin))[Tempo[2:(fin+1),1]!=Tempo[1:fin,1]]
    > deb<-etape
    > etape<-cumsum(etape)
    > temp[Tempo[2:(fin+1),1]==Tempo[1:fin,1]]<-1
    > 
    > temp<-unlist(tapply(temp,etape,cumsum))+1
    > temp
    01 02 31 32 33 91 92 93 
     2  3  1  2  3  1  2  3 
    > deb
    [1] 0 0 3 0 0 6 0 0
    Pour la suite j'ai plus trop compris ce que tu voulais faire mais je suis à peu près certain que tu peux enlever la boucle.

    Peux tu donner un exemple de ce que tu veux faire?
    (j'ai "ca" et je veux arriver à "ca")

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 173
    Par défaut
    Merci je regarde ca demain et vous reponds

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 173
    Par défaut
    Voici un aperçu d'une infime parti du tableau en PJ

    On considère 2 populations : la population des RA sélectionnée en totalité (on retient uniquement le num de dossier en V1 où V10=1)

    La population de tous les RA, on la sélectionne en totalité, ensuite on effectue un tirage pondéré (pour chaque ligne et donc chaque dossier on calcule un nombre aléatoire entre 1 et 12 (9 par exemple) ,12 étant le nombre de fois qu'un dossier peut être observé au max, on va ensuite aller chercher le num de dossier en V1 positionné en 9ème position, si on le trouve on le tire, sinon on le tire pas)

    Je sais pas si c'est vectorisable

    En faite je reprends un code qui a été dévellopé avant que j'arrive :
    je pense à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X_RA=subset(X1, X1[,10]==1)
    X_nonRA=subset(X1, X1[,10]==0)
    X_nonRA_tri=X_nonRA[order(X_nonRA[,1],decreasing=FALSE),]
    Dans un premier temps j'ai toute ma 1er population, il reste plus qu'a trouver un moyen de tirage sur la deuxième population X_nonRA_tri qui est trié par num de dossier.
    Images attachées Images attachées  

Discussions similaires

  1. Boucle fermée sous Matlab
    Par d0n32 dans le forum MATLAB
    Réponses: 1
    Dernier message: 08/07/2010, 14h47
  2. Réponses: 1
    Dernier message: 06/05/2008, 13h32
  3. Aide boucle en matlab
    Par bilel benhalima dans le forum MATLAB
    Réponses: 2
    Dernier message: 31/03/2008, 13h26
  4. [Débutant] Problème dans une boucle Matlab
    Par RaphTIM dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/06/2007, 18h51

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