在输出向量的匿名函数中创建可变数量的术语

anon01

我想创建一个执行以下操作的匿名函数:

n = 5;
x = linspace(-4,4,1000);

f = @(x,a,b,n) a(1)*exp(b(1)^2*x.^2) + a(2)*exp(b(2)^2*x.^2) + ... a(n)*exp(b(n)^2*x.^2);

我可以这样做,而无需传递显式参数n

f1  = @(x,a,b) a(1)*exp(-b(1)^2*x.^2);
for j = 2:n 
    f1  = @(x,a,b) f1(x,a,b) + a(j)*exp(b(j)^2*x.^2);
end

但看起来,似乎有点hacky。有人对此有更好的解决方案吗?我想知道别人会怎么对待。

安德拉斯·迪克(Andras Deak)

hacky解决方案绝对不是最好的解决方案,因为MATLAB中的递归函数调用效率不是很高,而且您可以很快遇到最大递归深度(默认为500)。

您可以引入一个新维度,沿着该维度可以总结数组ab假设xa并且b是行向量:

f = @(x,a,b,n) a(1:n)*exp((b(1:n).^2).'*x.^2)

这将使用第一维作为求和维:(b(1:n).^2).'是一个列向量,乘以该列会产生一个矩阵x(准确地说,这是一个二乘积)。生成的n * length(x)矩阵可以乘以a(1:n),因为后者是大小矩阵[1,n]这个矢量矩阵乘积也将为我们执行求和。

迷你打样:

n = 5;
x = linspace(-4,4,1000);
a = rand(1,10);
b = rand(1,10);

y = 0;
for k=1:n
   y = y + a(k)*exp(b(k)^2*x.^2);
end

y2 = a(1:n)*exp((b(1:n).^2).'*x.^2);   %'

all(abs(y-y2))<1e-10

最后一条命令返回1,因此两者本质上是相同的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章