1

このmatlabコードをpythonに変換しようとしています:

T = length(z);
lambda = 10;
I = speye(T)
D2 = spdiags(ones(T-2,1)*[1 -2 1],[0:2],T-2,T);
z_stat = (I-inv(I + lambda^2*D2'*D2))*z;

現時点で得たもの:

T = len(signal)
lam = 10;
I  = np.identity(T)
D2 = scipy.sparse.spdiags(np.ones((T-2,1),dtype=np.int)*[1,-2,1],(range(0,3)),T-2,T);

現時点では、このエラーが発生します

"scipy.sparse.sp...ge(0,3)),T-2,T)" ValueError: 対角線の数 (298) がオフセットの数と一致しません (3) args tuple: ('対角線の数(298) はオフセット (3) の数と一致しません',)

ドキュメントを見ると、matlab 関数と python 関数はよく似ています。おそらく私が見逃している違いがありますが。私の質問は今です:私は何を間違っていますか?

edit : z は長さ 300 の配列です

4

1 に答える 1

0

フィルター データを spdiags に転置すると、両方のパッケージで同じ次元の回答が得られます。

# numpy/scipy
filt = [1,-2,1]* np.ones((1,T-2),dtype=np.int).T
D2 = scipy.sparse.spdiags(data.T, (range(0,3)),T-2,T)
np.shape(D2)
>>> (298, 300)

% matlab check
D2 = spdiags(ones(T-2,1)*[1 -2 1],[0:2],T-2,T)
size(D2)
ans =
  298   300
于 2013-04-16T08:41:35.530 に答える