Czy ktoś ma rekomendacje dotyczące użytecznej, szybkiej biblioteki macierzy C ++?
Mam na myśli to, co użyteczne:
- Obiekty macierzy mają intuicyjny interfejs (np .: mogę używać wierszy i kolumn podczas indeksowania)
- Mogę zrobić wszystko z klasą macierzy, co mogę zrobić z LAPACK i BLAS
- Łatwy w nauce i obsłudze API
- Stosunkowo bezbolesny w instalacji w Linuksie (teraz używam Ubuntu 11.04)
Dla mnie użyteczność jest teraz ważniejsza niż szybkość lub zużycie pamięci, aby uniknąć przedwczesnej optymalizacji. Pisząc kod, zawsze mogłem używać tablic 1-D (lub wektorów STL) i właściwej arytmetyki indeksu lub wskaźnika do emulacji macierzy, ale wolałbym tego nie robić, aby uniknąć błędów. Chciałbym również skoncentrować mój wysiłek umysłowy na rzeczywistym problemie, który próbuję rozwiązać i zaprogramować w domenie problemowej, zamiast wykorzystywać część mojej skończonej uwagi do zapamiętywania wszystkich małych sztuczek programistycznych, których użyłem do emulacji macierzy jako tablic i zapamiętaj polecenia LAPACK, i tak dalej. Dodatkowo, im mniej kodu muszę napisać, a im bardziej znormalizowany, tym lepiej.
Gęsta kontra rzadka jeszcze nie ma znaczenia; niektóre macierze, z którymi mam do czynienia, będą rzadkie, ale nie wszystkie. Jednak jeśli dany pakiet dobrze radzi sobie z gęstymi lub rzadkimi matrycami, warto o tym wspomnieć.
Tworzenie szablonów również nie ma dla mnie większego znaczenia, ponieważ będę pracować ze standardowymi typami liczbowymi i nie będę musiał przechowywać niczego poza podwójnymi, zmiennoprzecinkowymi lub liczbami całkowitymi. To miłe, ale nie konieczne do tego, co chciałbym zrobić.
źródło
Odpowiedzi:
Do tej pory zebrałem następujące informacje z badań online:
Użyłem trochę Armadillo i uznałem, że interfejs jest wystarczająco intuicyjny i łatwo było znaleźć pakiety binarne dla Ubuntu (i zakładam, że inne dystrybucje Linuksa). Nie skompilowałem go ze źródła, ale mam nadzieję, że nie będzie to zbyt trudne. Spełnia większość moich kryteriów projektowych i używa gęstej algebry liniowej. Może wywoływać procedury LAPACK lub MKL. Zasadniczo nie ma potrzeby kompilowania Armadillo, jest to biblioteka oparta wyłącznie na szablonach: wystarczy dołączyć nagłówek i link do BLAS / LAPACK lub MKL itp.
Słyszałem dobre rzeczy o Eigen , ale go nie użyłem. To twierdzi, że jest szybki , wykorzystuje templating i obsługuje gęstą algebry liniowej. Nie ma LAPACK ani BLAS jako zależności, ale wydaje się, że jest w stanie zrobić wszystko, co LAPACK może zrobić (plus niektóre rzeczy, których LAPACK nie potrafi). Wiele projektów korzysta z Eigen, co jest obiecujące. Ma pakiet binarny dla Ubuntu, ale jako biblioteka zawierająca tylko nagłówki jest trywialna w użyciu również w innych miejscach.
Matrix Template Library wersja 4 również wygląda obiecująco i wykorzystuje templating. Obsługuje zarówno gęstą, jak i rzadką algebrę liniową i może wywoływać UMFPACK jako rzadki solver. Funkcje są nieco niejasne na ich stronie internetowej. Ma pakiet binarny dla Ubuntu, do pobrania z ich strony internetowej.
PETSc , napisany przez zespół z Argonne National Laboratory, ma dostęp do rzadkich i gęstych solverów liniowych, więc przypuszczam, że może on działać jako biblioteka macierzowa. Jest napisany w C, ale myślę, że ma powiązania C ++, a nawet jeśli nie, wywołanie C z C ++ nie stanowi problemu. Dokumentacja jest niezwykle dokładna. Pakiet jest nieco przesadny w stosunku do tego, co chcę teraz zrobić (mnożenie macierzy i indeksowanie w celu skonfigurowania programów liniowych o mieszanych liczbach całkowitych), ale może być przydatny jako format macierzy dla mnie w przyszłości lub dla innych osób o różnych potrzebach niż ja.
Trilinos , napisane przez zespół z Sandia National Laboratory, zapewnia zorientowane obiektowo interfejsy C ++ dla gęstych i rzadkich matryc dzięki komponentowi Epetra, a także szablony interfejsów dla gęstych i rzadkich matryc dzięki komponentowi Tpetra. Zawiera również komponenty zapewniające działanie solvera liniowego i eigensolvera. Dokumentacja nie wydaje się tak dopracowana ani widoczna jak PETSc; Trilinos wydaje się być analogiem Sandii z PETSc. PETSc może wywoływać niektóre solvery Trilinos. Pliki binarne dla Trilinos są dostępne dla systemu Linux.
Blitz jest zorientowaną obiektowo biblioteką C ++ z binariami Linuksa. Wydaje się, że nie jest aktywnie utrzymywany (2012-06-29: wczoraj pojawiła się nowa wersja!), Chociaż lista mailingowa jest aktywna, więc istnieje społeczność, która z niej korzysta. Wydaje się, że niewiele robi na drodze numerycznej algebry liniowej poza BLAS i wygląda jak biblioteka gęstej macierzy. Korzysta z szablonów.
Boost :: uBLAS jest biblioteką obiektową C ++ i częścią projektu Boost. Obsługuje szablony i gęstą numeryczną algebrę liniową. Słyszałem, że to nie jest szczególnie szybkie.
Template Numerical Toolkit jest C ++ obiektowego biblioteka opracowany przez NIST. Jego autor, Roldan Pozo, wydaje się od czasu do czasu dodawać łaty, ale wydaje się, że nie jest już aktywnie rozwijany (ostatnia aktualizacja to 2010). Koncentruje się na gęstej algebrze liniowej i zapewnia interfejsy dla niektórych podstawowych rozkładów macierzy i solvera wartości własnych.
Elemental , opracowany przez Jacka Poulsona, to pakiet oprogramowania z gęstą pamięcią (równoległą) o gęstej algebrze liniowej napisany w stylu podobnym do FLAME . Aby zapoznać się z listą funkcji i tła projektu, zobacz jego dokumentację . Sam FLAME ma powiązaną bibliotekę dla gęstej algebry liniowej pamięci sekwencyjnej i współużytkowanej, zwaną libflame , która wydaje się być napisana w obiektowo zorientowanej C. Libflame wygląda bardzo podobnie do LAPACK, ale z lepszą notacją leżącą u podstaw algorytmów w celu szybkiego opracowania numerycznego biblioteki algebry liniowej to raczej nauka, a mniej czarna sztuka.
Istnieją inne biblioteki, które można dodać do listy; jeśli liczymy rzadkie pakiety algebry liniowej jako „biblioteki macierzy”, najlepszym wolnym, jaki znam w C, jest SuiteSparse , który jest programowany w stylu obiektowym. Korzystałem z SuiteSparse i odkryłem, że dość łatwo go odebrać; zależy od BLAS i LAPACK dla niektórych algorytmów, które rozkładają rzadkie problemy na wiele małych, gęstych podproblemów algebry liniowej. Główny autor pakietu, Tim Davis, jest niezwykle pomocny i jest wszechstronnym facetem.
The Harwell Podprogram Biblioteki słyną z nielicznych procedur algebry liniowej i są bezpłatne dla użytkowników akademickich, choć trzeba przejść przez ten proces wypełniania formularza i odbieranie wiadomości e-mail dla każdego pliku, który chcesz pobrać. Ponieważ podprogramy często mają zależności, użycie jednego solwera może wymagać pobrania pięciu lub sześciu plików, a proces może być nieco żmudny, zwłaszcza, że zatwierdzenie formularza nie jest natychmiastowe.
Istnieją również inne rzadkie solwery algebry liniowej, ale o ile wiem, MUMPS i inne pakiety koncentrują się głównie na rozwiązaniu układów liniowych, a rozwiązywanie układów liniowych jest obecnie najmniejsze z moich obaw. (Może później będę potrzebował tej funkcji i może być przydatny dla innych).
źródło
Ten dokument został napisany w marcu 2009 roku, aby pomóc w wyborze biblioteki algebry liniowej dla biblioteki naukowej. Ocenia przenośność, interfejs wysokiego poziomu i licencje dla kilku bibliotek, w tym Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos i uBlas. Wydaje się, że szczególnie lubi Flensa i Seldona . (Jednym z wymagań było wsparcie szablonów C ++ i rzadkich macierzy).
źródło
Ze wszystkich wymienionych powyżej projektów są tak naprawdę tylko dwa bardzo ciężkie, które są niezwykle szeroko stosowane (i nie bez powodu): PETSc i Trilinos. Oba są profesjonalnie opracowane i mają dużą bazę programistów. Wszystkie pozostałe są raczej małymi projektami w porównaniu do tych dwóch, i zalecałbym pójście z nimi, ponieważ (i) będą one wspierane przez długi czas i (ii) prawdopodobnie będą już miały wszystkie funkcje, których kiedykolwiek będziesz potrzebować algebra liniowa (i wiele więcej).
źródło
Jeśli chcesz
Następnie polecam zajrzeć do mojej biblioteki FLENS . Zaprojektowałem go do takich właśnie zadań. Wymaga to jednak kompilatora zgodnego z C ++ 11 (np. Gcc 4.7 lub clang).
FLENS zapewnia dokładnie taką samą wydajność jak bazowa implementacja BLAS. Pokazuje to kilka (raczej starych) testów porównawczych
To samo można powiedzieć o FLENS-LAPACK, który zapewnia dokładnie taką samą wydajność jak LAPACK firmy Netlib, jeśli używana jest ta sama implementacja BLAS.
Jeśli chodzi o nowe testy porównawcze, pozwól mi bardziej szczegółowo ...
Jakiś czas temu zapytałem Clinta Whaleya (autora ATLAS), co myśli o testach opublikowanych na stronie Eigen. Właśnie potwierdził moje podejrzenie, że te testy porównawcze najprawdopodobniej nie są wiarygodne. W międzyczasie kilka innych zrealizowanych testów porównawczych, jak sugerował Clint. Szczegóły można znaleźć na stronie ATLAS i liście mailingowej Eigen. Testy porównawcze nie są ładnie przedstawione na wykresach, ale pokazują, że ATLAS jest zawsze o około 40% szybszy niż Eigen. Jest to sprzeczne z testami porównawczymi z witryny Eigen, ale potwierdza inne testy porównawcze (np. Te z blaze-lib).
Zauważ, że dla gęstej numerycznej algebry liniowej produkty macierz-macierz są najbardziej odpowiednie. Osobiście nie dbam o to, czy Eigen czy ATLAS jest szybszy. Jeśli Eigen był szybszy niż ATLAS, użyłbym Eigen jako backendu BLAS.
Oświadczenie: Tak, FLENS to moje dziecko! Oznacza to, że kodowałem około 95%, a każda linia kodu była tego warta :-)
źródło
Od jakiegoś czasu używam GMM ++ i jestem z tego zadowolony.
źródło
Zasadniczo to samo pytanie pojawiło się na SO:
Jakie są najczęściej używane biblioteki matematyczne wektor / macierz / algebra liniowa C ++ oraz jakie są ich koszty i korzyści?
(Dodaje to pewnej wartości do odpowiedzi Geoffa.)
źródło
Jaka byłaby najlepsza biblioteka macierzy do radzenia sobie z macierzami o małych rozmiarach, które są powszechnie używane, na przykład podczas składania macierzy elementów skończonych, do wykonywania operacji tensorowych i tak dalej.
Już używam PETSc do rozwiązania dużych rzadkich systemów liniowych powstających w mojej aplikacji, ale obecnie używam własnej prostej biblioteki do radzenia sobie z tymi macierzami / wektorami ... Zastanawiam się nad przejściem do szybszej biblioteki jak te wymienione powyżej.
Jaki byłby najlepszy wybór do połączenia z PETSc? Eigen? Pancernik? BOOST :: uBlas? MTL4? Używam niektórych rzeczy z BOOST, więc najpierw pomyślałem o użyciu BOOST :: uBlas, ale nie ma dużo dokumentacji, przykładów itd. ...
źródło
Armadillo, Boost i inni wchodzą teraz w skład Ceemple, szybkiego technicznego środowiska obliczeniowego opartego na JIT C ++. Dostępny (bezpłatny) na stronie http://www.ceemple.com .
źródło
Zaskoczony, jak dotąd nikt nie wspomniał o TooN . Z radością korzystam z niego od prawie 3 lat.
Jest bardzo podobny do Eigen, choć nie tak kompleksowy. Myślę jednak, że pod pewnymi względami ma ładniejszą składnię.
Zawiera również klasy, które pomagają modelować typowe transformacje, które często występują w Grafice i Wizji, w oparciu o Grupy Liego (Specjalny Euklidesowy / Ortogonalny w 2 i 3 wymiarach itp.) I powiązane Algebry Liego.
źródło
Biblioteka HASEM Matrix C ++ jest tym, czego naprawdę potrzebujesz http://sourceforge.net/projects/hasem/
źródło