如何将此函数概括为“n”项?

时间:2016-01-14 23:05:45

标签: matlab function vectorization anonymous-function

我想创建一个函数,在某个指定区域添加几个不同宽度的高斯项:

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不知道应该添加什么,乘以或保持向量)。这甚至可能吗?

1 个答案:

答案 0 :(得分:2)

你可以纯粹通过矩阵乘法来做到这一点。让我们慢慢解决问题并逐步解决问题。您首先需要形成向量b的元素和存储在x中的标量值的乘积。首先创建一个值的二维矩阵,其中每一行对应于b中的元素和x中的元素之间的产品值。此矩阵中的元素(i,j)对应于x中i th 元素与b中j th 元素的乘积

您可以使用outer product来实现此目的。将x设为列向量,将b设为行向量,然后执行乘法。另外,请确保对方程中所见的x项进行平方。

term1 = (x(:).^2)*b(:).';

现在你可以应用指数运算符并确保在指数中放置负数,这样你就可以构建每个项的右侧(即exp(- b_i x^2)):

term2 = exp(-term1);

您需要做的最后一件事是将2D矩阵中的每个值与a向量中的正确系数相乘。您可以通过强制a成为列向量并执行矩阵向量乘法来实现此目的。

out = term2*a(:);

矩阵向量乘法是列向量a与我们之前创建的2D矩阵中每一行之间的点积。这恰好对应于x中每个值的等式的总和。因此,这实现了x中每个值的高斯求和,并将其置于n x 1向量中,其中nx中元素的总数。把这一切放在一起给了我们:

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

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

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

此功能会根据您的问题接收向量abx