Стабильная версия | 9.850 / 9 февраля 2020 г.; 8 месяцев назад (2020-02-09) |
---|---|
Написано на | C ++ |
Операционная система | Кросс-платформенная |
Доступно на | английском |
Тип | Программная библиотека |
Лицензия | Apache 2.0 (открытый исходный код ) |
Веб-сайт | arma.sourceforge.net |
Armadillo - это линейная алгебра программная библиотека для языка программирования C ++. Она нацелена на обеспечение эффективных и оптимизированных базовых вычислений, в то же время имея простой и легкий в использовании интерфейс. Ее предполагаемыми целевыми пользователями являются ученые и инженеры.
Он поддерживает целые числа, числа с плавающей запятой (одинарная и двойная точность), комплексные числа и подмножество тригонометрических и статистика. Поддерживаются плотные и разреженные матрицы. Различные разложения матриц предоставляются посредством дополнительной интеграции с Linear Algebra PACKage (LAPACK ), Автоматически настраиваемое ПО линейной алгебры (ATLAS) и ARPACK. Высокопроизводительный BLAS / LAPAC Также можно использовать замещающие библиотеки K, такие как OpenBLAS и Intel MKL.
В библиотеке используется подход отложенной оценки (во время времени компиляции ) для объединения нескольких операций в одну и уменьшения (или устранения) необходимости во временных библиотеках. Где применимо, порядок операций оптимизирован. Отсроченная оценка и оптимизация достигаются с помощью метапрограммирования шаблона.
Armadillo связан с библиотекой Boost Basic Linear Algebra Subprograms (uBLAS), которая также использует метапрограммирование шаблона. Однако Armadillo основан на библиотеках ATLAS и LAPACK, тем самым обеспечивая машинно-зависимые оптимизации и функции, отсутствующие в uBLAS.
Это программное обеспечение с открытым исходным кодом, распространяемое по разрешающей лицензии Apache, что делает его применимым для разработки как с открытым исходным кодом и проприетарное программное обеспечение. Проект поддерживается исследовательским центром NICTA в Австралии.
Вот тривиальный пример, демонстрирующий функциональность Armadillo:
// Компиляция с: // $ g ++ -std = c ++ 11 main.cpp -o имя_файла -O2 -larmadillo #include#include #include int main () {// ^ // Положение частицы // | arma :: vec Pos = {{0}, // | (0,1) {1}}; // + --- x ->// Матрица вращения double phi = -3.1416 / 2; arma :: mat RotM = {{+ cos (phi), -sin (phi)}, {+ sin (phi), + cos (phi)}}; Pos.print ("Текущее положение частицы:"); std :: cout << "Rotating the point " << phi*180/3.1416 << " deg" << std::endl; Pos = RotM*Pos; Pos.print("New position of the particle:"); // ^ // x (1,0) // | // +------>return 0; }
Вот еще один тривиальный пример на C ++ 98:
#include#include int main () {arma :: vec b; b << 2.0 << 5.0 << 2.0; // arma::endr represents the end of a row in a matrix arma::mat A; A << 1.0 << 2.0 << arma::endr << 2.0 << 3.0 << arma::endr << 1.0 << 3.0 << arma::endr; std::cout << "Least squares solution:\n"; std::cout << arma::solve(A,b) << '\n'; return 0; }