我想创建一个函数,在某个指定区域添加几个不同宽度的高斯项:
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不知道应该添加什么,乘以或保持向量)。这甚至可能吗?
答案 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
向量中,其中n
是x
中元素的总数。把这一切放在一起给了我们:
out = exp(-(x(:).^2)*b(:).')*a(:);
要最终将其抽象为匿名函数,请执行:
N_gauss = @(a,b,x) exp(-(x(:).^2)*b(:).')*a(:);
此功能会根据您的问题接收向量a
,b
和x
。