MATLAB中N个函数句柄求和

Summation of N function handles in MATLAB

我在 MATLAB 中有 N 函数,我可以在 for 循环中使用 strcatnum2streval 来定义它们。因此,无需手动定义,我就可以定义 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));

我们如何做到这一点?

首先,你应该阅读,它给出了避免使用eval的一系列理由。很少有需要 eval 的情况,在所有其他情况下,它只会使事情复杂化。在这种情况下,您使用动态生成变量名,这被认为是一种非常糟糕的做法。正如链接的答案和该答案中链接的进一步著作中所详述的那样,动态变量名称使代码更难阅读、更难维护,并且在 MATLAB 中执行速度更慢。

所以,不是定义函数 f1f2f3、... 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).