Решения нормальной системы уравнений в C++
Я хотел бы решить систему линейных уравнений:
Ax = b
A - это 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, Eigen и т. д. но я не знаю, как быстро время вычисления процессора " x " с помощью этот пакет. Я также не знаю, если это численно быстро, зачем решать "x"
что для меня важно, так это то, что время вычисления процессора будет как можно короче и хорошая документация, так как я новичок.
после решения нормального уравнения Ax = b
Я хотел бы улучшить свое приближение, используя регрессивный и может, позже применение фильтра Калмана.
мой вопрос в том, какие библиотеки C++ является robuster и быстрее для нужд я описываю выше?
5 ответов
Это метод наименьших квадратов, потому что у вас больше неизвестных, чем уравнений. Если m действительно равно 2, это говорит мне, что для вас будет достаточно простых линейных наименьших квадратов. Формулы могут быть выписаны в закрытом виде. Тебе не нужна библиотека.
Если m в одинарных цифрах, я бы все равно сказал, что вы можете легко решить это, используя A(transpose)*A*X = A(transpose)*b. Простое разложение LU для решения коэффициентов было бы достаточным. Это должно быть гораздо более простая проблема, чем вы ее себе представляете.
uBlas не оптимизирован, если вы не используете его с оптимизированными привязками BLAS.
следующие оптимизированы для многопоточности и SIMD:
- Intel MKL. библиотека FORTRAN с интерфейсом C. Не бесплатно, но очень хорошо.
- Eigen. истинная библиотека C++. Бесплатный и с открытым исходным кодом. Простота в использовании и хорошо.
- Атлас. FORTRAN и C. свободный и с открытым исходным кодом. Не Windows дружественный, но в противном случае хороший.
кстати, я не знаю точно, что вы делаете, но, как правило, нормальные уравнения не являются правильным способом линейной регрессии. Если ваша матрица не хорошо подготовлена, QR или SVD должны быть предпочтительными.
Если liscencing не является проблемой, вы можете попробовать научную библиотеку gnu
http://www.gnu.org/software/gsl/
Он поставляется с библиотекой blas, которую вы можете обменять на оптимизированную библиотеку, если вам нужно позже (например, библиотека intel, ATLAS или ACML (чип AMD).
Если вам действительно нужно специализироваться, вы можете приблизить инверсию матрицы (к произвольной точности) с помощью метода Скиллинга. Он использует только операции Порядка (N^2) (а не порядок N^3 обычной инверсии матрицы - разложение LU и т. д.).
его описано в тезисе Гиббса, связанном здесь (около страницы 27):