Юля: преобразование фактора CHOLMOD в разреженную матрицу и обратно

У меня есть CHOLMOD факторизация разреженной матрицы H, и я хочу отредактировать разреженное представление верхнего, нижнего и блочного диагональных множителей. Как я могу это сделать? Когда я запускаю ниже, последняя строка не работает.

H = sprand(10,10,0.5)
fac = ldltfact(H; shift=0.0)
fD = fac[:D]
D = Base.SparseArrays.CHOLMOD.Sparse(fD)

И есть ли способ пойти в обратном направлении от разреженной матрицы к CHOLMOD.factor?


person jjjjjj    schedule 29.01.2018    source источник


Ответы (1)


Извлечение соответствующих матриц факторизации ldltfact может быть немного утомительным. В следующем примере показан пример, аналогичный приведенному в вопросе, с окончательным тестом на то, что извлеченные матрицы восстанавливают исходную факторизованную:

srand(1)
pre = sprand(10,10,0.5)
H = pre + pre' + speye(10,10)

fac = ldltfact(H; shift=0.0)
P = sparse(1:size(H,1),fac[:p],ones(size(H,1)))
LD = sparse(fac[:LD]) # this matrix contains both D and L embedded in it

L = copy(LD)
for i=1:size(L,1)
  L[i,i] = 1.0
end

D = sparse(1:size(L,1),1:size(L,1),diag(LD))

PHP = P*H*P'
LDL = L*D*L'

using Base.Test
@test PHP ≈ LDL

Ожидаемый результат (и фактический на Julia v0.6.3):

julia> @test PHP ≈ LDL
Test Passed

Надеюсь это поможет.

person Dan Getz    schedule 29.01.2018
comment
Спасибо, это очень полезно! Есть ли способ извлечь диагональный фактор блока D в разреженной форме из LD? Я потому, что мне нужно выполнить положительно определенную модификацию нулевых и отрицательных собственных значений, и я не хочу изменять всю матрицу, выполняя факторизацию с полной диагональной модификацией. - person jjjjjj; 30.01.2018
comment
Предположим, что я отредактировал разреженное представление LD. Есть ли хороший способ преобразовать его обратно в CHOLMOD.factor? (за редактирование) - person jjjjjj; 30.01.2018
comment
@jjjjjj Не думайте, что легко преобразовать отредактированный LD в CHOLMOD.factor, поскольку функции в основном являются обертками интерфейса библиотеки CHOLMOD. Но с доступной факторизацией линейная алгебра должна работать быстрее без возврата к использованию CHOLMOD. Быстрое solve также определено для треугольных матриц. - person Dan Getz; 30.01.2018