MATLAB中N个函数句柄求和
Summation of N function handles in MATLAB
我在 MATLAB 中有 N
函数,我可以在 for 循环中使用 strcat
、num2str
和 eval
来定义它们。因此,无需手动定义,我就可以定义 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 中执行速度更慢。
所以,不是定义函数 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)
.
我在 MATLAB 中有 N
函数,我可以在 for 循环中使用 strcat
、num2str
和 eval
来定义它们。因此,无需手动定义,我就可以定义 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 中执行速度更慢。
所以,不是定义函数 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)
.