Я работаю над проектом, использующим CHOLMOD в C ++ для обновления факторизации Холецкого. Единственная ссылка, которую я могу найти, — это руководство пользователя. А также cholmod_updown_solve()
кажется, правильная функция для меня. Но нет примера для этой функции, и я не могу получить правильный результат.
Ниже приведена основная часть моего кода. Согласно руководству пользователя, единственное, что нужно заметить, это сортировка матрицы обновления. C
заблаговременно. Но это не работает. Может кто-нибудь сказать мне, если есть какой-то важный шаг, который я пропустил?
Кроме того, я запутался, потому что руководство пользователя говорит, что решение phi
будет дано «в перестановочном порядке, а не в исходном порядке». Как я мог восстановить порядок, не зная матрицы перестановок? (L->Perm
не работает.)
// The original system is At*A*phi = At*b
// Updates: C*Ct is added to At*A (Here C is a sparse column vector)
size_t n = m_pMesh->numVertices();
double w = 1e3;
cholmod_sparse *C;
cholmod_triplet *C_coefficients;
cholmod_dense *Delta_Atb;
cholmod_common common;
cholmod_common *cm = &common;
cholmod_start(cm);
C_coefficients = cholmod_allocate_triplet(n, 1, 2, 0, CHOLMOD_REAL, cm);
Delta_Atb = cholmod_zeros(n, 1, CHOLMOD_REAL, cm);
// updates: two more constraints
CViewerVertex *pNew = stroke_ends.start;
CViewerVertex *qNew = stroke_ends.end;
cholmodEntry(C_coefficients, pNew->sid(), pNew->sid(), w, cm);
cholmodEntry(C_coefficients, qNew->sid(), qNew->sid(), w, cm);
// change to At*b is Delta_Atb
((double*)Delta_Atb->x)[pNew->sid()] = w * w;
C = cholmod_triplet_to_sparse(C_coefficients, C_coefficients->nnz, cm);
cholmod_sort(C, cm);
// phi is the given solution to the original system At*A*phi = At*b
// L is the Cholesky factor to modify
// Both phi and L should be overwritten here
cholmod_updown_solve(1, C, L, phi, Delta_Atb, cm);
cholmod_free_sparse(&C, cm);
cholmod_free_triplet(&C_coefficients, cm);
cholmod_free_dense(&Delta_Atb, cm);
cholmod_finish(cm);
Задача ещё не решена.
Других решений пока нет …