Эффективное сжатое линейное уравнение с большим разреженным блоком в C ++ - PullRequest
0 голосов
/ 05 ноября 2018

все. У меня мало опыта по решению уравнений линейной алгебры. Но теперь мне нужно решить сжатое линейное уравнение для большого разреженного блока. то есть Ax=b.

Матрица A состоит из подблоков, размер которых (nb,nb). и размер A составляет (N,N) субблоков. Тогда реальный размер матрицы A равен (nb*N,nb*N).

Существует только несколько подблоков. И A является доминирующим по диагонали.

Я попробовал встроенные щупальцы Eigen. то есть SimplicialLLT и BiCGSTAB, первое медленно, а второе не может сходиться.

Затем я попробовал сторонние решатели Eigen с Intel MKL, то есть PardisoLLT 、 PardisoLDLT и PardisoLU. Они тоже были медленными.

Наконец, я попробовал сторонние решатели Eigen с SuiteSparse, то есть CHOLMOD и SPQR. Первый медленный, в то время как второй дал то же значение ввода, похоже, он не работал.

Думаю, возможно, это из-за того, что я использовал решатели неправильно, что я не воспользовался функцией "сжатия блока" и, таким образом, вызвал много бесполезных вычислений.

Может ли кто-нибудь дать мне несколько советов?

1 Ответ

0 голосов
/ 06 ноября 2018

Пока размер вашей матрицы не превышает 5000 строк / столбцов, использование разреженного решателя не принесет никаких разумных преимуществ; для таких матриц также подойдет обычный плотный решатель, поскольку он не содержит «накладных расходов», связанных с хранением и работой с разреженными структурами, такими как связанные списки или структуры смежности. С другой стороны, если ваша матрица очень большая (скажем, около миллиона строк / столбцов), будет работать только итеративный решатель. Я предлагаю вам посетить следующую веб-страницу, которая содержит описание проблемы и решение, очень похожее на то, с чем вы работаете (включая решение систем с разреженными матрицами, имеющими блочную структуру, а также обработку изображений): http://members.ozemail.com.au/~comecau/CMA_LS_Sparse.htm

...