2011-01-14 14 views
4

Matlab(Octave)離散ラプラシアン演算子(関数)del2()のPython/Numpy相当物が必要です。私はいくつかのPythonソリューションを試しましたが、どれもdel2の出力と一致していないようです。オクターブ上で私は、これは私がまたPythonの離散ラプラシアン(del2相当)

を試してみました

[[ 23 19 15 11] 
[ 3 -1 0 -4] 
[ 4 0 0 -4] 
[-13 -17 -16 -20]] 

結果を与える

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') 

をしようとしたのPythonで

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 

結果を与える

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

持っています結果

[[ 6 6 3 3] 
[ 0 -1 0 -1] 
[ 1 0 0 -1] 
[-3 -4 -4 -5]] 

を与える

scipy.ndimage.filters.laplace(image) 

だから出力のいずれもがお互いに一致するように見えるん。オクターブコードdel2.mは、それがラプラシアン演算子であることを示しています。何か不足していますか?

+0

内部には、オペレータは、Pythonにはないところ、全て同じ(MATLABは、明らかに4分割しています)。境界では、 'mode =" wrap "を' laplace() 'にも渡すことで、2つのPythonバージョンを同じにすることができます。しかし、Matlabの結果を見るだけで、Matlabが境界線上で何をするのか分かりません。 –

+1

実際には、立方体の外挿を行います。 http://www.mathworks.it/it/help/matlab/ref/del2.html 最終的な例を 'laplace()'で試してみると、境界線についても正しい結果を得る方法。 – astrojuanlu

答えて

6

多分あなたはscipy.ndimage.filters.laplace()を探しています。ここでのコードに基づいて

+0

私はこの機能をテストし、del2の出力と比較して、それは異なっています。 – user423805

+0

原因の離散化には、境界などの違いがあります。あなたはそれをどのようにテストしたのか、それがどのように異なっているのでしょうか? –

+0

私はa = [3 4 6; 7 8 9; 1 3 3]; disp(del2(a))。 Python側では、あなたが言及した関数を呼び出しました。結果は各セルで全く異なります。 – user423805

1

http://cns.bu.edu/~tanc/pub/matlab_octave_compliance/datafun/del2.m

私は、Pythonの同等を書き込もうとしました。それはうまくいくようですが、どんなフィードバックも高く評価されます。あなたが適切なstencilで配列を畳み込むことによってラプラシアンを計算するためにコンボリューションを使用することができます

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 
4

from scipy.ndimage import convolve 
stencil= (1.0/(12.0*dL*dL))*np.array(
     [[0,0,-1,0,0], 
     [0,0,16,0,0], 
     [-1,16,-60,16,-1], 
     [0,0,16,0,0], 
     [0,0,-1,0,0]]) 
convolve(e2, stencil, mode='wrap')