Каковы библиотеки математики/линейной алгебры вектора/матрицы C++, которыми наиболее широко пользуются, и их стоимость и компромиссы преимущества? [закрытый]

Сервис браузера SQL Server http://msdn.microsoft.com/en-us/library/ms181087.aspx

234
задан halfer 8 August 2017 в 23:16
поделиться

7 ответов

Есть немало проектов, которые выбрали для этого Generic Graphics Toolkit . GMTL там хороший - он довольно маленький, очень функциональный и используется достаточно широко, чтобы быть очень надежным. OpenSG, VRJuggler и другие проекты все переключились на использование этого вместо собственной ручной математики вертора / матрицы.

Я нашел это довольно приятным - он делает все с помощью шаблонов, поэтому он очень гибкий и очень быстрый .


Изменить:

После обсуждения комментариев и правок я подумал, что выкину дополнительную информацию о преимуществах и недостатках конкретных реализаций, а также о том, почему вы можете выбрать одно вместо другого, учитывая вашу ситуацию.

GMTL -

Преимущества: Простой API, специально разработанный для графических движков. Включает в себя множество примитивных типов, ориентированных на рендеринг (например, плоскости, AABB, четвертичные с множественной интерполяцией и т. Д.), Которых нет ни в каких других пакетах. Очень низкие накладные расходы на память, довольно быстрые, простые в использовании.

Недостатки: API очень ориентирован именно на рендеринг и графику. Не включает матрицы общего назначения (NxM), разложение и решение матриц и т. Д., Так как они выходят за рамки традиционных графических / геометрических приложений.

Eigen -

Преимущества: Clean API , довольно проста в использовании. Включает модуль Geometry с кватернионами и геометрическими преобразованиями. Низкие накладные расходы на память. Полное, высокопроизводительное решение больших матриц NxN и другие математические процедуры общего назначения.

Недостатки: может быть немного больше возможностей, чем вы хотите (?). Меньшее количество специальных процедур для геометрической обработки / визуализации по сравнению с GMTL (например, определение углов Эйлера и т. Д.).

IMSL -

Преимущества: Очень полная числовая библиотека. Очень и очень быстро (предположительно, самый быстрый решатель). Безусловно, самый большой и полный математический API. Имеет коммерческую поддержку, зрелость и стабильность.

Недостатки: Стоимость - недешево. Очень мало методов, специфичных для геометрии / рендеринга, поэтому вам нужно будет использовать свой собственный поверх классов линейной алгебры.

NT2 -

Преимущества: Предоставляет синтаксис, более знакомый, если вы привыкли к MATLAB. Обеспечивает полную декомпозицию и решение для больших матриц и т. Д.

Недостатки: математические, не сфокусированные на рендеринге. Вероятно, не такой производительный, как Eigen.

LAPACK -

Преимущества: Очень стабильные, проверенные алгоритмы. Был здесь уже давно. Полное решение матрицы, и т. д. Множество вариантов непонятной математики.

Недостатки: В некоторых случаях не такая высокая производительность. Портировано из Fortran, со странным API для использования.

Лично для меня все сводится к одному вопросу - как вы собираетесь это использовать. Если вы сосредоточены только на рендеринге и графике, мне понравится Generic Graphics Toolkit , поскольку он хорошо работает и поддерживает многие полезные операции рендеринга из коробки без необходимости реализовывать свои собственные. Если вам нужно решение матриц общего назначения (например, SVD или LU-разложение больших матриц), я бы выбрал Eigen , поскольку он обрабатывает это, предоставляет некоторые геометрические операции и очень эффективен с большими матричными решениями. . Возможно, вам придется написать больше ваших собственных графических / геометрических операций (поверх их матриц / векторов), но это не так уж плохо.

Множество вариантов непонятной математики.

Недостатки: В некоторых случаях не такая высокая производительность. Портировано из Фортрана, со странным API для использования.

Лично для меня все сводится к одному вопросу - как вы собираетесь это использовать. Если вы сосредоточены только на рендеринге и графике, мне понравится Generic Graphics Toolkit , поскольку он хорошо работает и поддерживает множество полезных операций рендеринга из коробки, без необходимости реализовывать свои собственные. Если вам нужно решение матриц общего назначения (например, SVD или LU-разложение больших матриц), я бы выбрал Eigen , поскольку он обрабатывает это, предоставляет некоторые геометрические операции и очень эффективен с большими матричными решениями. . Возможно, вам придется написать больше ваших собственных графических / геометрических операций (поверх их матриц / векторов), но это не так уж плохо.

Множество вариантов непонятной математики.

Недостатки: В некоторых случаях не такая высокая производительность. Портировано из Фортрана, со странным API для использования.

