Лучшая матричная библиотека C ++ для разреженных унитарных матриц

StackOverflow https://stackoverflow.com/questions/2222549

Вопрос

Я ищу хорошую (в лучшем случае активно поддерживаемую) матричную библиотеку 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.

Существует несколько библиотек шаблонов, которые поддерживают разреженные матрицы, поэтому действительно трудно придумать лучшее обоснование, если вы не более конкретны в своих потребностях.

Вы также должны попробовать МЛТ и ХАСЕМ Библиотека Matrix C ++.Последнее очень хорошо задокументировано.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top