LAPACK 및 BLAS를 사용하여


12

I는 C ++로 MATLAB에서 기존 코드를 포팅하고 해결하는 선형 시스템이 오전 (오히려 더 일반적인 형태보다 X = B를 )xA=bAx=b

행렬 는 밀도가 높고 일반적인 형태이지만 1000x1000보다 크지 않습니다. MATLAB에서 솔루션은 함수 또는 슬래시 표기법으로 찾을 수 있습니다.Amrdivide(b,A)x = b/A;

BLAS 및 LAPACK 루틴을 사용하여 C ++ 코드에서이 문제를 어떻게 해결해야합니까?

나는 LAPACK 루틴을 잘 알고있어 DGESV해결 X = B를 위한 X .Ax=bx

그래서 내가 가진 생각 중 하나는 행렬 전치 ID를 사용하여 약간의 조작을 수행하는 것입니다.

(xA)T=bT

ATxT=bT

xT=(AT)1bT

그런 다음 DGESV조옮김 된 를 조작 하여 최종 양식을 푸십시오 . ( A 를 바꾸는 비용과 시스템 해결 비용)ATA

보다 효율적이거나 더 나은 접근법이 있습니까?

BOOST uBLAS 라이브러리의 BLAS 구현뿐만 아니라 LAPACK 라이브러리 루틴에 대한 바인딩뿐만 아니라 행렬 및 벡터 클래스로 작업하고 있습니다. 다른 작업 에이 설정을 성공적으로 사용했으며 이러한 라이브러리로 제한된 솔루션을 찾고 싶습니다.

또한 코드 설정 중에이 유형의 작업 만 몇 번만 수행하므로 성능은 중요한 문제가 아닙니다.

어쩌면이 MATLAB의 문서 에는 mrdivide다른 사람을 위해 도움이됩니다.

답변:


10

AdgesvxATx=bTRANS = 'T'

BLAS 또는 LAPACK을 사용하면 행렬을 전치 (메모리에서 요소 교환) 할 필요가 거의 없습니다. 대부분의 서브 루틴에는 TRANS전치 행렬 또는 다른 메모리 레이아웃으로 저장된 행렬의 연산을 수용하기위한 인수가 있습니다. (조옮김은 포트란 연속 메모리 레이아웃을 C 연속 배열로 변경하거나 그 반대로 변경하는 것과 같습니다.)


답변과 설명에 감사드립니다! LAPACK을 거의 사용하지 않았으며 이제 TRANS 옵션을 찾는 것을 알고 있습니다. TRANS 인수를 통해 문제를 해결하는 데 문제가 boost::numeric::bindings::lapack::gesvx()있지만 여기에서는 제 질문의 일부가 아닙니다. 성공하면 어떻게하는지에 대한 메모가 다시 올 것이다.
NoahR

gesvx()gesvxATX=BATXT=BTXBAXB아닙니다. 더 편리합니다. 다른 사람이 부스트 숫자 바인딩을 사용하려고 시도하면이 솔른에 사용되는 조옮김 인터페이스를 얻을 수 없다고 말할 것입니다. 바인딩을 통해 작동합니다.
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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.