2011-01-03 5 views
7

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

Ax = b 

А n x m матрицы (не квадратные) а, б и х оба 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»

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

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

Мой вопрос в том, какая библиотека C++ является роботом и быстрее для нужд, описанных выше?

+0

Как вам несколько п х т матрицы с помощью мерного вектора-столбца п? Предположительно x на самом деле m размер. –

+2

Кроме того, есть ли у вас какое-то требование, в котором указано минимальное количество соответствия модным словом? –

+0

@ Eagle Я не думаю, что библиотека Boost uBLAS реализует это, но, пожалуйста, исправьте меня, если я ошибаюсь. Скорее всего, UBLAS предоставляет вам векторы, матрицы и базовые операции (умножение, добавление), но ничего подобного LU, QR, SVD или инверсии матрицы, не говоря уже о реализации OLS. Однако, вероятно, это хорошая библиотека для реализации таких алгоритмов. Опять же, скажите, пожалуйста, если я ошибаюсь, или если вы нашли хорошую версию uBLAS OLS для Boost ... – Arthur

ответ

7

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

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

+0

+1 для наименьших квадратов. –

+1

Он говорит о фильтрах Калмана. Я полагаю, что он устраивает линейную алгебру и, в частности, OLS. Он хочет оптимизированную библиотеку. – watson1180

+1

@duffymo, вы правы, на данный момент решение $ x = \ inv (A^T A) A^T b $ - это то, что я ищу. Фильтр Калмана может быть для будущего развития. Для меня было важно, с какой библиотекой (поддерживающей инверсию, транспонирование, умножение матрицы и т. Д.) Я должен работать (Boost, Eigen, Lapack и т. Д.) – Eagle

1

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

+2

hmm, а скорее жестокое решение тривиальной проблемы! –

+1

AFAIK, библиотека Matlab C (по крайней мере, линейные алгоритмы) используют/используют некоторые из известных общедоступных библиотек (LAPACK). – watson1180

+0

@watson все библиотеки линейной алгебры по существу одинаковы и взяты из Справочника –

7

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

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

  1. Intel MKL. Библиотека FORTRAN с интерфейсом C. Не бесплатный, но очень хороший.
  2. Eigen. Истинная библиотека C++. Свободный и открытый источник. Прост в использовании и хорош.
  3. Атлас. FORTRAN и C. Свободный и открытый источник. Не Windows дружелюбная, но в остальном хорошая.

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

+0

Также ACML для чипов AMD. Я свободен, я верю. – Tom

+1

Я не уверен, что оптимизированные многопоточные версии были бы настолько полезны для матриц, что и миниатюрные. –

+0

будет увеличивать :: числовые: ublas следует рассматривать как «оптимизированные привязки BLAS»? – Eagle

2

Если liscencing не проблема, вы можете попробовать ГНУ научную библиотеку

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

Он поставляется с Блас библиотеки, которые можно обменять на оптимизированной библиотеки, если вам нужно позже (например, в intel, ATLAS или ACML (AMD chip).

+0

Процедуры линейной алгебры GSL не оптимизированы. – watson1180

+0

@watson, так что вам не нужна фантастическая оптимизация для 100x2? –

+1

@watson Он обеспечивает интерфейс к базовой библиотеке BLAS? Вы можете обменять свою библиотеку BLAS на связывание, а не на код, если вам действительно нужно оптимизировать – Tom

-1

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

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

http://www.inference.phy.cam.ac.uk/mng10/GP/thesis.ps.gz

+1

Никогда не используйте инверсию матрицы для решения линейных систем. Решение линейных систем по существу является задачей O (n^2). –

+0

@ Александр Действительно? - Меня бы заинтересовало ваше решение. Разложение LU, например, является порядком N^3 (в соответствии с темой, которую я цитирую, во всяком случае). – Tom

+0

@Alexandre Я не думаю, что большой O очень подходит для небольших проблем вроде этого .... –

Смежные вопросы