Лично для меня все сводится к одному вопросу - как вы собираетесь это использовать. Если вы сосредоточены только на рендеринге и графике, мне понравится Generic Graphics Toolkit , поскольку он хорошо работает и поддерживает многие полезные операции рендеринга из коробки без необходимости реализовывать свои собственные. Если вам нужно решение матриц общего назначения (например, SVD или LU-разложение больших матриц), я бы выбрал Eigen , поскольку он обрабатывает это, предоставляет некоторые геометрические операции и очень эффективен с большими матричными решениями. . Возможно, вам придется написать больше ваших собственных графических / геометрических операций (поверх их матриц / векторов), но это не так уж плохо.

В некоторых случаях не такая высокая производительность. Портировано из Фортрана, со странным API для использования.

Лично для меня все сводится к одному вопросу - как вы собираетесь это использовать. Если вы сосредоточены только на рендеринге и графике, мне понравится Generic Graphics Toolkit , поскольку он хорошо работает и поддерживает многие полезные операции рендеринга из коробки без необходимости реализовывать свои собственные. Если вам нужно решение матриц общего назначения (например, SVD или LU-разложение больших матриц), я бы выбрал Eigen , поскольку он обрабатывает это, предоставляет некоторые геометрические операции и очень эффективен с большими матричными решениями. . Возможно, вам придется написать больше ваших собственных графических / геометрических операций (поверх их матриц / векторов), но это не так уж плохо.

В некоторых случаях не такая высокая производительность. Портировано из Fortran, со странным API для использования.

Лично для меня все сводится к одному вопросу - как вы собираетесь это использовать. Если вы сосредоточены только на рендеринге и графике, мне понравится Generic Graphics Toolkit , поскольку он хорошо работает и поддерживает многие полезные операции рендеринга из коробки без необходимости реализовывать свои собственные. Если вам нужно решение матриц общего назначения (например, SVD или LU-разложение больших матриц), я бы выбрал Eigen , поскольку он обрабатывает это, предоставляет некоторые геометрические операции и очень эффективен с большими матричными решениями. . Возможно, вам придется написать больше ваших собственных графических / геометрических операций (поверх их матриц / векторов), но это не так уж плохо.

со странным API для использования.

Лично для меня все сводится к одному вопросу - как вы планируете это использовать. Если вы сосредоточены только на рендеринге и графике, мне понравится Generic Graphics Toolkit , поскольку он хорошо работает и поддерживает многие полезные операции рендеринга из коробки без необходимости реализовывать свои собственные. Если вам нужно решение матриц общего назначения (например, SVD или LU-разложение больших матриц), я бы выбрал Eigen , поскольку он обрабатывает это, предоставляет некоторые геометрические операции и очень эффективен с большими матричными решениями. . Возможно, вам придется написать больше ваших собственных графических / геометрических операций (поверх их матриц / векторов), но это не так уж плохо.

со странным API для использования.

Лично для меня все сводится к одному вопросу - как вы планируете это использовать. Если вы сосредоточены только на рендеринге и графике, мне понравится Generic Graphics Toolkit , поскольку он хорошо работает и поддерживает множество полезных операций рендеринга из коробки, без необходимости реализовывать свои собственные. Если вам нужно решение матриц общего назначения (например, SVD или LU-разложение больших матриц), я бы выбрал Eigen , поскольку он обрабатывает это, предоставляет некоторые геометрические операции и очень эффективен с большими матричными решениями. . Возможно, вам придется написать больше ваших собственных графических / геометрических операций (поверх их матриц / векторов), но это не так уж плохо.

Я сосредоточен только на рендеринге и графике, мне нравится Generic Graphics Toolkit , поскольку он хорошо работает и поддерживает множество полезных операций рендеринга из коробки без необходимости реализовывать свои собственные. Если вам нужно решение матриц общего назначения (например, SVD или LU-разложение больших матриц), я бы выбрал Eigen , поскольку он обрабатывает это, предоставляет некоторые геометрические операции и очень эффективен с большими матричными решениями. . Возможно, вам придется написать больше ваших собственных графических / геометрических операций (поверх их матриц / векторов), но это не так уж плохо.

Я сосредоточен только на рендеринге и графике, мне нравится Generic Graphics Toolkit , поскольку он хорошо работает и поддерживает множество полезных операций рендеринга из коробки без необходимости реализовывать свои собственные. Если вам нужно решение матриц общего назначения (например, SVD или LU-разложение больших матриц), я бы выбрал Eigen , поскольку он обрабатывает это, предоставляет некоторые геометрические операции и очень эффективен с большими матричными решениями. . Возможно, вам придется написать больше ваших собственных графических / геометрических операций (поверх их матриц / векторов), но это не так уж плохо.

SVD или LU-разложение больших матриц), я бы выбрал Eigen , поскольку он обрабатывает это, предоставляет некоторые геометрические операции и очень эффективен с решениями для больших матриц. Возможно, вам придется написать больше ваших собственных графических / геометрических операций (поверх их матриц / векторов), но это не так уж плохо.

