conversion R et C

R et systèmes d'exploitation, configuration de R, gestion de la mémoire, construction des packages, interfaces entre R et d'autres logiciels, éditeurs pour R

Modérateur : Groupe des modérateurs

hénin virginie
Messages : 14
Enregistré le : 18 Avr 2006, 15:11

conversion R et C

Messagepar hénin virginie » 12 Juin 2006, 08:48

Bonjour je voudrais faire appel à C pour que mon programme tourne plus vite
j'ai des notions en C mais très éloignés
quelq'un pourrait il m'aider à traduire mon code
c'est une fonction
mais peut être qu'il suffirait de traduire le morceau qui prend du temps


voilà la fonction en entier
la boucle prenant du temp est en rouge


new_ponderation=function(chemin1,chemin2,chemin3,nb_camp,Nb_ech)

{

#chemin1 : chemin permettant d'accéder au premier tableau de sortie de la BAO
#chemin2 : chemin permettant d'accéder aux tableaux rbao* de sortie de la BAO
#contient les données restructurées à l'aide de perl

print ("debut programme")
print(date())
#début de la fonction de vraisemblance
tab_b=read.table(chemin1,sep=" ")
tab_b=cbind(as.factor(tab_b[,1]),tab_b[4:5],tab_b[7])
names(tab_b)=c("N_camp","N_var","nom_var","Kij")
Nb_param=length(xname)

sigma=matrix(0,Nb_var,Nb_ech)
somme_obs_predi=matrix(0,Nb_var,Nb_ech)
poids_simu=matrix(0,1,Nb_ech)
poids_log=matrix(0,1,Nb_ech)
#calcul du nombre d'observations par type de mesure
nt=0
for (i in 0:Nb_var-1)
{
nt[i+1]= sum(tab_b[tab_b$N_var==(i),4])
}
tab_nt=cbind(as.vector(tab_b$nom_var[1:Nb_var]),nt)

tab_var=list()
for (i in 1:Nb_var)
{
tab_var[[i]]=matrix(data =scan(file=paste(chemin3,xvar[i],".txt",sep=""),what = numeric(0)),nrow=as.numeric(tab_nt[i,2])*Nb_ech, ncol = 3, byrow = TRUE)
}

for (e in 1:Nb_ech)
{
#calcul de la pondération pour un échantillon (correspond à une ligne du fichier .rbao


#calcul des sommes observés - prédits au carré
somme_obs_pred=matrix(0,1,Nb_var)
#tirage des 1/sigma^2
sigmaj=matrix(0,1,Nb_var)
poids_log[e]=0
for (i in 1:Nb_var)
{

if (dim(tab_var[[i]])[[1]]!=0)
{
tab_var_inter=tab_var[[i]]
tab_var_inter.e=tab_var_inter[tab_var_inter[,1] == e,]
somme_obs_pred[i]=sum((tab_var_inter.e[,2]- tab_var_inter.e[,3])^2)
sigmaj[i]=rgamma(1,shape=as.numeric(tab_nt[i,2]),scale=(2/(as.numeric(somme_obs_pred[i]))))
poids_log[e]=poids_log[e]+(((as.numeric(tab_nt[i,2]))/2)+1)*log(2/(as.numeric(somme_obs_pred[i])))


}
else
{
somme_obs_pred[i]="NA"
sigmaj[i]="NA"
}
}
sigma[,e]=sigmaj
somme_obs_predi[,e]=somme_obs_pred
}
param=as.data.frame(matrix(data =scan(file=paste(chemin3,"para.txt",sep=""),what = numeric(0)),nrow=Nb_ech, ncol = Nb_param, byrow = TRUE))
param=t(param)
resul=list(poids_log,param,sigma,somme_obs_predi)
names(resul)=c("ponderation_log","param","sigma","somm_erreur")
print ("fin programme")
print(date())
return(resul)
}

Romain François
Messages : 42
Enregistré le : 08 Déc 2005, 19:23
Contact :

