Решение линейной алгебры Буста для y = Ax - PullRequest
9 голосов
/ 04 августа 2009

Есть ли у Boost один? Где A, y и x - матрица (разреженная и может быть очень большой) и векторы соответственно. Либо у, либо х могут быть неизвестны.

Я не могу найти это здесь: http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm

Ответы [ 6 ]

18 голосов
/ 19 августа 2009

Да, вы можете решать линейные уравнения с помощью библиотеки Ublas Boost. Вот один короткий способ использования LU-разложения и обратной замены для получения обратного:

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 = (транс (А)) ^ -. 1AY

5 голосов
/ 04 августа 2009

Линейные решатели, как правило, являются частью библиотеки LAPACK, которая является расширением более высокого уровня библиотеки BLAS. Если вы работаете в Linux, Intel MKL имеет несколько хороших решателей, оптимизированных как для плотных, так и для разреженных матриц. Если вы пользуетесь Windows, у MKL есть бесплатная пробная версия на один месяц ... и, честно говоря, я не пробовал ни одного другого. Я знаю, что в пакете Atlas есть бесплатная реализация LAPACK, но не уверен, насколько сложно запустить его на Windows.

В любом случае, ищите библиотеку LAPACK, которая работает в вашей системе.

4 голосов
/ 08 августа 2009

Один из лучших решателей для Ax = b, когда A разреженный, - это UMFPACK

Тима Дэвиса *.

UMFPACK вычисляет разреженное разложение LU A. Это алгоритм, который используется за кулисами в Matlab, когда вы печатаете x=A\b (а A редко и квадрат). UMFPACK - свободное программное обеспечение (GPL)

Также обратите внимание, что если y = Ax, а x известно, но y нет, вы вычисляете y, выполняя умножение вектора с разреженной матрицей, а не путем решения линейной системы.

3 голосов
/ 04 августа 2009

Взгляните на JAMA / TNT . Я использовал его только для не разреженных матриц (вы, вероятно, хотите факторизации QR или LU, которые имеют решающие вспомогательные методы), но он, очевидно, имеет некоторые возможности для разреженных матриц.

3 голосов
/ 04 августа 2009

Настройка пакета линейной алгебры Буста сфокусирована на «плотных матрицах». Насколько я знаю, в пакете Boost нет решателя для линейных систем. Как насчет использования исходного кода в «Числовой рецепт в C (http://www.nr.com/oldverswitcher.html)"?

»

Примечание. В исходном коде может быть незначительная ошибка индекса (в некоторых кодах индекс массива начинается с 1)

3 голосов
/ 04 августа 2009

Читая документацию по надстройке, не похоже, что решение w.r.t x реализовано. Решение в y - только вопрос матрично-векторного произведения, которое, кажется, реализовано в убласе.

Следует иметь в виду, что blas реализует только «простые» операции, такие как сложение, умножение и т. Д. Векторных и матричных типов. Все, что более продвинуто (линейное решение задач, например, «решить в x y = A x», собственные векторы и со), является частью LAPACK, который построен поверх BLAS. Я не знаю, что дает повышение в этом отношении.

...