решить для используя LAPACK и BLAS

12

Я портирую существующий код из MATLAB на C ++ и имею линейную систему для решения (вместо более типичной формы )A x = bxA=bAx=b

Матрица плотная и общего вида, но не больше 1000x1000. Таким образом, в MATLAB решение находится по функции или через косую чертуAmrdivide(b,A)x = b/A;

Как мне решить эту проблему в моем коде C ++, используя процедуры BLAS и LAPACK?

Я знаком с процедурой LAPACK, DGESVкоторая решает для .xAx=bx

Итак, одна мысль у меня была сделать некоторые манипуляции с использованием матрицы транспонирования идентичности:

(xA)T=bT

ATxT=bT

xT=(AT)1bT

Затем решить окончательную форму с помощью DGESVработающих на транспонированной AT . (так что стоит перенести A и стоить решить систему)

Есть ли подход более эффективный или лучше ?

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

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

Может быть , это MATLAB документация по mrdivideполезной для других.

NoahR
источник

Ответы:

10

Тривиальный ответ для квадрата : используйте, который решает также для когда .A T x = bAdgesvxATx=bTRANS = 'T'

Обратите внимание, что с BLAS или LAPACK вам вряд ли придется транспонировать (обменивать элементы в памяти) матрицу: у большинства подпрограмм есть TRANSаргумент, чтобы приспособиться для работы с матрицей транспонирования или с матрицей, хранящейся в другой структуре памяти. (Транспонирование эквивалентно изменению схемы памяти, смежной с Фортраном, на схему C-смежности и наоборот).

Стефано М
источник
Спасибо за ответ и объяснение! Я проделал очень мало работы с LAPACK, и теперь я знаю, как искать вариант TRANS. У меня проблемы с получением аргумента TRANS для проработки boost::numeric::bindings::lapack::gesvx(), но это не часть моего вопроса здесь. Если у меня будет успех, я вернусь с запиской о том, как это сделать.
NoahR
gesvx()gesvxATX=BATXT=BTXBAXBне. Отлично, это удобнее. Если кто-то еще наткнется на это, пытаясь использовать форсированные числовые привязки, я скажу, что я не смог получить интерфейс транспонирования, используемый в этом soln. работать через привязки.
NoahR
gesvxboost::numeric::bindingsATtrans()boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );
0

A

xA=bxQR=bx=bR1QT

A

Гил
источник
3
ARR1