Мне нужна небольшая библиотека для 2d и 3d векторов и матриц 3x3 и 4x4. В базовом C. Именно поэтому я не изобретаю велосипед неоптимально.
Любые предложения?
Мне нужна небольшая библиотека для 2d и 3d векторов и матриц 3x3 и 4x4. В базовом C. Именно поэтому я не изобретаю велосипед неоптимально.
Любые предложения?
Meschach - это векторная/матричная библиотека c-only, значительно меньшая, чем, например, LAPACK (согласно частому FAQ, по крайней мере:)
Многие люди говорят вам использовать различные библиотеки BLAS, но это, вероятно, будет очень медленным для вас, поскольку вы работаете над малые матрицы. Большинство из них оптимизированы для блокировки матрицы в фиксированные размеры (около 50 элементов - зависит от размеров кеша) и работают с кусками с оптимизированным алгоритмом, а затем работают с остатками с помощью тривиального алгоритма. На малых матрицах это делает его еще медленнее, чем просто вызов тривиального алгоритма.
FWIW, когда мне нужно было сделать это в fortran (2x2 и 4x4 квадратные матрицы), я просто жестко закодировал полностью развернутые версии, и он работал достаточно хорошо (около 20x скорость встроенного MATMUL на gfortran, но часть этого, вероятно, была вызвана к тому, что MATMUL не на месте, и моя версия была). Я никогда не смог найти хорошую библиотеку, чтобы сделать это для меня.
В С++ это было бы хорошо, так как вы могли бы использовать BLITZ, но, увы...
Предполагая, что вы кодируете x86, вы можете посмотреть в Intel Интегрированные перформансы производительности (IPP) и Библиотека математического ядра (MKL). Они обеспечивают супер-пупер-быстрые библиотеки (возможно, быстрее, чем кто-либо другой, могут писать, поскольку они оптимизированы для деталей, не относящихся к публичной микроархитектуре) для множества общих операций, включая векторы и матрицы.
Попробуйте CIMG (cimg.sourceforge.net). Он ориентирован на обработку изображений, но является бесплатным, чрезвычайно легким (вся библиотека состоит из одного файла .h) и имеет все стандартные операции с вектором/матрицей.
Это С++, поэтому он не будет работать, если вы делаете прямой C, но это стоит посмотреть.
Возможно, вам стоит попробовать DirectX math lib (просто Windows...). Векторы, матрицы, операции на нем, все, что вам нужно, вероятно, есть. Вы можете использовать это, а не целое DX. Вы можете использовать версии 9 или 10. Быстро:)
#include <D3DX9Math.h>
В Mathtools.net. Объектно-ориентированные числа также перечислены некоторые пакеты, которые могут сработать для вас. Поскольку я не уверен, что вы делаете (вам нужна много оптимизированная линейная алгебра? Или достаточно простых операций?), Трудно быть более конкретным.
В общем, Matrix Template Library довольно хорошо продуман. И если вам нужна серьезная линейная алгебра, вам следует взглянуть на BLAS и LAPACK.
Вы также можете посмотреть библиотеку Armadillo С++