Лучшая матричная библиотека C ++ для разреженных унитарных матриц
-
19-09-2019 - |
Вопрос
Я ищу хорошую (в лучшем случае активно поддерживаемую) матричную библиотеку C ++.Таким образом, он должен быть шаблонным, потому что я хочу использовать комплекс рациональных чисел в качестве числового типа.Матрицы, с которыми я имею дело, в основном разреженные и унитарные.
Не могли бы вы, пожалуйста, предложить библиотеки, а также дать небольшое объяснение, зачем их использовать, потому что я знаю, как их найти, но я действительно не могу решить, что мне подходит, потому что мне не хватает опыта работы с ними.
Редактировать:
Основными операциями, с которыми я имею дело, являются матричное умножение, скалярное умножение с вектором и продукт kronecker.Размер матриц экспоненциальный, и я хочу, по крайней мере, иметь возможность работать с матрицами размером до 1024x1024 записей.
Решение
Многие люди, занимающиеся "серьезными" матричными делами, полагаются на БЛАС, добавляя ЛАПАК / АТЛАС (нормальные матрицы) или UMFPACK ( УМФПАК ) (разреженные матрицы) для более продвинутой математики.Причина в том, что этот код хорошо протестирован, стабилен, надежен и довольно быстр.Кроме того, вы можете купить их непосредственно у поставщика (например Intel MKL) настроены под вашу архитектуру, но также получают их бесплатно. уБЛАС упомянутый в Ответ Мануэля вероятно, это стандартная реализация C ++ BLAS.И если вам понадобится что-то вроде LAPACK позже, есть привязки чтобы сделать это.
Однако ни одна из этих стандартных библиотек (BLAS / LAPACK / ATLAS или uBLAS + bindings + LAPACK / ATLAS) не соответствует вашим требованиям к шаблонности и простоте использования (если только uBLAS - это все, что вам когда-либо понадобится).На самом деле, я должен признать, что я склонен вызывать интерфейс C / Fortran напрямую, когда я использую реализацию BLAS / LAPACK, поскольку я часто не вижу большого дополнительного преимущества в комбинации uBLAS + привязки.
Если мне нужна простая в использовании матричная библиотека C ++ общего назначения, я обычно использую Eigen (Раньше я использовал Новый мат в прошлом).Преимущества:
- довольно быстрый на архитектуре Intel, вероятно, самый быстрый для небольших матриц
- приятный интерфейс
- почти все, что вы ожидаете от библиотеки matrix
- вы можете легко добавить новые типы
Недостатки (IMO):
- однопроцессорный [Редактировать: частично зафиксирован в Eigen 3.0]
- медленнее для больших матриц и некоторой продвинутой математики, чем ATLAS или Intel MKL (напримерРазложение LU) [Редактировать: также улучшено в Eigen 3.0]
- только экспериментальная поддержка разреженных матриц [Редактировать: улучшено в следующей версии 3.1].
Редактировать: Предстоящий выпуск Eigen 3.1 позволяет некоторым функциям использовать Intel MKL (или любую другую реализацию BLAS / LAPACK).
Другие советы
Увеличьте уБЛАС, потому что он прошел фильтр Boost.
Существует несколько библиотек шаблонов, которые поддерживают разреженные матрицы, поэтому действительно трудно придумать лучшее обоснование, если вы не более конкретны в своих потребностях.