SVD или LU-разложение больших матриц), я бы выбрал Eigen , поскольку он обрабатывает это, предоставляет некоторые геометрические операции и очень эффективен с большими матричными решениями. Возможно, вам придется написать больше ваших собственных графических / геометрических операций (поверх их матриц / векторов), но это не так уж плохо.

111
ответ дан 23 November 2019 в 03:31
поделиться

Я слышал хорошие отзывы о Eigen и NT2 , но лично не использовал ни то, ни другое. Также есть Boost.UBLAS , который, как мне кажется, становится слишком длинным. Разработчики NT2 создают следующую версию с намерением включить ее в Boost, чтобы это могло что-то значить.

My lin. alg. потребности не выходят за рамки корпуса матрицы 4x4, поэтому я не могу комментировать расширенную функциональность; Я просто указываю на несколько вариантов.

8
ответ дан 23 November 2019 в 03:31
поделиться

Я новичок в этой теме, поэтому не могу сказать много, но BLAS в значительной степени является стандартом в научных вычислениях. BLAS на самом деле является стандартом API, который имеет множество реализаций. Честно говоря, я не уверен, какие реализации наиболее популярны и почему.

Если вы хотите также иметь возможность выполнять обычные операции линейной алгебры (решения систем, регрессия наименьших квадратов, декомпозиция и т. Д.), Посмотрите LAPACK .

8
ответ дан 23 November 2019 в 03:31
поделиться

Ладно, думаю, я знаю, что вы ищете. Похоже, что GGT - довольно хорошее решение, как предложил Рид Копси.

Лично мы свернули нашу небольшую библиотеку, потому что мы много работаем с рациональными точками - множеством рациональных NURBS и Безье.

Оказывается, что это так. большинство библиотек 3D-графики выполняют вычисления с проективными точками, которые не имеют основы в проективной математике, потому что именно они дают вам нужный ответ. В итоге мы использовали точки Грассмана, которые имеют прочную теоретическую основу и уменьшили количество типов точек. Точки Грассмана - это в основном те же вычисления, которые люди используют сейчас, с преимуществом надежной теории. Что наиболее важно, это проясняет ситуацию в нашем сознании, поэтому у нас становится меньше ошибок. Рон Гольдман написал статью о точках Грассмана в компьютерной графике под названием «Алгебраические и геометрические основы компьютерной графики» .

Не имеет прямого отношения к вашему вопросу, но интересное чтение.

4
ответ дан 23 November 2019 в 03:31
поделиться

Я добавлю голосование за Эйгена: я портировал много кода (3D-геометрия, линейная алгебра и дифференциальные уравнения) из разных библиотек в эту - улучшение производительности и читаемости кода почти во всех случаях.

Одно из преимуществ, о котором не упоминалось: очень легко использовать SSE с Eigen, что значительно повышает производительность операций 2D-3D (где все может быть дополнено до 128 бит).

5
ответ дан 23 November 2019 в 03:31
поделиться

Так что я очень критичный человек и полагаю, собираюсь ли я инвестировать в библиотеке, мне лучше знать, во что я ввязываюсь. Я считаю, что при тщательном изучении лучше отказаться от критики и отказаться от лести; то, что с этим не так, имеет гораздо больше последствий для будущего, чем то, что правильно. Поэтому я собираюсь немного переборщить, чтобы дать такой ответ, который помог бы мне, и я надеюсь, поможет другим, кто может пройти этот путь. Имейте в виду, что это основано на том небольшом обзоре / тестировании, который я провел с этими библиотеками. О, и я украл некоторые положительные описания от Рида.

Я упомяну, что я пошел с GMTL, несмотря на это » идиосинкразии, потому что небезопасность Eigen2 была слишком большой обратной стороной. Но недавно я узнал, что следующий выпуск Eigen2 будет содержать определения, которые отключат код выравнивания и сделают его безопасным. Так что я могу переключиться.

Обновление : Я переключился на Eigen3. Несмотря на его особенности, его масштаб и элегантность слишком сложно игнорировать, а оптимизации, делающие его небезопасным, можно отключить с помощью определения.

Eigen2 / Eigen3

Преимущества: LGPL MPL2, Clean , хорошо продуманный API, довольно простой в использовании. Кажется, в хорошем состоянии с ярким сообществом. Низкие накладные расходы на память. Высокая производительность. Сделано для общей линейной алгебры, но также доступны хорошие геометрические функции. Вся библиотека заголовков, связывание не требуется.

