Подтвердить что ты не робот

Какая хорошая библиотека С++ для матричных операций

Мне нужно умножить на матрицы. Я ищу библиотеку, которая может сделать это быстро. Я использую компилятор Visual С++ 2008, и у меня есть ядро ​​i7 860, поэтому, если библиотека оптимизирована для моей конфигурации, она идеальна.

4b9b3361

Ответ 1

FWIW, Eigen 3 использует потоки (OpenMP) для матричных продуктов (в ответ на предыдущий оператор Eigen, не использующий потоки).

Ответ 2

BLAS является фактическим стандартом Fortran для всех основных операций линейной алгебры (по существу, умножения матриц и векторов). Доступны многочисленные реализации. Например:

  • ATLAS является бесплатной и предположительно самооптимизирующейся. Вам нужно скомпилировать его самостоятельно.
  • Goto BLAS поддерживается Kazushige Goto в TACC. Он очень хорош в том, чтобы получить последний бит производительности от современных процессоров. Это только для академического использования.
  • Intel MKL обеспечивает оптимизированные процессоры BLAS для процессоров Intel. Это не бесплатно, даже для академического использования.

Затем вы можете использовать оболочку С++, например boost::ublas.

Если вы программируете на распределенных системах, есть PBLAS и ScaLAPACK, которые позволяют использовать передачу сообщений для распределенных операций линейной алгебры. На многоядерной машине обычно реализация BLAS (по крайней мере, Intel MKL) использует потоки для достаточно больших матриц.

Если вам нужны более продвинутые подпрограммы линейной алгебры (собственные значения, линейные системы, наименьший квадрат,...), то есть другой де-факто стандарт Fortran LAPACK. Насколько мне известно, нет ничего, что могло бы элегантно его интегрировать с С++, кроме вызова простых процедур Fortran. Вам нужно написать некоторые обертки, чтобы скрыть вызовы Fortran и обеспечить реализацию проверки типа звука.

Ответ 3

Посмотрите Eigen. Он должен иметь все, что вам нужно.

Ответ 4

У меня был хороший опыт работы с Boost uBLAS. Это хороший вариант, если вы уже используете Boost.

Ответ 5

Вы можете использовать Научную библиотеку GNU (GSL).

Здесь представлена ​​страница, описывающая операции с матрицами, доступные в библиотеке, включая умножение (gsl_matrix_mul_elements()):

http://www.gnu.org/software/gsl/manual/html_node/Matrix-operations.html

И вот некоторые ссылки, чтобы вы начали использовать GSL с визуальной студией:

http://gladman.plushost.co.uk/oldsite/computing/gnu_scientific_library.php

http://www.quantcode.com/modules/smartfaq/faq.php?faqid=33

Ответ 6

он не может участвовать в гонке с научными библиотеками, но с визуальным С++ он под рукой

#include <windows.h>
#include <gdiplus.h>
#pragma comment (lib,"Gdiplus.lib")
using namespace Gdiplus;

int main()
{
    ULONG_PTR gpToken = 0;
    GdiplusStartup(&gpToken, &GdiplusStartupInput(), NULL);
    //lib inited

    Matrix A;
    A.Translate(10,20);

    Matrix B;
    B.Rotate(35.0);

    A.Multiply(&B);
    if (A.IsInvertible())
        A.Invert();
    if (!A.IsIdentity())
        A.RotateAt(120.0, PointF(10,10));

    //getting values
    REAL elements[6];
    A.GetElements(elements);

    //lib stopped
    GdiplusShutdown(gpToken);
    return 0;
}

поэтому с этим вы можете легко взять препятствие матричного умножения (в Windows)

Матричная документация GdiPlus

Ответ 8

Есть возможность реализовать это самостоятельно, возможно, используя std:: valarray, потому что это может быть распараллелировано с помощью OpenMP: gcc, безусловно, имеет такую ​​версию, вероятно, MSVС++ тоже.

В противном случае следующие трюки: одна из матриц должна быть транспонирована. Тогда у вас есть:

AB [i, j] = Sum (k) A [i, k] B ^ t [j, k]

где вы сканируете непрерывную память. Если у вас есть 8 ядер, вы можете легко разделить набор индексов [i, j] на 8 и дать каждому ядру 1/8 от общей работы. Чтобы сделать это еще быстрее, вы можете использовать команды векторного умножения, большинство компиляторов предоставят для этого специальную функцию. Результат будет не таким быстрым, как настроенная библиотека, но он должен быть в порядке.

Если вы выполняете более длительные вычисления, такие как полиномиальная оценка, оценщик потоков, который также поддерживает потоковую поддержку (gak, два вида потоков), добьется хорошей работы, даже если он не будет выполнять настройку низкого уровня. Если вы действительно хотите быстро сделать что-то, вы должны использовать правильно настроенную библиотеку, такую ​​как Atlas, но тогда вы, вероятно, не будете запускать Windows, если бы серьезно относились к HPC.