Supposons que j’ai une fonction f()
et que je veuille l’utiliser dans my_file.m
, qui est un script.
my_file.m
?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.
À 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.
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
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.
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.
à 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
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):
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.
Comme le souligne chessofnerd, les variables prêtes à l'emploi de votre fonction principale ne vont pas dans l'espace de travail.
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 ~