Идиоцинкразия / недостатки: (Некоторых / всего этого можно избежать с помощью некоторых определений, доступных в текущей ветви разработки Eigen3)

  • Небезопасная оптимизация производительности приводит к необходимости тщательного соблюдения правил. Несоблюдение правил вызывает сбои.
    • вы просто не можете безопасно передать значение
    • использование типов Eigen в качестве членов требует специальной настройки распределителя (иначе произойдет сбой)
    • использовать с типами контейнеров stl и, возможно, с другими необходимыми шаблонами специальная настройка распределения (или вы рухнете)
    • Некоторым компиляторам требуется особая осторожность, чтобы предотвратить сбои при вызове функций (окна GCC)

GMTL

Преимущества: LGPL, довольно простой API, специально разработанный для графических движков. Включает в себя множество примитивных типов, предназначенных для рендеринга (например, самолеты, AABB, четвертины с множественной интерполяцией и т. д.), нет ни в каких других пакетах. Очень низкие накладные расходы на память, довольно быстро, легко использовать. Все на основе заголовков, связывание не требуется.

Идиосинкразии / недостатки:

  • API необычный
    • то, что может быть myVec.x () в другой библиотеке, доступно только через myVec [0] (проблема читаемости)
      • массив или stl :: vector точек может привести к тому, что вы выполните что-то вроде pointsList [0] [0] для доступа к компоненту x первой точки
    • в наивной попытке оптимизации, удалили cross (vec, vec) и заменяется на makeCross (vec, vec, vec), когда компилятор удаляет в любом случае ненужные темпы
    • обычные математические операции не возвращают нормальные типы, если вы не закрыли отключены некоторые функции оптимизации, например: vec1 - vec2 не возвращает вектор нормали, поэтому length (vecA - vecB) не работает, даже если vecC = vecA - vecB работает. Вы должны заключить его в следующий формат: length (Vec (vecA - vecB))
    • операции с векторами выполняются внешними функциями, а не члены. Это может потребовать от вас везде использовать разрешение области поскольку общие имена символов могут конфликтовать
    • вам нужно сделать
      length (makeCross (vecA, vecB))
      или
      gmtl :: length (gmtl :: makeCross (vecA, vecB))
      где в противном случае вы можете попробовать
      vecA.cross (vecB) .length ()
  • не поддерживается
    • по-прежнему заявлен как «бета»
    • в документации отсутствует основная информация, например, какие заголовки нужны для использовать нормальную функциональность
      • Vec.h не содержит операций для векторов, VecOps.h содержит некоторые, другие, например, находятся в Generate.h. крест (vec &, vec &, vec &) в VecOps.h, [make] cross (vec &, vec &) в Generate.h
  • незрелый / нестабильный API; все еще меняется.
    • Например, «крест» перемещен из «VecOps.h» в «Generate.h», и затем название было изменено на «makeCross». Примеры документации терпят неудачу потому что по-прежнему ссылаются на старые версии функций, которые больше не существуют.

NT2

Не могу сказать, потому что они, похоже, больше заинтересованы в заголовке фрактального изображения своей веб-страницы, чем в содержании. Больше похоже на академический проект, чем на серьезный программный проект.

Последний выпуск более двух лет назад.

По-видимому, документации на английском языке нет, хотя предположительно где-то есть что-то на французском.

Не удалось найти никаких следов сообщества вокруг проекта.

LAPACK & BLAS

Преимущества: старые и зрелые.

Недостатки:

  • старые, как динозавры, с действительно дрянными API
34
ответ дан 23 November 2019 в 03:31
поделиться

Если вы ищете высокопроизводительную матрицу / линейную алгебру / оптимизацию для процессоров Intel, я бы посмотрел на библиотеку Intel MKL.

MKL тщательно оптимизирован для обеспечения высокой производительности - большая часть его основана на очень зрелых стандартах BLAS / LAPACK fortran. И его производительность зависит от количества доступных ядер. Масштабируемость без помощи рук с доступными ядрами - это будущее вычислений, и я бы не стал использовать математическую библиотеку для нового проекта, не поддерживающего многоядерные процессоры.

Вкратце, он включает:

  1. Базовый вектор-вектор , вектор-матрица, и матрично-матричные операции
  2. Факторизация матрицы (LU decomp, эрмитова, разреженная)
  3. Аппроксимация методом наименьших квадратов и задачи на собственные значения
  4. Решатели разреженных линейных систем
  5. Решатель нелинейных наименьших квадратов (доверенные области)
  6. Плюс процедуры обработки сигналов, такие как БПФ и свертка
  7. Очень быстрые генераторы случайных чисел (поворот Мерсенна)
  8. Многое другое .... см .: текст ссылки

Обратной стороной является то, что MKL API может быть довольно сложный в зависимости от необходимых вам процедур. Вы также можете взглянуть на их библиотеку IPP (Integrated Performance Primitives), которая ориентирована на высокопроизводительные операции обработки изображений, но, тем не менее, довольно обширна.

Пол

CenterSpace Software, .NET Math библиотеки, centerpace.net

11
ответ дан 23 November 2019 в 03:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: