Большая часть моего программирования - это одноразовые исследовательские коды на Си для моего собственного использования. Я никогда не распространял никакого кода, кроме близких соавторов. Я разработал алгоритм, который я публикую в научном журнале. Я хочу предоставить исходный код и, возможно, исполняемый код в онлайн-дополнении к статье. Коллега попросил, чтобы я сделал обобщение для алгоритма, который требовал от меня писать на C ++ (ack!) И который требовал, чтобы я решал небольшие плотные линейные системы. Если мне удастся получить пользовательскую базу для алгоритма, это будет отчасти потому, что полоса ввода для его использования низкая (как на полу). Потенциальные пользователи не будут устанавливать библиотеки и т. Д. Для использования кода. Я хочу, чтобы код был полностью автономным и не обремененным какой-либо лицензией. Я мог бы просто написать свой собственный решатель, взяв что-то из Голуба и Ван Лоан, но я бы предпочел использовать решатель ванили, который уже написал кто-то другой, если таковые имеются. Предложения приветствуются. Спасибо!
9
Ответы:
Я бы посоветовал точно продублировать интерфейс Lapack с нужной вам функцией, скорее всего, вам просто нужно
dgesv
. Таким образом, люди, у которых установлен Lapack, могут просто ссылаться на него, и он просто будет работать. Для людей, у которых не установлен Lapack, вы предоставляете собственную простую реализацию этой функции или, возможно, реализуете ее с использованием Eigen или FLENS, как предлагали другие.На земле Фортран библиотека Лапак является таким стандартом, что большинство людей просто используют ее и все, вместо того, чтобы предоставлять свои собственные реализации.
источник
Очень ранняя ошибка, которую делают многие люди, когда начинают работать в области научных вычислений, предполагает, что вам нужно написать весь код на одном языке. Я думаю, что это во многом связано с историческими причинами, когда не было ясно, как заставить скомпилированные программы взаимодействовать друг с другом даже между версиями одного и того же компилятора. Тем не менее, в этом случае, если вы все равно собираетесь использовать C ++, есть несколько очень хороших библиотек шаблонов только для заголовков C ++, которые могут соответствовать вашим потребностям.
Поскольку вы распространяете свой код по академическим соображениям и хотели бы встроить в ваш код плотный решатель линейной алгебры, я настоятельно рекомендую вам рассмотреть Eigen . Eigen был лицензирован под публичной лицензией Mozilla и является библиотекой только для заголовков. Это означает, что вы можете распространять Eigen с вашим кодом в исходной форме (это не накладывает никаких лицензионных ограничений на ваш код), и вы получите доступ к его общим возможностям, включая чрезвычайно эффективные плотные линейные решатели. Как упоминает GertVdE, у вас есть несколько других вариантов .
источник
Если вам нужен надежный решатель для систем линейных уравнений, я бы порекомендовал FLENS . Он содержит точную повторную реализацию LAPACK (он даже воспроизводит те же ошибки округления, что и LAPACK, если используется однопоточная реализация BLAS). Это верно для всех функций FLENS-LAPACK (вместе с функциями утилит около 100 подпрограмм).
FLENS находится под лицензией BSD и поэтому позволяет быть включенным в проприетарные продукты.
FLENS - это только заголовок, и если вам нужен только поднабор FLENS, я могу предоставить вам урезанную версию, содержащую только те функции, которые вам нужны. FLENS поставляется со своей собственной реализацией BLAS. Но по желанию ваши пользователи могут ссылаться на оптимизированные библиотеки BLAS, такие как ATLAS, OpenBLAS или GotoBALS. Для больших матриц это дает прирост производительности примерно на 40% по сравнению с Eigen.
И да, Eigen также использует набор тестов LAPACK, чтобы проверить их результаты. Они делают это для 3 функций (Lu, Cholesky и собственные значения / -векторы симметричной матрицы). Однако их вычисление собственных значений / векторов несимметричной матрицы не выполнит тестовый набор LAPACK.
Отказ от ответственности: Да, FLENS мой ребенок! Это означает, что я написал около 95% кода, и каждая строка кода стоила того.
источник