Я портирую существующий код из MATLAB на C ++ и имею линейную систему для решения (вместо более типичной формы )A x = b
Матрица плотная и общего вида, но не больше 1000x1000. Таким образом, в MATLAB решение находится по функции или через косую чертуmrdivide(b,A)
x = b/A;
Как мне решить эту проблему в моем коде C ++, используя процедуры BLAS и LAPACK?
Я знаком с процедурой LAPACK, DGESV
которая решает для .x
Итак, одна мысль у меня была сделать некоторые манипуляции с использованием матрицы транспонирования идентичности:
Затем решить окончательную форму с помощью DGESV
работающих на транспонированной . (так что стоит перенести и стоить решить систему)
Есть ли подход более эффективный или лучше ?
Я работаю с матричными и векторными классами, а также с реализацией BLAS из библиотеки BOOST uBLAS, а также с привязками к подпрограммам библиотеки LAPACK. Я успешно использовал эту настройку для других операций и надеюсь найти решение, ограниченное этими библиотеками.
Кроме того, я должен отметить, что я выполняю этот тип операции только несколько раз во время настройки кода, поэтому производительность не является критической проблемой.
Может быть , это MATLAB документация по mrdivide
полезной для других.
источник
boost::numeric::bindings::lapack::gesvx()
, но это не часть моего вопроса здесь. Если у меня будет успех, я вернусь с запиской о том, как это сделать.gesvx()
gesvx
gesvx
boost::numeric::bindings
trans()
boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );
источник