2016-06-21 6 views
0

Ich habe einen Python-Code, den ich in Matlab-Code konvertieren will. Der Code dient zur Grundlinienkorrektur für eine Welle.Alternative von spsolve und spdiag in Matlab/Oktave

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 

Ich habe es versucht, wie dies konvertieren.

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 

Allerdings gibt es keine Funktionen genannt spsolve und spdiag in Octave/Matlab. Gibt es eine alternative Funktion, die ich verwenden kann?

+2

side note : Es gibt keine 'spdiag'-Funktionen in MATLAB/OCTAVE oder in Python. Seine 'spidiags', und ja, die MATLAB-Funktion hat genau die gleiche Syntax wie die Python-Funktion. –

+2

Beachten Sie auch, dass 'D = sparse.csc_matrix (diff (Auge (L), 2))' Dies ist nicht MATLAB-Syntax, und Sie möchten möglicherweise alle Zeilen mit einem Semikolon beenden, um die Befehlszeile auszugeben. Außerdem können Sie keine Standardwerte für die Eingaben definieren. Ihre Funktion benötigt ** viel Arbeit ** MATLAB –

+0

Was kann die Alternative von 'sparse.csc_matrix()' sein? –

Antwort

3

Es ist ganz einfach wenn Sie wissen, was spsolve tut. Konzentrieren wir uns darauf, as spidiag seems easier to solve, oder?

spsolve "Lösen Sie das spärliche lineare System Ax = b, wobei b ein Vektor oder eine Matrix sein kann."

Dies ist genau das, was MATLABs \ oder mldivide tut, es löst ein System von Ax = b, für x. Zum Glück für Sie, können MATLAB sowohl mit umgehen spärlich und dichte Matrix mit der gleichen Funktion, so shoudl die Änderung so einfach sein wie:

aus:

z = spsolve(Z, w*y) 

zu:

z= Z\(w*y);