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

MATLAB Discussion :

Peut-on définir des fonctions dans un script ?


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut Peut-on définir des fonctions dans un script ?
    Bonjour. Je sais qu'on peut définir des fonctions dans des m-file puis les appeler dans un script contenu dans un autre m-file. Cela présente l'inconvénient d'avoir plusieurs fichiers à "transporter". Je voudrais savoir si c'est possible d'insérer (ou définir) des fonctions dans un script, de sorte que les fonctions soient définies dans le même fichier que le script.

    Merci d'avoir lu mon message!

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Non.
    Il suffit d'essayer et tu auras un message d'erreur.

    Pourquoi ne pas transformer ton script en fonction, tu pourras alors lui mettre des sous-fonctions.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Merci. Ton est intéressante mais pas aisé à mettre en œuvre pour moi, débutant; surtout que j'ai environ 500 variables d'entrée pour mon script. Je me suis donc résigné à créer les fonctions chacune dans son m-file.
    Merci.

  4. #4
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Comment se présentent ces "variables d'entrée" ? (je mets le terme entre guillements puisqu'un script n'a pas de variables d'entrées justement)

    Tu pourrais très bien les enregistrer dans un fichier .mat (voir SAVE) et les charger au début de ta fonction (voir LOAD)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Tu as peut-être raison en disant cela. Ce que j'appelle variable ce sont les différentes données que je spécifie (ou j'initialise) avant de lancer mon script et également les valeurs que le script doit me retourner à la sortie. En écrivant ces mots, cela me fait penser à la définition d'une fonction! Seulement, mes variables d'entrée prennent différentes valeurs au cours de l'exécution que je dois enregistrer au cours de l'exécution et le fournir au système en cas de besoin.
    J'avoue que je suis confus à la fin!

  6. #6
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Te serait-il possible de fournir :
    - le fichier (?) qui initialise tes données
    - le script
    - les endroits où les variables sont modifiées, comment elles sont enregistrées et fournies au "système"

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Merci de s'intéresser à mon cas! J'avoue que je n'ai pas le droit de mettre le code en ligne, autrement je l'aurais fait. Je l'avais écrit en VBA et ça marchait très bien. Je te donne en gros la structure, afin de me dire, si cela doit être un script ou une fonction dans matlab (pour faire simple).
    J'ai un fichier de données (data) et un fichier où j'enregistre les difféentes valeurs prises par les variables durant la boucle Tant que*.
    Architecture

    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
    'Définition de 20 functions qui ont un ou deux arguments dans l'ensemble {t,p,H,x}
    f1(x) = ...
    f2(t) = ...
     
    'Déclaration des types de variables: environ 500 variables
     
    'Conditions initiales
    Mo = 10; To = 5; etc.
     
    Ouverture du ficher source "data"
    Ouverture de fichier d'enregistrement "resultat"
     
    'Traitement
    Tant qu* 'on n'est pas en fin de fichier
             Lire deux lignes spécifiques de data
             Tests (if ... then), boucles (for)
             Résolutions de sytèmes d'équations
             Calculs
             Enregistrer les résultats dans "resultat"
             Réaffectation de valeurs entre variables (initialisation)
    Fin
     
    Fermeture des fichiers ouverts.
               FIN
    A la fin, j'obtiens donc un fichier txt avec des variables (elles varient en fonction du temps) et c'est le but du programme de trouver leur variations.

    Mieux vaut un script ou une fonction?

    Merci encore.

  8. #8
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    J'avoue ne pas très bien comprendre ton architecture.
    Surement parce qu'elle a été pensée pour VBA (je dit ça à cause de la déclaration de type, qui ne se fait pas sous MATLAB).

    En fait personnellement je dirais que le script sous MATLAB doit être utilisé uniquement en dernier recours quand on n'a pas le choix (par exemple avec Simulink cela arrive souvent).
    En général il faut toujours mieux faire une fonction qui ainsi a son propre environnement contrairement au script qui interagit avec le Workspace (environnement) de la Command Window.
    ( Quelle est la durée de vie des variables ?)

    Pour en revenir à ton architecture :
    - A quoi correspondent tes définitions de fonctions ?
    - A quoi correspond la ligne :
    Réaffectation de valeurs entre variables (initialisation)

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Pour commencer, j'ai envie de dire "ne fais jamais de script". Un script travaille dans le workspace Matlab, il peut écraser des variables qui y existent déjà, il peut rester des trucs dans ce workspace d'une précédente exécution qui peuvent fausser ton comportement (ex : si tu crées une variable en vérifiant préalablement qu'elle n'existe pas déjà), tu risques d'écraser les variables de ton application en rentrant des trucs dans la console ou en lançant d'autres scripts, etc... En Matlab, une fonction peut être sans retour et sans paramètre. Si ton fichier de script s'appelle monMachin.m, je te conseille de rajouter tout simplement en haut de ce fichier :


    Je viens de développer une application avec une 15aine de variables à passer en paramètres à plein de fonctions, à appeler dans des callbacks pour une interface graphique, etc... Une solution "simple" dans ce genre de cas est de mettre tes variables pourrait être de les mettre dans une structure.



    Enfin, dernière remarque : espérer faire du développement informatique dans un seul fichier est une hérésie




    EDIT : rah ! Mais j'ai été une vraie tortue à taper, j'avais pas vu le post de Caroline... Au moins on pense la même chose

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Définition de fonction. Exemple
    En VBA:
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function CPEE(t) As Double ' Calcule le Cp de l'eau
    CPEE = 4.21936664613821 - 3.51929549287822E-03 * t + 1.24530091072947E-04 * t ^ 2 - 2.43005990458434E-06 * t ^ 3 + 2.86238532085487E-08 * t ^ 4 - 1.79520764811223E-10 * t ^ 5 + 4.67623713930991E-13 * t ^ 6
    End Function
    En Matlab:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function y = CPEE(t)
    %CPEE Calcule le Cp de l'eau
    y = 4.21936664613821 - 3.51929549287822E-03 * t + 1.24530091072947E-04 * t ^ 2 - 2.43005990458434E-06 * t ^ 3 + 2.86238532085487E-08 * t ^ 4 - 1.79520764811223E-10 * t ^ 5 + 4.67623713930991E-13 * t ^ 6;
    Réaffectation des variables:
    Je prend l'exemple sur une variable T1. Au début (avant l'exécution de la boucle de traitement), j'ai donné une valeur à T1 soit T1 = Tse.
    Après le traitement, j'"initialise" T1 en faisant T1 = Tse (Tse est une valeur issue de l' exécution de la boucle de traitement).
    La boucle de T. s'exécute environ 1 million de fois (ce qui peut prendre des jours!, et justement j'espère que Matlab fera mieux). A chaque exécution, je fait toujours T1 = Tse. c'est ce que j'appelle réaffectation.

    J'espère avoir été un peu plus clair.

    Merci

  11. #11
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Cette fonction est vraiment appelée à plusieurs endroits de ton code ?

    Parce que faire une fonction pour une ligne de calcul....

    Enfin je suppose que ce n'est qu'un exemple.

    Le truc c'est que la philosophie de MATLAB est très différente de celle de VBA.
    Donc je pense qu'il faudrai que tu revois le schéma de ton algorithme.

    Sur ton autre post (Comment parcourir une table (fichier txt) ?) tu ne m'avais pas répondu : as-tu au moins essayé sans faire de boucle ?

    En plus es-tu vraiment obligé de passer par des fichiers textes ?
    (sous MATLAB le format le plus adapté c'est les fichiers MAT)
    Quels sont les résultats finaux qui t'intéressent ?
    Pourquoi sauvegarder des résultats intermédiaires ?

    Et sinon pour répondre à ta question de départ car je m'éloigne du sujet (pour ton bien je t'assure ) :
    Je pense que dans un 1er temps tu peux transformer ton script en fonction en rajoutant juste fonction <nomfichier> au début puisque tu initialises tes variables dans ton script.

    Par contre il faut copier tes sous-fonctions en les mettant à la fin du script.
    (ou en faire des nested functions mais c'est plus long à faire => il faut rajouter un "end" à chaque fin de sous-fonction).

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Rah je clique sur répondre et je vois le message de Caroline dans "revoir le sujet"



    Pourquoi ne pas faire une boucle sur une fonction T1 = f(T1) ? Quelque chose d'itératif en fait.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    CPEE est la fonction la plus simple (simple polynôme!), juste pour illustration. J'ai besoin de sauvegarder les valeurs prises par les variables à la fin de chaque boucle. Pour comprendre, il faut imaginer que j'ai besoin par exemple de suivre ("calculer") l'évolution de la température dans un environnement "minute après minute" pendant un ou deux: la fin d'une itération correspond à une valeur calculée. Bien sûr, ce n'est pas la température seule qui est à suivre...
    Je crois que Bktero et toi finissez de me convaincre d'aller vers une fonction. Je vais donc me pencher sur la question...
    Je ne suis pas du tout de tenu d'utiliser des txt. Je vais là aussi me pencher la-dessus.
    Merci encore. Ceci dit, comme on dit chez moi : "Une poule ne remercie pas un dépotoir d'ordures." (elle y va quasi-permanemment pour y trouver à manger; c'est vrai qu'il faut avoir vécu en Afrique pour comprendre ça).

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Ca sous-entend que tu vas revenir poser des questions ça

    Je me doutais en fait de ton historique de calculs. Pour le stockage des valeurs intermédiaires, s'il n'y en a pas trop, tu peux mettre dans un tableau et sauvegarder le tableau après la boucle. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function boucle
    A(1)=1;
    for i = 1:10
        A(i+1) = f(A(i));
    end
    save('monfichier','A')
     
    function y = f(y)
    y = 2*y;

    Sinon, tu peux sauvegarder toutes les variables dans un fichier *.mat au fur et à mesure. Je ne l'ai jamais essayé, mais il y a une option -append à la fonction save, mais en faisait un petit essai, ça ne marche pas très bien car je n'ai que la dernière valeur de A

    EDIT : en regardant un autre sujet de l'aide Matlab, c'est normal, il écrase si une variable de même nom existe déjà dans le fichier .mat.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Merci pour la proposition de tableau et fichier *mat. Cela devrait réduire mon temps de calcul.

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Bonjour. Lorsque j'ai un fichier txt, comment est-ce que je le convertit simplement en fichier mat. En fait je prépare habituellement mes fichiers en Excel puis j'enrégistre en txt pour travailler habituellement. Comme je voudrais passer en mat, je cherche ...
    Merci.

  17. #17
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Tu vas être obligé de les relire un par un.
    Si ce sont des fichiers ne contenant que des nombres, et surtout sous forme de tableau 2-D (toutes les lignes ont le même nombre de colonnes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A=load('fichier.txt') %rajouter éventuellement l'option '-ascii'
    save('fichier.mat','A');

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Merci. Ca marche. Je continue mon chemin comme une tortue.

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    Je suis de retour with my struggles! J'ai puis mettre tout mon code sous Matlab d'abord en script (bien sûr!) puis en fonction. Pour la fonction, il a suffit que je fasse comme Caro-Line me l'a suggéré : en rajoutant juste fonction <nomfichier> au début et en recopiant les sous-fonctions que j'ai ajoutées en bas du code (ex-script). J'ai exécuté la forme "fonction" du code puis la forme script": les deux marchent bien. Seul déception: les temps d'exécution sont quasiment les mêmes pour les deux! Pire, c'est plus lent que sous Visual Basic en excel!!!
    Script: 1531 min (25h 31 min)
    Fonction: 1501 min (25h 01 min)
    VBA: 980 min (16h 20 min)

    Est-ce qu'en utilisant nested function ou subfonction ou autre, je gagnerai plus en temps?
    J'avoue que pour charger les données, j'ai utiliser un fichier *mat (mais pour la sortie, je suis encore avec txt ...).

    Merci.

  20. #20
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Ce n'est pas en changeant les sous-fonctions en nested ou autres que tu gagneras en optimisation.
    Le problème viens plutôt du fait, à mon avis, que tu as transformé littéralement un code VBA en code MATLAB, donc sans prendre en compte la "philosophie" de MATLAB.

    Pour t'aider à optimiser il nous faudrait ton code.
    Sinon tu peux utiliser le PROFILER pour savoir ce qui prend le plus de temps.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/02/2012, 17h24
  2. Définir des fonctions static dans un fichier séparé.
    Par contremaitre dans le forum Débuter
    Réponses: 11
    Dernier message: 04/02/2009, 17h14
  3. Réponses: 3
    Dernier message: 15/05/2008, 21h29
  4. Comment peut on integer des controles dans un prog opengl
    Par franck31400 dans le forum OpenGL
    Réponses: 2
    Dernier message: 28/04/2004, 09h06
  5. [VBA-E] Ajouter des fonctions dans Excel
    Par Clezio dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/03/2004, 01h18

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