Saya mencari perpustakaan tensor C ++ yang mendukung kode dimensi-agnostik. Khususnya, saya perlu melakukan operasi di sepanjang setiap dimensi (hingga 3), misalnya menghitung jumlah tertimbang. Dimensi adalah parameter templat (dan karenanya konstanta waktu kompilasi). Kendala lain adalah bahwa perpustakaan harus relatif ringan, jadi agak Eigen / Boost-style daripada Trilinos / PETSc.
Ada saran?
Catatan: Saya sudah melihat Eigen dan berpikir itu hampir cocok dengan profilnya, jika tidak terbatas pada tensor 2D. Jika saya salah dengan ini, tolong perbaiki saya.
Saya pikir
taco
lib baru ini juga sangat bagus.Tensor Algebra Compiler (taco) adalah pustaka C ++ yang menghitung ekspresi aljabar tensor pada tensor jarang dan padat. Ini menggunakan teknik kompiler baru untuk mendapatkan kinerja yang kompetitif dengan kernel yang dioptimalkan dengan tangan di perpustakaan yang banyak digunakan untuk kedua aljabar tensor jarang dan aljabar linier jarang.
Anda bisa menggunakan taco sebagai pustaka C ++ yang memungkinkan Anda memuat tensor, membaca tensor dari file, dan menghitung ekspresi tensor. Anda juga dapat menggunakan taco sebagai pembuat kode yang menghasilkan fungsi C yang menghitung ekspresi tensor.
Bicara: https://www.youtube.com/watch?v=Kffbzf9etLE Kertas: http://tensor-compiler.org/kjolstad-oopsla17-tensor-compiler.pdf
sumber
XTensor adalah pendekatan modern dan semakin populer. https://github.com/QuantStack/xtensor
sumber
Perpustakaan deal.II ( http://www.dealii.org ), walaupun ditulis untuk tujuan yang jauh lebih besar, juga memiliki sub-perpustakaan kelas tensor yang kemungkinan melakukan banyak hal yang ingin Anda lakukan. Secara khusus, ia menggunakan template untuk dimensi.
(Penafian: Saya adalah salah satu penulis utama perpustakaan ini.)
sumber
Library Boost.Numeric.uBlas baru-baru ini menambahkan ekstensi tensor yang dikirimkan bersama Boost versi 1.70. Silakan lihat di https://github.com/boostorg/ublas . Ini memberikan operasi matriks dan tensor standar dengan urutan variabel runtime (jumlah dimensi), dimensi untuk format penyimpanan urutan pertama dan terakhir (kolom dan baris utama). Anda juga dapat dengan mudah menggunakan konvensi penjumlahan Einstein untuk mengekspresikan perkalian tensor aribtrary. Boost.Numeric.uBlas hanya header dan mudah diintegrasikan ke dalam proyek yang ada.
sumber
Saya belum menggunakannya sendiri tetapi libtensor tampaknya memenuhi persyaratan Anda.
sumber
ini adalah array multidimensi C ++ library https://github.com/ContinuumIO/libdynd
sumber
LTensor ( https://code.google.com/p/ltensor/ ) adalah pustaka template C ++ yang SANGAT mudah digunakan untuk tensor hingga peringkat 4 (berdasarkan notasi indik), cepat dan ringan juga. Anda tidak perlu mengkompilasi apa pun hanya perlu menyertakan file header utama. Saya telah menggunakannya pada beberapa proyek dan bekerja dengan baik.
Ini memiliki beberapa fitur bawaan untuk tensor peringkat-2 seperti pemecah linear, svd, LU dan dekomposisi Cholesky, dll. Saya tidak menggunakan salah satu dari mereka (saya menggunakan perpustakaan lain untuk itu).
sumber
Ada juga ITensor (membutuhkan C ++ 17).
sumber