一维向量的梯度和拉普拉斯梯度在Matlab中给出不同的结果

时间:2016-05-25 21:11:35

标签: matlab

我有一个1维向量:

p = [1 3 6 10 16 18 29];

laplace = del2(p);
px= gradient(p);
pxx=gradient(px);

由于它是一维的,矢量的拉普拉斯必须等于梯度的梯度。然而,他们给出了完全不同的结果。

laplace =    0.2500    0.2500    0.2500    0.5000   -1.0000    2.2500    5.5000
pxx =    0.5000    0.7500    1.2500    0.2500    0.7500    3.5000    4.5000

1 个答案:

答案 0 :(得分:1)

更简单的例子:

gradient(gradient((1:10).^2))
1, 1.5, 2, 2, 2, 2, 2, 2, 1.5, 1

4*del2((1:10).^2)
2, 2, 2, 2, 2, 2, 2, 2, 2, 2

因此,gradient会对第一个和最后一个值进行不同的处理(因此gradient(gradient())具有不同的前两个和后两个条目,del2线性推断。)

del2必须乘以4才能与gradient(gradient())

兼容

如果您查看代码(edit del2edit gradient),您会看到渐变对内部点采取对称差异(将前一个点和下一个点相等)。 del2做同样但只做一次。因此gradient(gradient())会更加平滑。

但是,如果我使用del2这样的内核来平滑[0.25 0.5 0.25]的结果,那么我可以得到与gradient(gradient())完全相同的结果。

p = [1 3 6 10 16 18 29];
conv(4 * del2(p), [0.5,1,0.5] / 2, 'same')
0.75, 1, 1.25, 0.25, 0.75, 9, 13.25
gradient(gradient(p))
0.5, 0.75, 1.25, 0.25, 0.75, 3.5, 4.5

请注意,中央三个值相同,每边的两个边框值不同,因为边框的处理方式不同。