在输出向量的匿名函数中创建可变数量的项
Create a variable number of terms in an anonymous function that outputs a vector
我想创建一个匿名函数来执行如下操作:
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 解决方案绝对不是最好的,因为 MATLAB 中的递归函数调用不是很有效,你可以快速 运行 达到最大递归深度(默认为 500)。
您可以引入一个新维度,您可以沿该维度对数组 a
和 b
求和。假设x
、a
和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]
的矩阵。此 vector-matrix 产品还将为我们执行求和。
Mini-proof:
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
最后一个命令returns1
,所以两者本质上是一样的
我想创建一个匿名函数来执行如下操作:
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 解决方案绝对不是最好的,因为 MATLAB 中的递归函数调用不是很有效,你可以快速 运行 达到最大递归深度(默认为 500)。
您可以引入一个新维度,您可以沿该维度对数组 a
和 b
求和。假设x
、a
和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]
的矩阵。此 vector-matrix 产品还将为我们执行求和。
Mini-proof:
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
最后一个命令returns1
,所以两者本质上是一样的