Эффективное сжатое линейное уравнение с большим разреженным блоком в C++
Каждый. У меня мало опыта по решению уравнений линейной алгебры. Но теперь мне нужно решить сжатое линейное уравнение для большого разреженного блока. т.е. Ax=b
,
матрица A
состоит из подблоков, размер которых (nb,nb)
, и размер A
является (N,N)
субблоков. Тогда реальный размер матрицы A
является (nb*N,nb*N)
,
Существует только несколько подблоков. А также A
является доминантой по диагонали.
Я попробовал встроенные в Эйгенера. то есть SimplicialLLT и BiCGSTAB, первое медленно, а второе не может сходиться.
Затем я попробовал сторонние решатели Eigen с Intel MKL, то есть PardisoLLT 、PardisoLDLT и PardisoLU. Они тоже были медленными.
Наконец, я попробовал сторонние решатели Eigen с SuiteSparse, то есть CHOLMOD и SPQR. Первый медленный, в то время как второй дал то же значение ввода, похоже, он не работал.
Я думаю, может быть, это потому, что я использовал решатели неправильно, что я не воспользовался функцией "сжатия блоков" и таким образом вызвал много бесполезных вычислений.
Кто-нибудь может дать мне несколько советов?
1 ответ
Пока размер вашей матрицы не превышает 5000 строк / столбцов, использование разреженного решателя не принесет никаких разумных преимуществ; для таких матриц также подойдет обычный плотный решатель, поскольку он не содержит "накладных расходов", связанных с хранением и работой с разреженными структурами, такими как связанные списки или структуры смежности. С другой стороны, если ваша матрица очень большая (скажем, около миллиона строк / столбцов), будет работать только итеративный решатель. Я предлагаю вам посетить следующую веб-страницу, которая содержит описание проблемы и решение, очень похожее на то, с чем вы работаете (включая решение систем с разреженными матрицами, имеющими блочную структуру, а также обработку изображений): http://members.ozemail.com.au/~comecau/CMA_LS_Sparse.htm