Ответ 1
Eigen очень хорошо поддерживается (по крайней мере, сейчас, по крайней мере, новые версии выходят каждый месяц) и поддерживает другие операции, которые вам нужны.
Я ищу совет относительно высокопроизводительных многомерных массивов/классов для С++. Мне действительно нужно:
способность динамически распределять массивы с размером, определенным во время выполнения
возможность доступа и изменения значений одного массива (быстро)
чтобы иметь возможность использовать арифметику простых массивов, такую как array1 = array2 + 2 * array3
хорошо сохранившаяся библиотека
Я столкнулся с различными библиотеками, в том числе:
Blitz ++, который выглядит именно так, что мне нужно, но который, кажется, не очень хорошо поддерживается (последняя стабильная версия была 5 лет назад)
Boost, который не поддерживает арифметику массивов и выглядит довольно медленным, по сравнению с Blitz ++.
Jonn Bowman array.h, у которого нет документации.
Есть ли у кого-нибудь другие предложения или комментарии по вышеуказанным параметрам?
Eigen очень хорошо поддерживается (по крайней мере, сейчас, по крайней мере, новые версии выходят каждый месяц) и поддерживает другие операции, которые вам нужны.
Существует широкий и относительно недавний опрос, в том числе контрольные показатели, здесь.
Я считаю, что вы можете ускорить Boost.UBlas, привязывая его к базовым числовым библиотекам, таким как LAPACK или Intel MKL, но этого не делали.
fwiw, реализаций, которые чаще всего появляются в качестве кандидатов, являются Boost.UBlas и MTL. По моему опыту, широкое внедрение, скорее всего, будет способствовать постоянной поддержке и развитию.
Necomi, кажется, предоставляет функции, которые вы хотели бы.
Он включает поддержку произвольных многомерных чисел, размеры которых можно фиксировать во время выполнения, обеспечивает быстрый доступ к отдельным элементам, а также поддерживает арифметические (среди прочего) выражения.
Также еще одна бесстыдная самореклама,
https://github.com/dwwork/FortCpp/
Я разместил собственное решение для этой проблемы на GitHub. Я не специалист по С++, но я думал, что по крайней мере выброшу его.
Возможно, библиотека, такая как BLAS, CBLAS существует, но не помню, где.
С точки зрения производительности, я попробовал boost:: MultiArray и Armadillo. Ни то, ни другое не было быстрым, поскольку оба имели медленное время доступа по сравнению с массивами или векторами, и я смог избить эти пакеты в операции, такой как x1 (4:10) = x2 (1: 6) + x2 (2: 7) + x2 (3: 8), используя простой ручной код (я уверен, с помощью моей оптимизации компилятора). Когда вы попадаете в матричное умножение, эти пакеты могут получить некоторую выгоду через LAPACK и BLAS, но вы всегда можете использовать эти интерфейсы самостоятельно.
С оговоркой, что это бесстыдная самореклама,
https://github.com/ndarray/ndarray
может стоить посмотреть.
Пока он не предоставляет оптимизированных математических операторов, для этого он обеспечивает интерфейс для Eigen. Там, где это действительно выделяется, обеспечивается совместимость с Python/NumPy через SWIG или Boost.Python.