我如何将此函数概括为“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 向量中,其中 nx 中元素的总数。把这些放在一起给我们:

out = exp(-(x(:).^2)*b(:).')*a(:);

要最终将其抽象为匿名函数,请执行以下操作:

N_gauss = @(a,b,x) exp(-(x(:).^2)*b(:).')*a(:);

此函数根据您的问题接收向量 abx