2013-07-30 5 views
1

중/대형 치수 (1000-5000 방정식)의 선형 시스템을 해결하기 위해 Armadillo C++ 라이브러리를 사용하고 있습니다. I 다른 선형 시스템 Armadillo C++ LU 분해

AX

를 해결하고 있으므로

는 = B, A는 항상 동일한 및 B의 변경 인

, I는 LU 싶습니다 번만를 인수 분해하고 다른과 LU 인수 분해를 재사용 비. 불행히도 나는 아르마딜로에서 이런 종류의 작업을 수행하는 방법을 모른다.

은 내가 한 것은 행렬의 단지 LU 인수 분해했다 :

하지만 지금은 다른 B 벡터 여러 선형 시스템을 해결하기 위해 매트릭스의 P, L과 U를 사용하고 싶습니다.

제발 도와 주실 수 있나요? 인해 실제의 부족

x = solve(trimatu(U), solve(trimatl(L), P*b)); 

: P.t()*L*U*x = bx 풀면 (평등 인해 라운딩 에러로 근사치 임) A = P.t()*L*UB 행 앞으로 수행 다시 교체 순열 할 필요

+0

어쩌면 당신은 이미 시도한 것을 우리에게 말할 수 있습니까? 아마도 귀하의 질문을 편집하여 귀하의 시도에 대한 [SSCCE] (http://sscce.org/)를 포함시킬 수 있습니까? –

+0

Joachim에게 감사드립니다. –

답변

2

때문에 아르마딜로의 삼각형 솔버 및 행 순열을 수행하는 빠른 방법을 사용하면이 연산은 관련 계산 LAPACK 서브 루틴에 대한 직접 호출과 관련하여 매우 효율적이지는 않습니다.

일반적인 조언은 armadillo와 같은 상위 레벨 라이브러리에서 명시 적 LU 분해를 피하는 것입니다. 모든 다른 b 경우

  1. 들에는 한 번에 하나의 공지되어 년대 동시에 알려진 직사각형 행렬 B 및 다른 b 경우 X = solve(A,B);
  2. 에서 열로 저장할 '다음 AINV = A.i();를 미리 계산하고 x = AINV*b;은 다른 rhs의 수가 벡터는 충분히 크다. 이 answerquestion으로 보아라.