web-dev-qa-db-fra.com

Dans MATLAB, puis-je avoir un script et une définition de fonction dans le même fichier?

Supposons que j’ai une fonction f() et que je veuille l’utiliser dans my_file.m, qui est un script.

  1. Est-il possible d'avoir la fonction définie dans my_file.m?
  2. Sinon, supposons que je le définis dans f.m. Comment puis-je l'appeler dans my_file.m?

J'ai lu la documentation en ligne, mais le meilleur moyen de le faire n'était pas clair.

76
Viktor

À partir de la version R2016b, vous pouvez avoir fonctions locales dans les scripts , comme suit:

data = 1:10;            % A vector of data
squaredData = f(data);  % Invoke the local function

function y = f(x)
  y = x.^2;
end

Avant la version R2016b, le seul type de fonction pouvant être défini dans un script MATLAB était un fonction anonyme . Par exemple:

data = 1:10;            % A vector of data
f = @(x) x.^2;          % An anonymous function
squaredData = f(data);  % Invoke the anonymous function

Notez que les fonctions anonymes conviennent mieux à des opérations simples, car elles doivent être définies dans une seule expression. Pour des fonctions plus complexes, vous devrez les définir dans leurs propres fichiers, placez-les quelque part sur le chemin MATLAB pour les rendre accessibles à votre script, puis appelez-les à partir de votre script comme vous le feriez avec n'importe quel autre une fonction.

48
gnovice

La façon dont je contourne cette limitation consiste à transformer mes scripts en fonctions qui ne prennent aucun argument (si j'ai besoin de variables de l'espace de noms global, je les transmets explicitement à la fonction ou j'utilise "evalin" pour les récupérer).

Ensuite, vous pouvez définir toutes les fonctions supplémentaires dont vous avez besoin dans le "script". C'est un bidouillage, mais je l'ai trouvé assez puissant dans les cas où j'ai besoin de plusieurs fonctions non triviales.

EDIT: Voici un exemple simpliste. Tout cela peut résider dans un seul fichier.

function [] = myScriptAsAFunction()
   img = randn(200);
   img = smooth(img);
   figure(1);
   imagesc(img);
   axis image;
   colorbar;
end

function simg = smooth(img)
    simg = img / 5;
end
37
John

Vous pouvez faire quelque chose comme ça (en supposant que votre fichier s'appelle my_file.m):

function my_file
   %script here
end

function out = f(in)
   %function here
end

Si vous cliquez sur le bouton Exécuter, la fonction my_file sera exécuté par défaut.

19
Oneiros

1) Vous ne pouvez pas imbriquer une fonction dans un script.

2) Assurez-vous que f.m est sur votre chemin ou dans le répertoire en cours, et vous pouvez l’appeler comme n’importe quelle autre fonction.

7
Rich C

à partir de R2016b , vous pouvez définir des fonctions locales dans un script.

x = 1;
y = add1(x);

function z = add1(x)
    z = x + 1;
end
6
Suever

J'ai implémenté la solution de John , et je l'ai trouvée utile. Mais il y a quelques mises en garde (dans Octave; Matlab se comporte peut-être de la même manière):

  1. Si le code à l'intérieur de votre fonction principale contient clear all avant d’utiliser la fonction auxiliaire, cela ne fonctionnera pas. Dans le fichier test3.m, commentant/décommentant clear all fait que le code fonctionne/ne fonctionne pas.

    function [] = test3()
      %clear all
      a = myfunc( 1 );
      a
    endfunction;
    
    %---------------------------------
    % Auxiliary functions
    
    function retval = myfunc( a )
      retval = 2 * a;
    endfunction;
    

    Il semble que lors de l'exécution d'un script, il existe un premier passage dans lequel le code en dehors des fonctions est exécuté (dans ce cas, il n'y en a pas), et les fonctions définies (dans ce cas, test3 et myfunc) sont ajoutés à l’espace de travail. Un second passage exécuterait la fonction principale, qui ne trouverait pas myfunc si clear all c'est actif.

  2. Comme le souligne chessofnerd, les variables prêtes à l'emploi de votre fonction principale ne vont pas dans l'espace de travail.

3
sancho.s

Vous pouvez avoir plusieurs fonctions dans un fichier exemple. Mais seul le premier peut servir de fonction principale lorsque vous exécutez le fichier. D'autres peuvent être utilisés simplement dans ce fichier. Pour certaines situations, vous voulez définir une grande fonction. Vous pouvez le séparer en fonctions plus petites et définir ci-dessous.

Cependant, le moyen le plus simple de trouver la réponse est d'essayer ~

2
Ayo Dollars