3 votes

Somme de N poignées de fonctions dans MATLAB

Tengo N fonctions dans MATLAB et je peux les définir en utilisant strcat , num2str y eval dans une boucle for. Ainsi, sans définir à la main, je suis capable de définir N fonctions. Soit N=4 et qu'ils soient donnés comme suit :

f1=@(x) a1*x+1;
f2=@(x) a2*x+1;
f3=@(x) a3*x+1;
f4=@(x) a4*x+1;

Maintenant, j'additionne ces quatre fonctions et je peux le faire à la main comme suit :

f=@(x)(f1(x)+f2(x)+f3(x)+f4(x));

Ici je peux le faire à la main parce que je sais que N=4 . Cependant, en général, je ne sais jamais combien de fonctions je vais avoir. Dans tous les cas, je ne peux pas écrire une nouvelle fonction.

Existe-t-il un moyen de le faire automatiquement ? Je veux dire que si je donne N=6 Je m'attends à ce que MATLAB me donne ceci :

f=@(x)(f1(x)+f2(x)+f3(x)+f4(x)+f5(x)+f6(x));

Chaque fois que je donne N=2 alors je dois avoir la fonction f définis comme suit :

f=@(x)(f1(x)+f2(x));

Comment pouvons-nous faire cela ?

2voto

Cris Luengo Points 22016

Tout d'abord, vous devriez lire cette réponse qui donne une série de raisons pour éviter l'utilisation de eval . Il y a très peu d'occasions où eval est nécessaire, dans tous les autres cas, cela ne fait que compliquer les choses. Dans ce cas, vous utilisez pour générer dynamiquement des noms de variables, ce qui est considéré comme une très mauvaise pratique. Comme détaillé dans la réponse liée et dans d'autres écrits liés à cette réponse, les noms de variables dynamiques rendent le code plus difficile à lire, plus difficile à maintenir et plus lent à exécuter dans MATLAB.

Ainsi, au lieu de définir des fonctions f1 , f2 , f3 , ... fN Ce que vous faites, c'est définir des fonctions f{1} , f{2} , f{3} , ... f{N} . C'est-à-dire, f est un tableau de cellules où chaque élément est une fonction anonyme (ou tout autre handle de fonction).

Par exemple, au lieu de

f1=@(x) a1*x+1;
f2=@(x) a2*x+1;
f3=@(x) a3*x+1;
f4=@(x) a4*x+1;

vous le faites

N = 4;
a = [4.5, 3.4, 7.1, 2.1];
f = cell(N,1);
for ii=1:N
   f{ii} = @(x) a(ii) * x + 1;
end

Avec ces changements, nous pouvons facilement répondre à la question. Nous pouvons maintenant écrire une fonction qui produit la somme des fonctions dans f :

function y = sum_of_functions(f,x)
   y = 0;
   for ii=1:numel(f)
      y = y + f{ii}(x);
   end
end

Vous pouvez mettre cela dans un fichier appelé sum_of_functions.m ou vous pouvez le mettre à la fin de votre fichier de fonction ou de votre fichier script, cela n'a pas d'importance. Maintenant, dans votre code, lorsque vous voulez évaluer y = f1(x) + f2(x) + f3(x)... ce que vous écrivez est y = sum_of_functions(f,x) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X