Что такое хорошая библиотека C ++ для матричных операций - PullRequest
11 голосов
/ 30 декабря 2010

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

Ответы [ 8 ]

7 голосов
/ 28 апреля 2011

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

6 голосов
/ 30 декабря 2010

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

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

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

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

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

5 голосов
/ 30 декабря 2010

Посмотрите на Собственный .В нем должно быть все, что вам нужно.

3 голосов
/ 30 декабря 2010

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

1 голос
/ 30 декабря 2010

он не может соревноваться с научными библиотеками, но с Visual C ++ он под рукой

#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

1 голос
/ 30 декабря 2010

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

Вот страница с описанием матричных операций, доступных в библиотеке, включая умножение (gsl_matrix_mul_elements ()):

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

А вот несколько ссылок, которые помогут вам начать использовать GSL с visual studio:

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

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

0 голосов
/ 24 марта 2014

для более поздней версии Visual Studio вы можете использовать ScaLapack + MKL. Пример кода предоставляется здесь , с руководством по его запуску.

http://code.msdn.microsoft.com/Using-ScaLAPACK-on-Windows-d16a5e76#content

0 голосов
/ 30 декабря 2010

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

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

AB [i, j] = сумма (k) A [i, k] B ^ t [j, k]

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...