Суммирование N дескрипторов функций в MATLAB - PullRequest
3 голосов
/ 27 сентября 2019

У меня есть N функции в MATLAB, и я могу определить их, используя strcat, num2str и eval в цикле for.Поэтому, не определяя вручную, я могу определить N функций.Пусть N=4 и пусть они будут заданы следующим образом:

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

Теперь я добавляю эти четыре функции и могу сделать это вручную следующим образом:

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

Здесь я могу сделатьэто от руки, потому что я знаю, что N=4.Однако, в общем, я никогда не знаю, сколько у меня будет функций.Во всех случаях я не могу написать новую функцию.

Есть ли способ сделать это автоматически?Я имею в виду, что если я дам N=6, я ожидаю, что MATLAB даст мне это:

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

Всякий раз, когда я даю N=2, тогда я должен иметь функцию f, определенную следующим образом:

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

Как мы можем это сделать?

1 Ответ

2 голосов
/ 28 сентября 2019

Прежде всего, вы должны прочитать этот ответ , который дает ряд причин избегать использования eval.Очень мало случаев, когда необходимо eval, во всех остальных случаях это просто усложняет ситуацию.В этом случае вы используете для динамического генерирования имен переменных, что считается очень плохой практикой.Как подробно описано в связанном ответе и в последующих статьях, связанных с этим ответом, имена динамических переменных усложняют чтение кода, его труднее поддерживать и медленнее выполнять в MATLAB.

Таким образом, вместо определения функций f1, f2, f3, ... fN, что вы делаете, это определяете функции f{1}, f{2}, f{3}, ... f{N}.То есть f - это массив ячеек, где каждый элемент является анонимной функцией (или любой другой дескриптор функции).

Например, вместо

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

вы делаете

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

С этими изменениями мы можем легко ответить на вопрос.Теперь мы можем написать функцию, которая выводит сумму функций в f:

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

. Вы можете поместить это в файл с именем sum_of_functions.m или в конец своей функции.файл или файл сценария, это не имеет значения.Теперь, в вашем коде, когда вы хотите оценить y = f1(x) + f2(x) + f3(x)..., вы пишете y = sum_of_functions(f,x).

...