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

 Delphi Discussion :

problème d'utilisation des fonctions mean et stddev


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut problème d'utilisation des fonctions mean et stddev
    Bonjour,

    Je travaille sur du traitement du signal en delphi et ai un problème avec les 2 fonctions mean et stddev.
    Théoriquement, si notre vecteur d'entrée est un signal échantillonné de N valeurs, les résultats (mean et stddev) dépendent des nombres de données en entrée à ces fonctions.
    Mean et stddev ont comme paramètres d'entrées des tableaux ouverts array of double (ou extended). On n'y indique pas le nombre de données contrairement aux mêmes fonctions en C++ builder, où on y met ce nombre de données en entrée.
    Question: j'ai un tableau tabarr[1..3000] de 3000 valeurs de type double que j'initialise à 0. Mon signal S est formé de 2000 valeurs. J'introduis ces 2000 valeurs dans les 2000 premières cellules de tabarr, les 1000 autres restant à 0.
    Si j'appelle mean avec en entrée tabarr, alors, delphi croira que mon signal a 3000 valeurs et donnera un résultat erroné.
    Sinon, comment faire passer mes 2000 valeurs dans un tableau ouvert ?

    Je suis perdu...

    Merci d'avance,

    Fred

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 856
    Points : 11 290
    Points
    11 290
    Billets dans le blog
    6
    Par défaut
    Un tableau ouvert connaît sa taille ; on n'a donc pas à lui fournir la taille en plus de l'adresse du 1° élément, comme en C.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    type
      TmyArray = array of Extended;
     
    var
      MyArray: TmyArray;
     
    begin
      SetLength(MyArray, 2000); // on lui donne sa taille
      for i:= 1 to 2000 do MyArray[i-1]:=0.5; // tableaux zero-based
      if Mean(MyArray)<>0.5 then ShowMessage('étonnant, non ?');
      SetLength(MyArray, 0); // libère la mémoire    
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 684
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 684
    Points : 13 093
    Points
    13 093
    Par défaut
    AlfredKr semble déclarer un tableau statique de 3000 éléments. Dans ce cas, il faut passer par Slice pour ne récupérer que les 2000 premiers.
    Attention aux termes : Ce qu'on appelle tableau ouvert est un paramètre d'une fonction. Par exemple Slice déclare un paramètre tableau ouvert et on lui passe un tableau statique ou dynamique

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    De mémoire, vérifier les formules
    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
    function Stat (Tableau:array of double; var moyenne,ecarttype:double;var n:integer);
    var Sigma,Sigma2;double;
        i:integer;
    begin
        n:=length(tableau)
        moyenne=0;
        Eccarttype:=0;
        if n=0 then exit;
        for i:=0 to n-1 do begin
            Sigma:=Sigma+tableau[i];
            Sigma2:=Sigma2+tableau[i]*tableau[i];
        end;
        Moyenne:=Sigma/n;
        if n>1 then
            Ecarttype:=((Sigma2-Sigma*sigma/)(n-1))^0.5
    end;

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut
    Merci tout d'abord à vous 2 pour vos réponses et leurs rapidités. J'apprécie vraiment.
    Donc, si j'ai bien compris, je pourrais faire comme Mr tourlourou, créer myarray, lui imposer une longueur égale à celle du signal par setlength et l'appeler dans mean sans oublier de le libérer après.
    C'est quand même embétant de passer par là ! Meme si mean connait le nombre d'éléments de myarray, il faut quand faire un mouvement de cellules. C++ est plus souple.

    Merci encore,

    Fred

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 856
    Points : 11 290
    Points
    11 290
    Billets dans le blog
    6
    Par défaut
    Mouvement de cellules ?

    La seule facilité du C me semble être qu'on peut passer n'importe quelle cellule comme premier élément, mais avec l'obligation de passer le nombre d'éléments à prendre en considération. En fait, car le C ne reconnaît pas les tableaux en eux-mêmes, mais seulement les pointeurs !

    Si tous tes sous-tableaux débutent au 1° élément du tableau dont tu disposes, la fonction Slice citée par Andnotor est la meilleure solution.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut
    Merci Tourlourou.
    Je ne connais pas slice mais je vais me documenter avec l'aide delphi. Je pense que c'est un move ou glissement...

    Fred

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut
    Je viens de regarder la fonction slice; c'est exactement ce qu'il me faut. Slice renvoie une partie d'un tableau dans un tableau ouvert.

    Merci à vous 2,

    Fred

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/12/2010, 00h17
  2. Réponses: 3
    Dernier message: 19/12/2009, 11h49
  3. [hibernate] utilisation des fonctions d'aggregation
    Par osopardo dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/08/2005, 09h41
  4. utilisation des fonctions d'une dll
    Par jackk dans le forum C++
    Réponses: 14
    Dernier message: 15/06/2005, 16h50
  5. Utiliser des fonctions Pascal
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/03/2004, 15h43

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