2013-04-16 8 views
2

Я пытаюсь перевести этот MatLab код на Python:Перевести код MatLab для питона (SciPy)

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: number of diagonals (298) does not match the number of offsets (3) args tuple: ('number of diagonals (298) does not match the number of offsets (3)',)

При взгляде на документацию функция matlab и функция python очень похожи. Хотя, вероятно, есть разница, которой я не хватает. Теперь мой вопрос: что я делаю неправильно?

редактировать: г массив длиной 300

+0

Какую версию питона ? –

+0

У меня есть python 2.7 – Ojtwist

ответ

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 
+0

да, но контент выглядит по-другому. – Ojtwist

+0

nvm Я был неправ – Ojtwist

Смежные вопросы