У кого-нибудь есть рекомендации по использованию удобной и быстрой матрицы библиотеки C ++?
Что я подразумеваю под юзабилити - это следующее:
- Матричные объекты имеют интуитивно понятный интерфейс (например, я могу использовать строки и столбцы при индексации)
- Я могу сделать что-нибудь с классом матрицы, что я могу сделать с LAPACK и BLAS
- Простой в освоении и использовании API
- Относительно безболезненно для установки в Linux (сейчас я использую Ubuntu 11.04)
Для меня юзабилити сейчас важнее, чем скорость или использование памяти, чтобы избежать преждевременной оптимизации. При написании кода я всегда мог использовать одномерные массивы (или векторы STL) и правильную арифметику индекса или указателя для эмуляции матрицы, но я бы предпочел этого не делать, чтобы избежать ошибок. Я также хотел бы сосредоточить свои умственные усилия на реальной проблеме, которую я пытаюсь решить, и запрограммировать ее в проблемной области, а не использовать часть моего ограниченного внимания, чтобы запомнить все маленькие хитрости программирования, которые я использовал для эмуляции матриц в качестве массивов. и помните команды LAPACK и так далее. Кроме того, чем меньше кода мне нужно написать, и чем он стандартизирован, тем лучше.
Плотный и разреженный еще не имеет значения; некоторые из матриц, с которыми я имею дело, будут редкими, но не все. Однако, если конкретный пакет хорошо обрабатывает плотные или разреженные матрицы, стоит упомянуть.
Шаблонирование также не имеет большого значения для меня, так как я буду работать со стандартными числовыми типами, и мне не нужно будет хранить что-либо кроме двойных, плавающих или целых чисел. Это хорошо, но не обязательно для того, что я хотел бы сделать.
источник
Ответы:
На данный момент я собрал следующее из онлайн-исследований:
Я немного использовал Armadillo и обнаружил, что интерфейс достаточно интуитивно понятен, и было легко найти бинарные пакеты для Ubuntu (и я предполагаю, что другие дистрибутивы Linux). Я не скомпилировал его из источника, но надеюсь, что это не будет слишком сложно. Он соответствует большинству моих критериев проектирования и использует плотную линейную алгебру. Он может вызывать подпрограммы LAPACK или MKL. Как правило, нет необходимости компилировать Armadillo, это библиотека исключительно на основе шаблонов: вы просто включаете заголовок и ссылку на BLAS / LAPACK или MKL и т. Д.
Я слышал хорошие вещи об Эйгене , но не использовал его. Он претендует на скорость , использует шаблоны и поддерживает плотную линейную алгебру. Он не имеет LAPACK или BLAS в качестве зависимости, но, похоже, способен делать все, что может делать LAPACK (плюс некоторые вещи, которые LAPACK не может). Многие проекты используют Eigen, который является перспективным. У него есть бинарный пакет для Ubuntu, но в качестве библиотеки только для заголовков тривиально использовать ее и в других местах.
Matrix Template Library версия 4 также выглядит многообещающей, и использует шаблонизацию. Он поддерживает как плотную, так и разреженную линейную алгебру, и может вызывать UMFPACK как разреженный решатель. Функции несколько неясны на их сайте. У него есть бинарный пакет для Ubuntu, который можно загрузить с их сайта.
PETSc , созданный командой из Аргоннской национальной лаборатории, имеет доступ к разреженным и плотным линейным решателям, поэтому я предполагаю, что он может функционировать как матричная библиотека. Он написан на C, но, как мне кажется, имеет привязки к C ++ (и даже если нет, вызов C из C ++ не проблема). Документация невероятно тщательная. Пакет немного излишним для того, что я хочу сделать сейчас (умножение матриц и индексирование для создания смешанных целочисленных линейных программ), но может быть полезно в качестве матричного формата для меня в будущем или для других людей, у которых другие потребности чем я.
Trilinos , написанный группой из Национальной лаборатории Sandia, предоставляет объектно-ориентированные интерфейсы C ++ для плотных и разреженных матриц через компонент Epetra, а также шаблонные интерфейсы для плотных и разреженных матриц через компонент Tpetra. У этого также есть компоненты, которые обеспечивают линейный решатель и функциональность eigensolver. Документация не выглядит такой же отточенной или заметной, как PETSc; Trilinos выглядит как аналог Sandia PETSc. PETSc может вызвать некоторых из решателей Трилино. Двоичные файлы для Trilinos доступны для Linux.
Blitz - это объектно-ориентированная библиотека C ++, в которой есть двоичные файлы Linux. Похоже, что он не поддерживается активно (2012-06-29: новая версия только что появилась вчера!), Хотя список рассылки активен, поэтому есть сообщество, которое использует его. Похоже, что она не имеет большого значения для числовой линейной алгебры, кроме BLAS, и выглядит как библиотека с плотной матрицей. Он использует шаблоны.
Boost :: uBLAS является объектно-ориентированной библиотекой C ++ и является частью проекта Boost. Он поддерживает шаблонную и плотную числовую линейную алгебру. Я слышал, это не особенно быстро.
Шаблон Численный Инструментарий представляет собой С ++ объектно-ориентированная библиотека , разработанная NIST. Его автор, Roldan Pozo, кажется, время от времени вносит исправления, но, похоже, он больше не находится в стадии активной разработки (последнее обновление было в 2010 году). Он фокусируется на плотной линейной алгебре и предоставляет интерфейсы для некоторых базовых матричных разложений и решатель собственных значений.
Elemental , разработанный Джеком Полсоном, представляет собой программный пакет плотной линейной алгебры с распределенной памятью (параллельный), написанный в стиле, похожем на FLAME . Список возможностей и фона проекта см. В его документации . Сам FLAME имеет связанную библиотеку для плотной линейной алгебры с последовательной и разделяемой памятью, называемую libflame , которая, кажется, написана на объектно-ориентированном языке C. Libflame очень похожа на LAPACK, но с улучшенной нотацией, лежащей в основе алгоритмов для создания быстрой числовой разработки библиотеки линейной алгебры больше науки и меньше черного искусства.
Есть другие библиотеки, которые можно добавить в список; если мы считаем пакеты разреженной линейной алгебры «матричными библиотеками», лучшим из известных мне бесплатных приложений на C является SuiteSparse , который запрограммирован в объектно-ориентированном стиле. Я использовал SuiteSparse и нашел его довольно легко подобрать; это зависит от BLAS и LAPACK для некоторых алгоритмов, которые разлагают разреженные задачи на множество небольших, плотных подзадач линейной алгебры. Тим Дэвис, ведущий автор пакета, невероятно услужливый и отличный универсальный парень.
В Подпрограммах библиотека Харуэлля известна своей редкой линейных рутины алгебры, и являются бесплатными для академических пользователей, хотя вы должны пройти через этот процесс заполнения формы и получение электронной почты для каждого файла , который вы хотите загрузить. Поскольку подпрограммы часто имеют зависимости, использование одного решателя может потребовать загрузки пяти или шести файлов, и процесс может быть несколько утомительным, особенно потому, что утверждение формы не происходит мгновенно.
Существуют и другие разреженные решения для линейной алгебры, но, насколько я могу судить, MUMPS и другие пакеты ориентированы в основном на решение линейных систем, и решение линейных систем является наименьшей из моих проблем на данный момент. (Возможно, позже мне понадобятся эти функции, и они могут быть полезны для других.)
источник
Этот документ был написан в марте 2009 года, чтобы помочь в выборе библиотеки линейной алгебры для научной библиотеки. Он оценивает мобильность, высокоуровневый интерфейс и лицензирование для нескольких библиотек, среди которых Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos и uBlas. Кажется, он особенно любит Фленса и Селдона . (Одним из требований было поддерживать шаблоны C ++ и разреженные матрицы.)
источник
Из всех проектов, перечисленных выше, на самом деле есть только два тяжеловеса, которые чрезвычайно широко используются (и по уважительным причинам): PETSc и Trilinos. Оба профессионально развиты и имеют большую базу разработчиков. Все остальные - довольно небольшие проекты по сравнению с этими двумя, и я бы порекомендовал идти с ними, потому что (i) они будут поддерживаться в течение длительного времени и (ii) они, вероятно, уже будут иметь все функциональные возможности, которые вам когда-либо понадобятся в отношении линейная алгебра (и многое другое).
источник
Если ты хочешь
Тогда я рекомендую вам взглянуть на мою библиотеку FLENS . Я разработал его именно для таких задач. Однако для этого требуется компилятор, соответствующий C ++ 11 (например, gcc 4.7 или clang).
FLENS обеспечивает ту же производительность, что и базовая реализация BLAS. Есть некоторые (довольно старые) тесты, показывающие это
То же самое можно сказать и о FLENS-LAPACK, он просто дает вам ту же производительность, что и LAPACK Netlib, если используется та же реализация BLAS.
Что касается новых ориентиров, позвольте мне перейти к более подробным ...
Некоторое время назад я спросил Клинта Уэйли (автора ATLAS), что он думает о тестах, опубликованных на сайте Eigen. Он только подтвердил мое подозрение, что эти критерии, скорее всего, не являются надежными. В то же время некоторые другие реализованные ориентиры, как предложил Клинт. Подробности можно найти на сайте ATLAS и в списке рассылки Eigen. Тесты не очень хорошо представлены на графиках, но они показывают, что ATLAS всегда примерно на 40% быстрее, чем Eigen. Это противоречит тестам с сайта Eigen, но подтверждает другие тесты (например, от Blaze-lib).
Отметим, что для плотной числовой линейной алгебры матрично-матричные произведения являются наиболее актуальными. Лично мне все равно, быстрее Eigen или ATLAS. Если бы Eigen был быстрее, чем ATLAS, я бы использовал Eigen в качестве BLAS-бэкенда.
Отказ от ответственности: Да, FLENS мой ребенок! Это означает, что я написал около 95% кода, и каждая строка кода того стоила :-)
источник
Я использую GMM ++ в течение некоторого времени, и я доволен этим.
источник
В основном, тот же вопрос возник на SO:
Каковы наиболее широко используемые библиотеки векторной / матричной математики / линейной алгебры в C ++, а также их соотношение цены и выгоды?
(Это добавляет ценность в ответ Джеффа.)
источник
Какой будет наилучшая матричная библиотека для работы с матрицами небольшого размера, которые обычно используются, например, при сборке матриц конечных элементов, для выполнения тензорных операций и так далее.
Я уже использую PETSc для решения больших разреженных линейных систем, возникающих в моем приложении, но в настоящее время я использую свою собственную простую библиотеку для работы с этими матрицами / векторами ... Я подумываю перейти на более быструю библиотеку как упомянутые выше.
Что было бы лучшим выбором для пары с PETSc? Эйген? Armadillo? BOOST :: uBlas? MTL4? Я использую некоторые вещи из BOOST, так что сначала я подумал об использовании BOOST :: uBlas, но там не так много документации, примеров и так далее ...
источник
Armadillo, Boost и другие теперь включены как часть Ceemple, быстрой вычислительной среды C ++ на основе JIT. Доступно (бесплатно) с http://www.ceemple.com .
источник
Удивленный никто не упомянул TooN до сих пор. Счастливо пользуюсь им уже почти 3 года.
Это очень похоже на Eigen, хотя и не так всесторонне. Тем не менее, я думаю, что в некоторых отношениях он имеет более хороший синтаксис
Он также поставляется с классами, которые помогают моделировать общие преобразования, которые часто встречаются в Graphics и Vision, на основе групп Ли (специальных евклидовых / ортогональных в 2 и 3 измерениях и т. Д.) И связанных алгебр Ли.
источник
Библиотека HASEM Matrix C ++ - это то, что вам действительно нужно http://sourceforge.net/projects/hasem/
источник