Решение линейной алгебры Буста для y=Ax
У Boost есть один? Где A, y и x - матрица (разреженная и может быть очень большой) и векторы соответственно. Либо у, либо х могут быть неизвестны.
Я не могу найти его здесь: http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm
6 ответов
Линейные решатели, как правило, являются частью библиотеки LAPACK, которая является расширением более высокого уровня библиотеки BLAS. Если вы работаете в Linux, у Intel MKL есть несколько хороших решателей, оптимизированных как для плотных, так и для разреженных матриц. Если вы пользуетесь Windows, у MKL есть бесплатная пробная версия на один месяц... и, честно говоря, я не пробовал ни одного другого. Я знаю, что в пакете Atlas есть бесплатная реализация LAPACK, но не уверен, насколько сложно запустить его на Windows.
В любом случае, ищите библиотеку LAPACK, которая работает в вашей системе.
Да, вы можете решать линейные уравнения с помощью библиотеки Ublas Boost. Вот один короткий способ использования LU-factorize и обратной замены для получения обратного:
using namespace boost::ublas;
Ainv = identity_matrix<float>(A.size1());
permutation_matrix<size_t> pm(A.size1());
lu_factorize(A,pm)
lu_substitute(A, pm, Ainv);
Таким образом, чтобы решить линейную систему Ax= y, вы должны решить уравнение trans (A) Ax= trans (A) y, взяв обратную величину (trans(A)A)^-1, чтобы получить x: x = (trans (А)) ^ - 1AY.
Один из лучших решателей для Ax = b, когда A разреженный, это Тим Дэвис UMFPACK
UMFPACK
вычисляет разреженную LU-декомпозицию A. Это алгоритм, который используется за кулисами в Matlab при вводе x=A\b
(а А разреженный и квадратный). UMFPACK
это свободное программное обеспечение (GPL)
Также обратите внимание, что если y=Ax, и x известен, но y нет, вы вычисляете y, выполняя умножение вектора с разреженной матрицей, а не решая линейную систему.
Читая документацию по Boost, не похоже, что решение WRT X реализовано. Решение по y - это только вопрос матрично-векторного произведения, которое, похоже, реализовано в убласе.
Следует иметь в виду, что blas реализует только "простые" операции, такие как сложение, умножение и т. Д. Векторных и матричных типов. Все, что более продвинуто (линейное решение задач, например, "решить в x y = A x", собственные векторы и со), является частью LAPACK, который построен на основе BLAS. Я не знаю, что дает повышение в этом отношении.
Посмотрите на JAMA / TNT. Я использовал его только для не разреженных матриц (вы, вероятно, хотите факторизации QR или LU, которые имеют решающие вспомогательные методы), но он, очевидно, имеет некоторые возможности для разреженных матриц.
Настройка пакета линейной алгебры Буста сфокусирована на "плотных матрицах". Насколько я знаю, в пакете Boost нет решателя для линейных систем. Как насчет использования исходного кода в "Числовой рецепт в C ( http://www.nr.com/oldverswitcher.html)"?
Заметка. В исходном коде может быть незначительная ошибка индекса (в некоторых кодах индекс массива начинается с 1)