Эффективное сжатое линейное уравнение с большим разреженным блоком в 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

Другие вопросы по тегам