在matlab / octave中交替使用spsolve和spdiag

时间:2016-06-21 06:48:29

标签: python matlab scikit-learn octave

我有一个python代码,我试图转换为Matlab代码。该代码用于波浪的基线校正。

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

但是在octave / matlab中没有名为spsolvespdiag的函数。我可以使用任何替代功能吗?

1 个答案:

答案 0 :(得分:3)

如果您知道spsolve的作用,那么它很容易。让我们关注它,as spidiag seems easier to solve,不是吗?

spsolve“求解稀疏线性系统Ax = b,其中b可以是向量或矩阵。”

这正是MATLABs \mldivide所做的,它解决了一个Ax = b的系统,用于x。令你高兴的是,MATLAB可以处理具有相同功能的稀疏矩阵和密集矩阵,因此改变应该如下:

从:

z = spsolve(Z, w*y)

为:

z= Z\(w*y);