我如何将此函数概括为“n”项?
How can I generalize this function to `n` terms?
我想创建一个函数,在某个指定区域添加几个不同宽度的高斯项:
G(a,b,x) = a_1 exp(- b_1 x^2) + a_2 exp(- b_2 x^2) + ... a_N exp(-b_N x^2)
我希望此函数输出长度为 x
的数组,对提供的参数 a,b
的条款求和,例如:
x = linspace(-2,2,1000);
N_gauss = @(a,b) a(:).*exp(-b(:)*x.^2);
如果 a,b
只有一个值,这个例子实际上可以工作,但是当它们变成向量时它就不再工作了(我想 Matlab 不知道应该添加什么,乘什么或者保持一个向量)。这甚至可能吗?
你完全可以通过矩阵乘法来做到这一点。让我们慢慢解决这个问题,然后逐步解决。您首先需要形成向量元素 b
和存储在 x
中的标量值的乘积。首先创建一个二维值矩阵,其中每一行对应于 b
中的元素和 x
中的元素之间的 product-wise 值。此矩阵中的元素(i,j)
对应于x
中第i个元素与第j个元素的乘积在 b
.
您可以使用 outer product 来实现。使 x
成为列向量,b
成为行向量,然后执行乘法。另外,请确保对方程中的每个 x
项进行平方。
term1 = (x(:).^2)*b(:).';
现在您可以应用指数运算符并确保在指数中放置负数,以便您可以构建每个项的右侧(即 exp(- b_i x^2)
):
term2 = exp(-term1);
您需要做的最后一件事是将二维矩阵中的每个值与 a
向量中的正确系数相乘。您可以通过强制 a
为列向量并执行 matrix-vector 乘法来实现。
out = term2*a(:);
Matrix-vector 乘法是列向量 a
与我们之前创建的二维矩阵中每一行的点积。这正好对应于 x
中每个值的等式总和。因此,这实现了 x
中每个值的高斯求和,并将其放入 n x 1
向量中,其中 n
是 x
中元素的总数。把这些放在一起给我们:
out = exp(-(x(:).^2)*b(:).')*a(:);
要最终将其抽象为匿名函数,请执行以下操作:
N_gauss = @(a,b,x) exp(-(x(:).^2)*b(:).')*a(:);
此函数根据您的问题接收向量 a
、b
和 x
。
我想创建一个函数,在某个指定区域添加几个不同宽度的高斯项:
G(a,b,x) = a_1 exp(- b_1 x^2) + a_2 exp(- b_2 x^2) + ... a_N exp(-b_N x^2)
我希望此函数输出长度为 x
的数组,对提供的参数 a,b
的条款求和,例如:
x = linspace(-2,2,1000);
N_gauss = @(a,b) a(:).*exp(-b(:)*x.^2);
如果 a,b
只有一个值,这个例子实际上可以工作,但是当它们变成向量时它就不再工作了(我想 Matlab 不知道应该添加什么,乘什么或者保持一个向量)。这甚至可能吗?
你完全可以通过矩阵乘法来做到这一点。让我们慢慢解决这个问题,然后逐步解决。您首先需要形成向量元素 b
和存储在 x
中的标量值的乘积。首先创建一个二维值矩阵,其中每一行对应于 b
中的元素和 x
中的元素之间的 product-wise 值。此矩阵中的元素(i,j)
对应于x
中第i个元素与第j个元素的乘积在 b
.
您可以使用 outer product 来实现。使 x
成为列向量,b
成为行向量,然后执行乘法。另外,请确保对方程中的每个 x
项进行平方。
term1 = (x(:).^2)*b(:).';
现在您可以应用指数运算符并确保在指数中放置负数,以便您可以构建每个项的右侧(即 exp(- b_i x^2)
):
term2 = exp(-term1);
您需要做的最后一件事是将二维矩阵中的每个值与 a
向量中的正确系数相乘。您可以通过强制 a
为列向量并执行 matrix-vector 乘法来实现。
out = term2*a(:);
Matrix-vector 乘法是列向量 a
与我们之前创建的二维矩阵中每一行的点积。这正好对应于 x
中每个值的等式总和。因此,这实现了 x
中每个值的高斯求和,并将其放入 n x 1
向量中,其中 n
是 x
中元素的总数。把这些放在一起给我们:
out = exp(-(x(:).^2)*b(:).')*a(:);
要最终将其抽象为匿名函数,请执行以下操作:
N_gauss = @(a,b,x) exp(-(x(:).^2)*b(:).')*a(:);
此函数根据您的问题接收向量 a
、b
和 x
。