Messagepar Romain François » 12 Juin 2006, 19:37

Bonjour,

Tout d'abord, je ne pense pas qu'en postant deux fois le même problème avec des noms différents est utile. Passer à C n'est pas la priorité ici.

Si vous voulez vraiment de l'aide, il faudra d'abord faire un effort !!!
lecodequevousavezécritestillisibleest-cequelatoucheespaceestengreve.Deplusiln'yaaucuneindentationdansvotrecode,avectoutescesbouclesimbriquéesonycomprendsrien

Vous devriez créer de petites fonctions à utiliser au sein de cette grosse fonction

Par ailleurs, comme cela a été dit dans l'autre sujet, ce code n'est pas directement utilisable, ce que je veux dire, c'est que vous ne fournissez pas les valeurs des paramètres d'entrée de votre fonction. Si vous ne voulez pas donner vos données, pas de probleme, mais au moins essayez de fournir des données bidon qui ressemblent.

Désolé si je parais un peu grincheux

Romain
--
Romain François
Consultant R Indépendant
http://romainfrancois.blog.free.fr

hénin virginie
Messages : 14
Enregistré le : 18 Avr 2006, 15:11

Messagepar hénin virginie » 13 Juin 2006, 07:33


j'avais cru comprendre que C pouvait résoudre mes problèmes



Bonjour,

Je suis d'accord avec la remarque precedente. Il faut que le code fourni dans les messages soit lisible sans etre oblige d'y passer 1 heure.

Comme a tous les utilisateurs de ce forum qui ne l'ont pas deja fait, je vous conseille aussi d'explorer de fond en comble le site web officiel de R (http://www.r-project.org/), et eventuellement de vous inscrire sur la liste email de R (anglophone). Une grande partie des questions posees peuvent etres resolues avec l'info dispo sur ce site (et/ou en s'aidant des moteurs de recherche qui y sont disponibles).

Je ne connais pas la manip pour integrer du C dans R, mais il me semble que vous pourrez avoir de l'info au chap 8 des FAQs du site R.

Il y a eu bcp de msg sur la liste email R au sujet de la lenteur de R lorsqu'on fait bcp de boucles. Si je me rappelle bien, les 2 conseils donnes etaient de :

- ne pas utiliser de data.frame
- pre-construire les matrices completes (en pre-calculant leurs tailles finales en fonction du nombre de boucles, etc.), puis remplir ces matrices avec le resultat des boucles.

Bon courage

Matthieu

Matthieu Lesnoff
Messages : 120
Enregistré le : 29 Nov 2004, 12:41

Messagepar Matthieu Lesnoff » 13 Juin 2006, 12:45


j'avais cru comprendre que C pouvait résoudre mes problèmes



Bonjour,

Je suis d'accord avec la remarque precedente. Il faut que le code fourni dans les messages soit lisible sans etre oblige d'y passer 1 heure.

Comme a tous les utilisateurs de ce forum qui ne l'ont pas deja fait, je vous conseille aussi d'explorer de fond en comble le site web officiel de R (http://www.r-project.org/), et eventuellement de vous inscrire sur la liste email de R (anglophone). Une grande partie des questions posees peuvent etres resolues avec l'info dispo sur ce site (et/ou en s'aidant des moteurs de recherche qui y sont disponibles).

Je ne connais pas la manip pour integrer du C dans R, mais il me semble que vous pourrez avoir de l'info au chap 8 des FAQs du site R.

Il y a eu bcp de msg sur la liste email R au sujet de la lenteur de R lorsqu'on fait bcp de boucles. Si je me rappelle bien, les 2 conseils donnes etaient de :

- ne pas utiliser de data.frame
- pre-construire les matrices completes (en pre-calculant leurs tailles finales en fonction du nombre de boucles, etc.), puis remplir ces matrices avec le resultat des boucles.

Bon courage

Matthieu


Retourner vers « Archives : Environnement de R »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité