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

Я ищу хорошую (в лучшем случае активно поддерживаемую) матричную библиотеку C++. Тем самым он должен быть шаблонным, потому что я хочу использовать комплекс рациональных чисел в качестве числового типа. Матрицы, с которыми я имею дело, в основном редкие и унитарные.

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

РЕДАКТИРОВАТЬ:

Основные операции, с которыми я имею дело, - это умножение матриц, скалярное умножение на вектор и произведение Кронекера. Размер матриц экспоненциальный, и я хочу хотя бы иметь возможность работать с матрицами размером до 1024х1024.

3 ответа

Решение

Многие люди, занимающиеся "серьезными" матричными делами, полагаются на BLAS, добавляя LAPACK / ATLAS (нормальные матрицы) или UMFPACK (разреженные матрицы) для более сложной математики. Причина в том, что этот код хорошо протестирован, стабилен, надежен и довольно быстр. Кроме того, вы можете купить их непосредственно у поставщика (например, Intel MKL), настроенного на вашу архитектуру, но также получить их бесплатно. UBLAS, упомянутый в ответе Мануэля, вероятно, является стандартной реализацией C++ BLAS. И если позже вам понадобится что-то вроде LAPACK, для этого есть привязки.

Однако ни одна из этих стандартных библиотек (BLAS / LAPACK / ATLAS или uBLAS + bindings + LAPACK / ATLAS) не помечает ваш ящик как шаблонный и простой в использовании (если только uBLAS - это все, что вам когда-либо понадобится). На самом деле, я должен признать, что я склонен вызывать интерфейс C / Fortran напрямую, когда я использую реализацию BLAS / LAPACK, так как я часто не вижу большого дополнительного преимущества в комбинации привязок uBLAS +.

Если мне нужна простая в использовании универсальная матричная библиотека C++, я обычно использую Eigen (раньше я использовал NewMat). Преимущества:

  • довольно быстрый на архитектуре Intel, вероятно, самый быстрый для небольших матриц
  • хороший интерфейс
  • почти все, что вы ожидаете от матричной библиотеки
  • Вы можете легко добавлять новые типы

Недостатки (ИМО):

  • однопроцессорный [править: частично исправлено в Eigen 3.0]
  • медленнее для больших матриц и некоторой продвинутой математики, чем ATLAS или Intel MKL (например, разложение LU) [Редактировать: также улучшено в Eigen 3.0]
  • только экспериментальная поддержка разреженных матриц [Правка: улучшена в следующей версии 3.1].

Изменить: Предстоящий Eigen 3.1 позволяет некоторым функциям использовать Intel MKL (или любую другую реализацию BLAS / LAPACK).

Boost uBLAS, потому что он прошел фильтр Boost.

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

Вам также следует попробовать MLT и HASEM Matrix C++ Library. Последнее очень хорошо задокументировано.

Другие вопросы по тегам