我需要为奇异的正半定矩阵C建模sqrt(x ^ T C x)。在这里,建议使用norm(Q * x),其中Q是从C的Cholesky分解获得的。
How to take the square root of quad_form output in CVXPY?
但是,np。/ scipy.linalg.cholskey不适用于奇异矩阵。
PS,使用SVD或特征值分解对于我的应用程序来说太慢了。
PS2,此帖子Numpy Cholesky decomposition LinAlgError无济于事,因为它没有提供解决方案。同样,问题中的矩阵似乎具有负特征值(而不是奇异)。
答案 0 :(得分:1)
我发现了使用ldl分解的解决方案
L,d,_ = scipy.linalg.ldl(C)
d = np.diag(d).copy()
inds = d >= d.max()*1e-8
d = d[inds]
d = np.sqrt(d)
d.shape = (-1,1)
Q = d * L.T[inds]
loss = cp.norm(cp.matmul(Q, x))
ldl分解需要scipy> = 1.1。