Transcription listes R en structures C

Voir le sujet précédent Voir le sujet suivant Aller en bas

Transcription listes R en structures C

Message  Naneba le Sam 16 Fév 2013 - 1:30

Bonjour a tous,

Je code beaucoup en R, mais les temps de calculs étant très long (boucles) je dois me mettre au C.

Voici un exemple de fonction R que je souhaite retranscrire en C:
Code:
    inoc <- function(liste, nom) {
      isc <- 0
      for (i in 1:length(liste[[length(liste)]]$feuilles)) {
            for (k in 1:7) {
                isc <- isc + nom$param$omega * liste[[length[[liste]]$feuilles[[i]]$compartiments[[k]]$valeur
                              }
                                                                      }
    isc
    }
Cette fonction doit calculer une somme a partir d’éléments d'une liste "liste".

J'ai donc commencer par définir des structures en C (identiques à mes listes R)

Je cherche maintenant comment donner le plus efficacement possible les valeurs de ces éléments de liste R à mes structures C sans tout renseigner "à la main" comme
Code:
    liste.feuilles[1].compartiments[1].valeur= 15
    liste.feuilles[1].compartiments[2].valeur= 26
etc... (qui finalement me prendrait beaucoup de temps)

J'ai commencé à écrire ma fonction, mais j'avoue être complétement larguée:
Code:
    void inoc_s_c(int *n, double *omega, double *valeur, double *isc)
    {
    int i,k;
    double isc=0.;
    for (i=1;  i<*n; i++)
    for(k=1; k=7; k++)
      isc+=(omega)*(
    }

Quelqu'un aurait-il des idées, je suis preneuse?
Je vous remercie beaucoup!

Nane

Naneba

Messages : 1
Date d'inscription : 16/02/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Transcription listes R en structures C

Message  -ed- le Lun 1 Sep 2014 - 2:40

Pour répondre correctement, il faudrait connaitre à la fois le R et le C ... Pas évident ... Je vais déjà essayer de comprendre le code R  (je ne sais pa comment on commente en R alors je vais faire comme en C :

Code:

    inoc <- function (liste, nom) // cette ligne définit une fonction ?
                                           // inoc est le nom de la fonction ?
                                           // liste et nom sont les paramètres ?
    {
       isc <- 0 // isc est une variable locale initialisée à 0 ?

       for (i in 1:length(liste[[length(liste)]]$feuilles))
       /* une boucle for dont l'indice i varie de 1 à ???
           euh, c'est plutôt complexe comme expression et sans connaitre
           la structure de 'liste' ni la syntaxe appropriée, ça reste incompréhensible ...
           Admettons que ce soit la taille d'un tableau (à 2 dimensions ?)
       */
       {
            for (k in 1:7) // et une boucle imbriquée avec k variant de 1 à 7
            {
                isc <- isc + nom$param$omega * liste[[length[[liste]]$feuilles[[i]]$compartiments[[k]]$valeur
                // faire la somme de tous les valeurs lues multipliée par le 'sous paramètre' omega de 'nom' ...
            }
        }
       isc // retourner les résultat.
    }

En fait, on a probablement affaire à une structure 'nom' et à un tableau de structures à 2 dimensions 'liste' ...

Avant d'aller plus loin il faut définir ces structures en C et faire le choix du tableau statique (taille prédéfinie, simple à concevoir et à gérer) ou dynamique (taille déterminée à l'exécution) et là, ça devient vite complexe.

Concernant le code posté
Code:

    void inoc_s_c(int *n, double *omega, double *valeur, double *isc)
    {
    int i,k;
    double isc=0.;
    for (i=1;  i<*n; i++)
    for(k=1; k=7; k++)
      isc+=(omega)*(
    }
Si la fonction doit retourner la valeur de 'isc', il vaut mieux utiliser return, c'est plus simple. Concernant les valeurs de paramètres, dans la mesure du possible, éviter les pointeurs inutiles. Et attention à la gestion des boucles et des indices (qui partent de 0 en C)

Pour finaliser, il faut connaitre la structure du tableau (d'éléments de type struct data) à deux dimensions pour que ça ressemble à ça :
Code:

double inoc_s_c (int n, double omega, struct data**tableau)
{
  int i,k;
  double isc = 0.;
  for (i=0;  i<n; i++)
      for(k=0; k<7; k++)
        isc += omega * tableau[i][k].feuille.compartiment.valeur ;

  return isc;
}

Beaucoup de réponses à certaines questions ici :

http://www.bien-programmer.fr/notes.php

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum