Лучшая 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.
Есть несколько шаблонных библиотек, которые поддерживают разреженные матрицы, поэтому действительно сложно придумать лучшее обоснование, если вы не будете более конкретны в своих потребностях.