Lapackpp vs Boost BLAS - PullRequest
       30

Lapackpp vs Boost BLAS

4 голосов
/ 01 января 2011

для начала, я новичок в C ++.

Я пишу программу для моей магистерской диссертации, часть которой предполагает регрессивное решение регрессии.

Я бы хотел решить:

Ax = y

В моем случае скорость вычислений нельзя пренебречь, поэтому я бы хотел узнать, использует ли Boost :: BLAS

x = (A^T A)^{-1}A^Ty

потребует меньше вычислений, чем Lapackpp (я использую gentoo).

P.S. Я смог найти на сайте проекта Lapackpp документацию по классу, но не примеры. Может ли кто-нибудь дать мне несколько примеров, если Lapack быстрее, чем Boost :: BLAS

Спасибо

Ответы [ 4 ]

4 голосов
/ 21 января 2011

С точки зрения численного анализа вы никогда не захотите писать код, который

  • Явно инвертирует матрицу, или
  • Формирует матрицу нормальных уравнений (A^T A) для регрессии

Оба они более трудоемки и менее точны (и, вероятно, менее стабильны), чем альтернативы, которые решают ту же проблему напрямую.

Всякий раз, когда вы видите какую-то математику, показывающую инверсию матрицы, это следует читать как означающее «решить систему линейных уравнений», или разложить матрицу и использовать факторизацию для решения системы. И BLAS, и Lapack имеют процедуры для этого.

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

3 голосов
/ 20 января 2011

Вам действительно нужно реализовать с C ++? Например, будет ли Python / Numpy альтернативой для вас? А для рекурсивной регрессии (наименьших квадратов) я рекомендую поискать лекции профессора Странга из Массачусетского технологического института по линейной алгебре и / или его книги.

2 голосов
/ 18 декабря 2012

Armadillo оборачивает BLAS и LAPACK в приятный интерфейс C ++ и предоставляет следующие Matlab-подобные функции, непосредственно связанные с вашей проблемой:

  • решить () , чтобы решить систему линейных уравнений
  • pinv () , псевдообратный (который использует SVD внутри)
2 голосов
/ 03 января 2011

Интерфейс высокого уровня и оптимизация низкого уровня - это две разные вещи.

LAPACK и uBLAS обеспечивают интерфейс высокого уровня и неоптимизированную реализацию низкого уровня.Аппаратно оптимизированные низкоуровневые подпрограммы (или привязки) должны поступать откуда-то еще.Как только привязки предоставлены, LAPACK и uBLAS могут использовать оптимизированные подпрограммы низкого уровня вместо своих собственных неоптимизированных реализаций.

Например, ATLAS предоставляет оптимизированные подпрограммы низкого уровня, но только ограниченный высокий уровень (уровень 3 BLAS и т. Д.) интерфейс.Вы можете привязать ATLAS к LAPACK.Тогда LAPACK использовал бы ATLAS для работы низкого уровня.Думайте о LAPACK как о старшем менеджере, который делегирует техническую работу опытным инженерам (ATLAS).То же самое для UBLAS.Вы можете связать UBLAS и MKL.Результатом будет оптимизированная библиотека C ++.Проверьте документацию и воспользуйтесь Google, чтобы выяснить, как это сделать.

...