我正在尝试使用3种不同的方法来获得拉普拉斯算子,如果1和2的结果相同,但3的错误是什么?
以下是Matlab中的代码:
m= magic(6)
Lap1Dx= convn(m,[-1 2 -1],'same')
Lap1Dy= convn(m,[-1;2;-1],'same')
%ver1
Lap2Dxy= convn(m,[0 -1 0;-1 4 -1;0 -1 0],'same')
%ver2
Lap2Dxy= Lap1Dx+Lap1Dy %same as ver 1
%ver 3
%get laplacian using gradients
gradx= convn(m,[-1 1],'same')
grady= convn(m,[-1;1],'same')
gradxx= convn(gradx,[-1 1],'same')
gradyy= convn(grady,[-1;1],'same')
Lap2Dxy= gradxx+gradyy
输出:
m =
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
Lap1Dx =
69 -39 -15 27 -12 29
-26 54 -39 12 0 27
53 -15 -27 15 12 13
-12 15 21 -9 -12 20
55 -54 51 -24 0 18
-28 39 9 -21 12 4
Lap1Dy =
67 -30 5 31 15 23
-60 54 6 -6 0 6
51 -42 -36 6 21 0
-45 42 30 0 -21 -6
48 -54 6 -6 0 6
-22 67 24 14 22 6
Lap2Dxy =
136 -69 -10 58 3 52
-86 108 -33 6 0 33
104 -57 -63 21 33 13
-57 57 51 -9 -33 14
103 -108 57 -30 0 24
-50 106 33 -7 34 10
Lap2Dxy =
136 -69 -10 58 3 52
-86 108 -33 6 0 33
104 -57 -63 21 33 13
-57 57 51 -9 -33 14
103 -108 57 -30 0 24
-50 106 33 -7 34 10
gradx =
34 -5 -20 7 -5 24
-29 25 -14 -2 -2 25
22 7 -20 -5 7 20
-20 -5 16 7 -5 15
25 -29 22 -2 -2 16
-32 7 16 -5 7 11
grady =
32 -31 -1 5 -4 -1
-28 23 5 -1 -4 5
23 -19 -31 5 17 5
-22 23 -1 5 -4 -1
26 -31 5 -1 -4 5
4 36 29 13 18 11
gradxx =
39 15 -27 12 -29 24
-54 39 -12 0 -27 25
15 27 -15 -12 -13 20
-15 -21 9 12 -20 15
54 -51 24 0 -18 16
-39 -9 21 -12 -4 11
gradyy =
60 -54 -6 6 0 -6
-51 42 36 -6 -21 0
45 -42 -30 0 21 6
-48 54 -6 6 0 -6
22 -67 -24 -14 -22 -6
4 36 29 13 18 11
Lap2Dxy =
99 -39 -33 18 -29 18
-105 81 24 -6 -48 25
60 -15 -45 -12 8 26
-63 33 3 18 -20 9
76 -118 0 -14 -40 10
-35 27 50 1 14 22
答案 0 :(得分:2)
首先,有一些标志问题。与[-1 1]进行比较可以得到带减号的一阶导数:卷积翻转两个数组中的一个,因此您可以从下一个数组中减去每个元素。与[1 -1]对比得到一阶导数。对于二阶导数,请使用[1 -2 1]。
但这里的主要问题与截断('same'参数)有关。使用前两种方法,您将进行卷积,然后进行截断。使用第三个,你进行卷积,然后截断,然后再次卷积并再次截断。
由于可以在一维数组上看到问题,我将专注于你的第一行。我们暂时删除参数same
:
m = [35 1 6 26 19 24]
mx = convn(m,[1 -1]) // [35 -34 5 20 -7 5 -24]
mxx = convn(mx,[1 -1]) // [35 -69 39 15 -27 12 -29 24]
m2x = convn(m,[1 -2 1]) // [35 -69 39 15 -27 12 -29 24]
如您所见,结果完全相同。接下来,使用'same'参数:
mx = convn(m,[1 -1],'same') // [-34 5 20 -7 5 -24]
mxx = convn(mx,[1 -1],'same') // [39 15 -27 12 -29 24]
m2x = convn(m,[1 -2 1],'same') // [-69 39 15 -27 12 -29]
对于m2x,'same'干净地选择完整卷积的中间部分,这正是你想要的部分。
但对于一阶导数,只有一个要素可以下降。必须做出选择,并且丢弃第一个(导致前向差异)。计算mxx时,必须再次。因此,由于两次完全卷积的第一个元素被丢弃,最终会得到一个移位数组。这就是为什么mxx与m2x具有大多数相同的数字,除了未对齐。
如果你坚持进行两步卷积(一阶导数,然后是第二阶段),那么第一个卷积必须没有任何截断。否则,截断会影响第二次卷积的结果。对于第二个,您可以使用“相同”,但另外,需要删除最后一个元素。像这样。
mx = convn(m, [1 -1])
mxx = convn(mx,[1 -1],'same')
mxx = mxx(1:end-1)
或者,相当于
mx = convn(m, [1 -1])
mxx = convn(mx,[1 -1])
mxx = mxx(2:end-1)