2016-06-21 8 views
0

私はMatlabコードに変換しようとしているPythonコードを持っています。このコードは、波のベースライン補正用です。matlab/octaveのspsolveとspdiagの代替

def baseline_als(y, lam, p, niter=20): 
    L = len(y) 
    D = sparse.csc_matrix(np.diff(np.eye(L), 2)) 
    w = np.ones(L) 
    for i in xrange(niter): 
     W = sparse.spdiags(w, 0, L, L) 
     Z = W + lam * D.dot(D.transpose()) 
     z = spsolve(Z, w*y) 
     w = p * (y > z) + (1-p) * (y < z) 
    return z 

私はこのように変換しようとしました。

function [z] = baseline_als(y, lam, p, niter=20) 
    L = len(y) 
    D = sparse.csc_matrix(diff(eye(L), 2)) 
    w = ones(L) 
    for i = 1:niter 
     W = sparse.spdiags(w, 0, L, L) %Not working 
     Z = W + lam * dot(D,transpose(D)) 
     z = spsolve(Z, w*y) % Not working 
     w = p * (y > z) + (1-p) * (y < z) 
    end % End of For loop 
end % End of function 

しかしオクターブ/ MathWorks社のMATLABでspsolvespdiagという名前の関数はありません。私が使用できる代替機能はありますか?

+2

サイドノート:MATLAB/OCTAVEやPythonでは 'spdiag'関数はありません。その 'spidiags'では、MATLAB関数はPythonと全く同じ構文をしています。 –

+2

'D = sparse.csc_matrix(diff(eye(L)、2))'これはMATLABの構文ではなく、セミコロンでほぼすべての行を終了してコマンドライン出力を抑止したい場合もあることに注意してください。また、入力時にデフォルト値を定義することはできません。あなたの関数は、MATLABになるために**たくさんの作業を必要とします –

+0

'sparse.csc_matrix()'の代わりになるものは何ですか? –

答えて

3

非常に簡単もしspsolveが何であるか知っていればです。それに焦点を当てましょう、as spidiag seems easier to solve、そうですか?

spsolve "疎行列系Ax = bを解く。ここでbはベクトルまたは行列でよい。"

これは、MATLAB \またはmldivideとまったく同じですが、xのAx = bのシステムを解きます。幸いにも、あなたのために、MATLABは、同じ機能を粗密の両方の行列を扱うことができますので、変更は同じくらい簡単なことshoudl:から

z = spsolve(Z, w*y) 

へ:

z= Z\(w*y);