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

C++ Discussion :

code numerical recipe


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut code numerical recipe
    Si vous connaissez le site Numerical recipe, que pensez vous de leurs codes C++?
    en terme de rigeur, rapidité...?
    merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    La qualité (en terme code pur, pas de performance) est à mon avis déplorable. C'est principalement du C sur lequel ils ont jeté deux ou trois fonctionalités du C++. Les variables sont toutes déclarées en début de fonction, ils mettent du using namespace std partout et ne font aucune utilisation de la bibliothèque standard.

    Le code est par contre conforme à l'algorithme décrit dans le texte, que ce soit au niveau de la correction ou de la complexité.

    La base du code est là, mais si tu veux le modifier un tant soit peu, mieux vaut commencer par le ré-écrire un peu plus proprement.

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    en fait, voila pourquoi je pose cette question. LE code ci dessous est tiré de NR.
    Il permet de calculer la FFT d'un 2^n points .
    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
     
    void four1(float data[],unsigned long nn,int isign)
    {
        unsigned long n,mmax,m,j,istep,i;
        double wtemp,wr,wpr,wpi,wi,theta;
        float tempr,tempi;
     
      n=nn<<1;
       j=1;
       for (i=1;i<n;i+=2){
             if(j>i){
                 SWAP(data[j],data[i]);
                 SWAP(data[j+1],data[i+1]);
             }
             m=nn;
             while (m>=2 && j>m){
                 j-=m;
                 m>>=1;
             }
             j+=m;
       }
       mmax=2;
       while(n>mmax){
           istep=mmax<<1;cout<<istep;
           theta=isign*(6.283185/mmax);
           wtemp=sin(0.5*theta);
           wpr=-2*wtemp*wtemp;
           wpi=sin(theta);
           wr=1;
           wi=0;
           for(m=1;m<mmax;m+=2){
                for(i=m;i<=n;i+=istep){
                j=i+mmax;
                tempr=wr*data[j]-wi*data[j+1];
                tempi=wr*data[j+1]+wi*data[j];
                data[j]=data[i]-tempr;
                data[j+1]=data[i+1]-tempi;
                data[i]+=tempr;
                data[i+1]+=tempi;
            }
          wr=(wtemp=wr)*wpr-wi*wpi+wr;
          wi=wi*wpr+wtemp*wpi+wi;
    }
    mmax=istep;
       }
     cout<<data[0]<<";"<<data[1]<<";"<<data[2]<<";" <<data[3]; <<";"<<data[4] ;
      }
    Le problème est que j'arrive pas a l'utiliser. Alors si vous pouviez m'aider, ca serait bien.
    Je ne sais pas comment appeller la fonction four1 et comment obtenir les outputs.

    Normalement, on devrait faire comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(){
    float A[4]={3,2,4,5}
    four1(A,4,1) 
    }
    La réponse serait normalement : ([14, -1., 0, -1.]) mais c'est pas ce que j'obtiens.
    Je sais que c'est difficile de comprendre un code aussi long sans avoir lu auparavant un pseudo-algo, mais si vous pouvez jetter un coup d'oeil ca serait bien.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Il faut aussi lire ce qui est précisé dans NC.

    Charge ce fichier pdf:
    http://www.ma.utexas.edu/documentati...cpdf/c12-2.pdf

    four1 utilise des nombres complexes arrangés dans un tableau de float.

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    j'ai vu merci
    mais je crois que leur code ne fonctionne pas.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    La réponse n'est pas forcément celle que tu donnes... Avant de dire que ça ne marche pas, relis un cours sur la FFT. - Je n'ai pas fini mon tuto sur la FFT, mais regarde la partie 1-C http://miles.developpez.com/tutoriels/algo/fft/ -

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Pourquoi ne pas utiliser FFTW comme tout le monde ?

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par deubelte
    j'ai vu merci
    mais je crois que leur code ne fonctionne pas.
    Peut-être que leur code ne fonctionne pas, je ne l'ai pas épluché.

    MAIS, au moins, utilise des données au format attendu par la fonction pour tes tests, ce qui n'est pas du tout le cas avec l'exemple que tu nous as donné, ce qui, bien entendu, ne saurait donner un résultat cohérent.

    Puisque tu avais vu ce qu'il fallait, pourquoi ne pas avoir utilisé des données correctes ?

  9. #9
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    [CITATION]
    Pourquoi ne pas utiliser FFTW comme tout le monde ?
    [/CITATION]

    parce que je ne sais pas ou ca se trouve.
    Ou ca se trouve?

    [CITATION]
    ce qui n'est pas du tout le cas avec l'exemple que tu nous as donné, ce qui, bien entendu, ne saurait donner un résultat cohérent.
    [/CITATION]

    ah bonn?? je croyais que j'avais donné le bon format. Quel est le format qu'il faut donner?
    float data[]
    c'est bien un truc du style:
    data[4]={3,2,4,5};
    Non?

  10. #10
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    enfin,
    quelles sont les balises pour les citations?

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Tu tapes FFTW dans un moteur de recherche et magie, il te dit où ça se trouve.
    Par contre je croyais que c'était LGPL, pas GPL. Ça peut donc être problématique.

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Citation Envoyé par deubelte
    ah bonn?? je croyais que j'avais donné le bon format. Quel est le format qu'il faut donner?
    float data[]
    c'est bien un truc du style:
    data[4]={3,2,4,5};
    Non?
    Oui,la déclaration correspond bien à ce que tu fais,

    MAIS tu as écrit plus haut que tu avais vu le papier que je t'ai signalé, et le format, pour 4 valeurs, ce n'est pas ce que tu utilises, j'ai donc un sérieux doute sur ton affirmation.

    D'ailleurs, je suis même étonné que tu aies pu écrire
    Citation Envoyé par deubelte
    La réponse serait normalement : ([14, -1., 0, -1.]) mais c'est pas ce que j'obtiens.
    Car, avec l'appel comme tu dis l'avoir fait,
    Citation Envoyé par deubelte
    int main(){
    float A[4]={3,2,4,5}
    four1(A,4,1)
    }
    tu devrais avoir un joli "access violation", car avec le 2ème paramètre = 4, il faut un tableau d'au moins 2*4 = 8 éléments.


    Relis le papier, et pas seulement le code.

    Et j'ajoute : certes, il est presque certain qu'il y a des erreurs dans les codes de Numerical Recipes, mais avant d'accuser ce code, il est nécessaire de l'utiliser correctement.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Salut,

    Il me semble qu'il y a aussi de la FFT dans la GSL. Qui elle, est GPL ...
    http://www.gnu.org/software/gsl/manu...ier-Transforms

  14. #14
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 58
    Par défaut
    J'ai utilisé la fft de NR il y a 7 ans, et je confirme qu'elle fonctionne parfaitement bien (comparaison effectuée des résultats avec ceux fournis par matlab).

Discussions similaires

  1. Numerical Recipes in C#
    Par -={-_-}=- dans le forum C#
    Réponses: 0
    Dernier message: 01/10/2009, 17h02
  2. Problème Functor + Numerical Recipes
    Par Jeromnimo dans le forum C++
    Réponses: 8
    Dernier message: 03/07/2008, 10h17
  3. Réponses: 10
    Dernier message: 12/10/2007, 16h54
  4. numerical recipes -> erreurs ?
    Par BenjaminLustrement dans le forum C
    Réponses: 6
    Dernier message: 06/07/2006, 09h10
  5. bibliotheque numerical recipes
    Par miminou dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 09/12/2005, 11h41

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