Python中的离散拉普拉斯算子(del2等价物)

Python中的离散拉普拉斯算子(del2等价物),python,numpy,scipy,scientific-computing,Python,Numpy,Scipy,Scientific Computing,我需要Python/Numpy等效的Matlab(倍频程)离散拉普拉斯算子(函数)del2()。我尝试了两种Python解决方案,它们似乎都与del2的输出不匹配。我有八度音阶 image = [3 4 6 7; 8 9 10 11; 12 13 14 15;16 17 18 19] del2(image) 这就是结果 0.25000 -0.25000 -0.25000 -0.75000 -0.25000 -0.25000 0.00000 0.00000 0.0

我需要Python/Numpy等效的Matlab(倍频程)离散拉普拉斯算子(函数)del2()。我尝试了两种Python解决方案,它们似乎都与del2的输出不匹配。我有八度音阶

image = [3 4 6 7; 8 9 10 11; 12 13 14 15;16 17 18 19]
del2(image)
这就是结果

   0.25000  -0.25000  -0.25000  -0.75000
  -0.25000  -0.25000   0.00000   0.00000
   0.00000   0.00000   0.00000   0.00000
   0.25000   0.25000   0.00000   0.00000
[[ 23  19  15  11]
 [  3  -1   0  -4]
 [  4   0   0  -4]
 [-13 -17 -16 -20]]
[[ 6  6  3  3]
 [ 0 -1  0 -1]
 [ 1  0  0 -1]
 [-3 -4 -4 -5]]
关于Python,我试过了

import numpy as np
from scipy import ndimage
import scipy.ndimage.filters

image =  np.array([[3, 4, 6, 7],[8, 9, 10, 11],[12, 13, 14, 15],[16, 17, 18, 19]])
stencil = np.array([[0, 1, 0],[1, -4, 1], [0, 1, 0]])
print ndimage.convolve(image, stencil, mode='wrap')
结果是什么

   0.25000  -0.25000  -0.25000  -0.75000
  -0.25000  -0.25000   0.00000   0.00000
   0.00000   0.00000   0.00000   0.00000
   0.25000   0.25000   0.00000   0.00000
[[ 23  19  15  11]
 [  3  -1   0  -4]
 [  4   0   0  -4]
 [-13 -17 -16 -20]]
[[ 6  6  3  3]
 [ 0 -1  0 -1]
 [ 1  0  0 -1]
 [-3 -4 -4 -5]]
我也试过了

scipy.ndimage.filters.laplace(image)
这就是结果

   0.25000  -0.25000  -0.25000  -0.75000
  -0.25000  -0.25000   0.00000   0.00000
   0.00000   0.00000   0.00000   0.00000
   0.25000   0.25000   0.00000   0.00000
[[ 23  19  15  11]
 [  3  -1   0  -4]
 [  4   0   0  -4]
 [-13 -17 -16 -20]]
[[ 6  6  3  3]
 [ 0 -1  0 -1]
 [ 1  0  0 -1]
 [-3 -4 -4 -5]]
因此,所有输出似乎都不匹配。倍频程代码del2.m表明它是一个拉普拉斯算子。我遗漏了什么吗?

也许你在找。

根据这里的代码

我试图编写一个与Python等效的代码。这似乎有效,任何反馈都将不胜感激

import numpy as np

def del2(M):
    dx = 1
    dy = 1
    rows, cols = M.shape
    dx = dx * np.ones ((1, cols - 1))
    dy = dy * np.ones ((rows-1, 1))

    mr, mc = M.shape
    D = np.zeros ((mr, mc))

    if (mr >= 3):
        ## x direction
        ## left and right boundary
        D[:, 0] = (M[:, 0] - 2 * M[:, 1] + M[:, 2]) / (dx[:,0] * dx[:,1])
        D[:, mc-1] = (M[:, mc - 3] - 2 * M[:, mc - 2] + M[:, mc-1]) \
            / (dx[:,mc - 3] * dx[:,mc - 2])

        ## interior points
        tmp1 = D[:, 1:mc - 1] 
        tmp2 = (M[:, 2:mc] - 2 * M[:, 1:mc - 1] + M[:, 0:mc - 2])
        tmp3 = np.kron (dx[:,0:mc -2] * dx[:,1:mc - 1], np.ones ((mr, 1)))
        D[:, 1:mc - 1] = tmp1 + tmp2 / tmp3

    if (mr >= 3):
        ## y direction
        ## top and bottom boundary
        D[0, :] = D[0,:]  + \
            (M[0, :] - 2 * M[1, :] + M[2, :] ) / (dy[0,:] * dy[1,:])

        D[mr-1, :] = D[mr-1, :] \
            + (M[mr-3,:] - 2 * M[mr-2, :] + M[mr-1, :]) \
            / (dy[mr-3,:] * dx[:,mr-2])

        ## interior points
        tmp1 = D[1:mr-1, :] 
        tmp2 = (M[2:mr, :] - 2 * M[1:mr - 1, :] + M[0:mr-2, :])
        tmp3 = np.kron (dy[0:mr-2,:] * dy[1:mr-1,:], np.ones ((1, mc)))
        D[1:mr-1, :] = tmp1 + tmp2 / tmp3

    return D / 4

您可以使用卷积来计算拉普拉斯函数,方法是将数组与适当的:


我测试了这个函数,与del2输出相比,它是不同的。当然,在离散化方面可能会有差异,例如在边界上。你能更具体地描述一下你是如何测试它的以及它是如何不同的吗?我测试了a=[3 4 6;7 8 9;1 3 3];disp(del2(a))。在Python方面,我调用了你提到的函数,结果完全不同,在每个单元格上。啊,我测试了一个更大的矩阵,是的,差异在边界上。我怎么能让边界和del2一样呢?奇怪的是,在移植del2之后,我发现问题出现在其他地方,解决了这些问题,结果证明laplace()调用在我的应用程序中也起作用。在内部,操作符都是一样的(Matlab显然除以4,而Python没有)。在边界上,还可以通过向
laplace()
提供
mode=“wrap”
使两个Python版本相同。但是仅仅看一下Matlab的结果,我不知道Matlab在边界上做了什么。实际上它在边上做了立方外推:所以如果你用
laplace()尝试最后一个例子
在边界上也无法得到正确的结果。您也可以尝试使用一个实现。我想第一个if子句应该是
mc>=3
。而且我不确定当
dx!=1或dy!=1