Вопрос

Я хотел бы решить систему линейных уравнений:

 Ax = b

А n x m Матрица (не квадрат), B и X n x 1 векторы. Где A и B известны, n из порядка 50-100, а M составляет около 2 (другими словами, A может быть максимальным [100x2]).

Я знаю решение x: $x = \inv(A^T A) A^T b$

Я нашел несколько способов решить это: ublas (Boost), Lapack, собственное и т. Д. Но я не знаю, насколько быстро время вычисления процессора «X» с использованием этих пакетов. Я также не знаю, численно ли это быстро зачем решить «x»

Что для моего важно, так это то, что время вычисления процессора было бы коротким и хорошей документацией, так как я новичок.

После решения нормального уравнения Ax = b Я хотел бы улучшить свое приближение с помощью регрессивного и может быть позже Применение фильтра Калмана.

У меня вопрос, какая библиотека C ++ является Robuster и быстрее для потребностей, которые я описываю выше?

Это было полезно?

Решение

Это наименьшее решение для квадратов, потому что у вас больше неизвестных, чем уравнений. Если M действительно равно 2, это говорит мне, что для вас будет достаточно простого наименьшего квадрата. Формулы могут быть записаны в закрытой форме. Вам не нужна библиотека.

Если M находится в однозначных цифрах, я все равно скажу, что вы можете легко решить это, используя (транспонируйте)*a*x = a (transpose)*b. Простого разложения LU для решения для коэффициентов было бы достаточным. Это должно быть гораздо более простой проблемой, чем вы делаете это.

Другие советы

UBLAS не оптимизирован, если вы не используете его с оптимизированными привязками BLAS.

Следующее оптимизировано для многопоточного и SIMD:

  1. Intel Mkl. Библиотека Fortran с интерфейсом C. Не бесплатно, но очень хорошо.
  2. Собственное. Истинная библиотека C ++. Бесплатный и открытый исходный код. Легко в использовании и хорошо.
  3. Атлас. FORTRAN и C. БЕСПЛАТНЫЙ И ОТКРЫТАЯ ИСТОЧНИКА. Не для Windows, но в остальном хорошо.

Кстати, я не знаю точно, что вы делаете, но, как правило, нормальные уравнения не являются правильным способом для линейной регрессии. Если ваша матрица не подготовлена, QR или SVD должны быть предпочтительны.

Если Liscencing не является проблемой, вы можете попробовать научную библиотеку GNU

http://www.gnu.org/software/gsl/

Он поставляется с библиотекой BLAS, которую вы можете поменять на оптимизированную библиотеку, если вам нужно позже (например, библиотека Intel, Atlas или ACML (AMD Chip).

Если у вас есть доступ к Matlab, я бы порекомендовал использовать его библиотеки C.

Если вам действительно нужно специализироваться, вы можете приблизительно инверсию матрицы (до произвольной точности), используя метод накиля. Он использует только операции порядка (n^2) (а не порядок n^3 обычной инверсии матрицы - разложение LU и т. Д.).

Его описано в тезисе Гиббса, связанного здесь (вокруг стр. 27):

http://www.inerence.phy.cam.ac.uk/mng10/gp/theesis.ps.gz

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top