Я пытаюсь написать некоторый код, который, учитывая матрицу разреженных квадратов M, вычисляет ее разреженную холесовскую декомпозицию в форме PMP '= LL' (где 'обозначает транспонирование, P - матрица перестановок, а L - нижняя треугольная), используя пакет CVXOPT
в PYTHON 3.5
.
По документации для CVXOPT
Мне удалось сделать следующее:
import CVXOPT
from CVXOPT import cholmod
# Set the CVXOPT options so that the factorization computed is LL' not LDL'
cholmod.options['supernodal']=2
# Makes an expression describing the factorization to be computed
F=cholmod.symbolic(M)
# Numerically compute the factorization and store the result in F
cholmod.numeric(M, F)
# Solve LX=M to obtain L'
L=cholmod.spsolve(F, M, sys=4)
Я думал, что это выведет матрицу L (или, скорее, L '), что я и хочу получить. Однако, когда я пытаюсь проверить, является ли LL '= M, я нахожу, что моя выходная матрица не L' ...
print(L*cvxopt.spmatrix.trans(L)-M) # Should equal a matrix of zeros, but doesn't
Я действительно сбит с толку и нигде не вижу, как можно распечатать / получить матрицу L из ее символического представления, хранящегося в F. Кто-нибудь знаком с CVXOPT / может понять, что я делаю для этого неправильно? Все, что я хочу, - это матрица L (и если кто-нибудь знает, как, перестановка P также будет полезна!). Любая помощь будет принята с благодарностью.