Szukam biblioteki tensorowej C ++, która obsługuje kod zależny od wymiarów. W szczególności muszę wykonywać operacje wzdłuż każdego wymiaru (do 3), np. Obliczać sumę ważoną. Wymiary są parametrem szablonu (a zatem stałą czasową kompilacji). Innym ograniczeniem jest to, że biblioteka powinna być stosunkowo lekka, więc raczej w stylu Eigen / Boost niż Trilinos / PETSc.
Jakieś sugestie?
Uwaga: rzuciłem okiem na Eigen i sądzę, że prawie pasuje dokładnie do profilu, jeśli nie byłby ograniczony do tensorów 2D. Jeśli się mylę, popraw mnie.
Myślę, że ta nowa
taco
biblioteka też jest naprawdę dobra.Tensor Algebra Compiler (taco) to biblioteka C ++, która oblicza wyrażenia algebry tensorowej na tensorach rzadkich i gęstych. Wykorzystuje nowatorskie techniki kompilatora, aby zwiększyć wydajność dzięki ręcznie zoptymalizowanym jądrom w szeroko używanych bibliotekach zarówno dla rzadkiej algebry tensorowej, jak i rzadkiej algebry liniowej.
Możesz używać taco jako biblioteki C ++, która pozwala ładować tensory, czytać tensory z plików i obliczać wyrażenia tensorowe. Możesz także użyć taco jako generatora kodu, który generuje funkcje C, które obliczają wyrażenia tensorowe.
Dyskusja: https://www.youtube.com/watch?v=Kffbzf9etLE Papier: http://tensor-compiler.org/kjolstad-oopsla17-tensor-compiler.pdf
źródło
XTensor to nowoczesne podejście, które zyskuje coraz większą popularność. https://github.com/QuantStack/xtensor
źródło
Biblioteka deal.II ( http://www.dealii.org ), choć napisana do znacznie większych celów, zawiera również pod bibliotekę klas tensorów, które prawdopodobnie wykonują wiele z tego, co chcesz zrobić. W szczególności wykorzystuje szablony dla wymiaru.
(Uwaga: Jestem jednym z głównych autorów tej biblioteki).
źródło
Biblioteka Boost.Numeric.uBlas ostatnio dodała rozszerzenie tensora, które jest dostarczane z Boost w wersji 1.70. Proszę spojrzeć na https://github.com/boostorg/ublas . Zapewnia standardowe operacje macierzowe i tensorowe z kolejnością zmiennych wykonawczych (liczba wymiarów), wymiarami formatów pamięci pierwszego i ostatniego rzędu (główna i rzędowa). Można również łatwo użyć konwencji sumowania Einsteina, aby wyrazić arbtrarne multiplikacje tensora. Boost.Numeric.uBlas jest tylko nagłówkiem i można go łatwo zintegrować z istniejącymi projektami.
źródło
Sam go nie używałem, ale libtensor wydaje się spełniać twoje wymagania.
źródło
jest to wielowymiarowa tablica biblioteki C ++ https://github.com/ContinuumIO/libdynd
źródło
LTensor ( https://code.google.com/p/ltensor/ ) to BARDZO łatwa w użyciu biblioteka szablonów C ++ dla tensorów do rangi 4 (na podstawie notacji indical), szybka i lekka. Nie musisz nic kompilować, wystarczy dołączyć główny plik nagłówka. Użyłem go w kilku projektach i działałem dobrze.
Ma pewne wbudowane funkcje dla tensorów rangi 2, takie jak solwery liniowe, svd, LU i dekompozycje Cholesky'ego itp. Nie korzystałem z żadnej z nich (używam do tego innych bibliotek).
źródło
Istnieje również ITensor (wymaga C ++ 17).
źródło