Багато років я шукав зручну і швидку бібліотеку лінійної алгебри для використання з C++ (
*1). Вимоги ніби скромні -- щоб вміла створювати, додавати, віднімати матриці, множити їх на скаляр, множити між собою, шукати обернені та детермінанти. Все. При чому, для зовсім маленьких матриць -- розміром до 8х8, а в основному взагалі 2х2. (
*2) Ну, ще Open Source ліцензія була б бажаною. :-) Але ця вимога не критична.
Відволікаючись поки від теми продуктивності, С++ має всі засоби, щоб зробити роботу з матрицями зручною. Однак більшість авторів матричних бібліотек вдавалися в пояснення, чому писати: add_matrix(A,B) багато крутіше, ніж A+B. Завершилося все тим, що я, на базі простенької бібліотеки
Slate, склепав свою матричну бібліотеку -- Slate2, зручну для моїх потреб, хоча й доволі повільну (
*3). Подивитися на останню версію цього чуда можна
тут (ніяким іншим чином не розповсюджував). Щастя наступило лише кілька років тому -- натрапив на
eigen!
Виникла eigen всередині проекту KDE. Зараз вона надзвичайно зручна, швидка, та вміє доволі багато. Зокрема, використовує шаблонне метапрограмування, щоб обійти деякі проблеми матричних бібліотек в C++ (
*4). Вміє самостійно векторизувати, використовуючи
SIMD-інструкції, такі як
SSE,
AltiVec і
ARM NEON. Eigen3 -- третя версія, векторизує навіть роботу з матрицями комплексних чисел. Працює із фіксованими, динамічними та розрідженими матрицями. В ролі елементів матриць можуть бути числа з плаваючою крапкою, комплексні числа, цілі числа,
користувацькі типи. Що вміє робити над матрицями? Багато, перераховувати довго, див. краще сюди:
1,
2,
3. Надійна -- містить більше
півтисячі власних тестів, проходить стандартні тести BLAS та LAPACK ,
використовується багатьма проектами.
З того часу, як я натрапив на eigen ситуація покращилася -- з'явилися
Armadillo,
MTL4 (її попередня версія, MTL2 -- якраз наглядний приклад згадуваного вище багатослівного підходу), тощо. Як на мене, вони безперечно вартують уваги, але поступаються eigen, хоча фахово не скажу -- багато тестів не писав, багато часу на ознайомлення з ними не витрачав. Щоб відобразити своє, хай не до кінця науково перевірене, ставлення до eigen,
зацитую її розробників:
Some other libraries do satisfy very well certain specialized needs, but none is as versatile as Eigen, has such a nice API, etc.
*** skipped ***
The state of existing matrix libraries before Eigen is that:
some are Free Software
some are fast
some have a decent API
some handle fixed-size matrices, some handle dynamic-size dense matrices, some handle sparse matrices
some provide linear algebra algorithms (LU, QR, ...)
some provide a geometry framework (quaternions, rotations...)
However Eigen is the first library to satisfy all these criteria.