Отже, я досить критична людина, і, якщо я буду інвестувати в бібліотеку, я краще буду знати, в що я потрапляю. Я вважаю, що краще уважно ставитись до критики, а також до лестощів при вивченні; те, що не в цьому, має набагато більше наслідків для майбутнього, ніж те, що правильно. Тому я збираюся трохи зайти за борт тут, щоб надати відповідь, яка допомогла б мені, і я сподіваюся, що допоможе іншим, хто може пройти цей шлях. Майте на увазі, що це ґрунтується на тому, що я мало перевіряю / тестую, що я робив із цими лайками О, і я вкрав деякі позитивні описи у Рід.
Я нагадаю зверху, що я пішов з GMTL, незважаючи на це ідіосинкразії, тому що небезпека Eigen2 була занадто великою недоліком. Але нещодавно я дізнався, що наступний випуск Eigen2 буде містити визначення, які вимкнуть код вирівнювання та зроблять його безпечним. Тож я можу переключитися.
Оновлення : я перейшов на Eigen3. Незважаючи на свої ідіосинкразії, його масштаб та елегантність занадто важко ігнорувати, а оптимізації, які роблять це небезпечним, можна вимкнути за допомогою визначення.
Eigen2 / Eigen3
Переваги: LGPL MPL2, чистий, добре розроблений API, досить простий у використанні. Здається, добре підтримує живучу спільноту. Низькі накладні витрати. Висока продуктивність. Створений для загальної лінійної алгебри, але також доступна хороша геометрична функціональність. Вся вкладка заголовка, не потрібно зв'язувати.
Idiocyncracies / downsides: (Дещо / всього цього можна уникнути за допомогою деяких визначень, які доступні в поточній галузі розвитку Eigen3)
- Небезпечні оптимізації роботи призводять до необхідності ретельного дотримання правил. Недотримання правил спричиняє збої.
- ви просто не можете безпечно передати цінність
- використання типів Eigen як членів вимагає спеціального налаштування алокатора (або ви завершите роботу)
- використовувати з типами контейнерів stl та, можливо, іншими шаблонами, потрібні спеціальні налаштування розподілу (інакше ви завершите роботу)
- певні компілятори потребують особливої обережності для запобігання збоїв у функціональних викликах (вікна GCC)
GMTL
Переваги: LGPL, досить простий API, спеціально розроблений для графічних двигунів. Включає багато примітивних типів, спрямованих на візуалізацію (наприклад, літаки, AABB, кватерніони з багаторазовою інтерполяцією тощо), яких немає в жодному іншому пакеті. Дуже низький об'єм пам'яті, досить швидкий, простий у користуванні. Все на основі заголовка, ніяких посилань не потрібно.
Ідентифікація / мінуси:
- API химерний
- що може бути myVec.x () в іншій lib, доступне лише через myVec [0] (проблема читабельності)
- масив або stl :: вектор точок може змусити вас зробити щось на зразок pointsList [0] [0] для доступу до компонента x першої точки
- в наївній спробі оптимізації видаляється хрест (vec, vec) і замінюється makeCross (vec, vec, vec), коли компілятор так чи інакше усуває непотрібні темпи
- звичайні математичні операції не повертають нормальні типи, якщо ви не відключили деякі функції оптимізації, наприклад:
vec1 - vec2
не повертає нормальний вектор, тому length( vecA - vecB )
не vecC = vecA -
vecB
працює, хоча працює. Ви повинні загортатись так:length( Vec( vecA - vecB ) )
- Операції над векторами забезпечуються зовнішніми функціями, а не членами. Це може вимагати використання роздільної здатності скрізь, оскільки загальні імена символів можуть стикатися
- ви повинні зробити
length( makeCross( vecA, vecB ) )
або
gmtl::length( gmtl::makeCross( vecA, vecB ) )
де інакше ви можете спробувати
vecA.cross( vecB ).length()
- недостатньо підтримується
- як і раніше заявляється як "бета"
- в документації відсутня основна інформація, наприклад, які заголовки потрібні для нормальної функціональності
- Vec.h не містить операцій для Vectors, VecOps.h містить деякі, інші є в Generate.h, наприклад. хрест (vec &, vec &, vec &) у VecOps.h, [make] хрест (vec &, vec &) у Generate.h
- незрілий / нестабільний API; все ще змінюється.
- Наприклад, "cross" перемістився з "VecOps.h" на "Generate.h", а потім назву було змінено на "makeCross". Приклади документації не вдається, оскільки все ще відносяться до старих версій функцій, які вже не існують.
NT2
Не можу сказати, оскільки їх, здається, більше цікавить заголовок фрактальної зображення їх веб-сторінки, ніж вміст. Виглядає більше як академічний проект, ніж серйозний програмний проект.
Останній реліз понад 2 роки тому.
Мабуть, жодної документації англійською мовою, хоча нібито десь є щось французькою.
Не можете знайти сліди спільноти навколо проекту.
LAPACK & BLAS
Переваги: Старі та зрілі.
Недоліки:
- старі як динозаври з дійсно хитрими API