3

次のようなmatlab配列操作があります:

[M,N]=size(I) ;
J = zeros(2*M,2*N) ;

J(1:2:end,1:2:end) = I ;

J(2:2:end-1,2:2:end-1) = 0.25*I(1:end-1,1:end-1) + 0.25*I(2:end,1:end-1) + 0.25*I(1:end-1,2:end) + 0.25*I(2:end,2:end) ;

J(2:2:end-1,1:2:end) = 0.5*I(1:end-1,:) + 0.5*I(2:end,:) ;
J(1:2:end,2:2:end-1) = 0.5*I(:,1:end-1) + 0.5*I(:,2:end) ;

私はPythonで同じ操作を書き直そうとしていますが、次のことを思いつきました:

J=numpy.zeros((2*M,2*N))

J[::2,::2] = I ;

J[2:-1:2,2:-1:2] = 0.25*I[1::-1,1::-1] + 0.25*I[2::,1::-1] + 0.25*I[1::-1,2::] + 0.25*I[2::,2::] 

J[2:-1:2,1::2] = 0.5*I[1::-1,] + 0.5*I[2::,]

J[::2,2:-1:2] = 0.5*I[:,1::-1] + 0.5*I[:,2::]

ただし、Python コードでは異なる結果が得られます。

誰が何が悪いのか教えてもらえますか?

ありがとう、

4

2 に答える 2

4

これを少しずつ見ていくと、範囲にいくつかのエラーがあることがわかります。Python の配列についていくつか誤解していると思います。

  1. 配列の最初の要素が である matlab とは異なりarray[1]、Python では配列の最初の要素は ですarray[0]
  2. 配列スライスの構文はarray[start:stop:step]であるため、配列の 5 番目の要素から始まり、最後まで 2 つおきの要素を取得するには、 を実行しますarray[4::2]

これを少しずつ見ていくだけで、問題が見つかります。たとえば、2 番目の式の右辺の最初の要素は次のようになります。

0.25*I[0:-1, 0:-1]

your は 1 であるため、ここでは 2 番目のコロンは必要ないことに注意してくださいstep。ステップを変更する場合は、ステップが最後になります。

于 2013-08-02T04:07:38.337 に答える
0

したがって、ここに正しい移植コードがあります:

J[::2,::2] = I ;

J[1:-1:2,2:-1:2] = 0.25*I[0:-1,0:-1] + 0.25*I[1::,0:-1] + 0.25*I[0:-1,1::] + 0.25*I[1::,1::] 

J[1:-1:2,0::2] = 0.5*I[0:-1,] + 0.5*I[1::,]

J[0::2,1:-1:2] = 0.5*I[:,0:-1] + 0.5*I[:,1::]
于 2013-08-07T02:25:31.887 に答える