пʼятницю, 20 липня 2012 р.

Робота з матрицями в С++ -- бібліотека eigen

(c) Eigen FAQ
Багато років я шукав зручну і швидку бібліотеку лінійної алгебри для використання з 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.

Ну і ліцензія хороша -- LGPL3+.