2009-08-04 2 views
8

부스트가 있습니까? 여기서 A, y 및 x는 각각 매트릭스 (희소하고 매우 클 수 있음) 및 벡터입니다. y 또는 x 중 하나를 알 수 없습니다.부스트의 선형 대수학 솔루션 y = Ax

난 여기를 찾을 수 없습니다 : http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm

+2

부스트 나 C++에 대해 전혀 알지 못하기 때문에 A가 가역 행렬 인 경우에만 해답이 있다고 설명 할 것입니다. A가 역변환 가능하지 않다면, 최소 제곱 해 x = (A^T A)^(- 1) A^T y가 가장 가까운 것입니다. –

+4

이것은 일반적으로 행렬 방정식이 해결되는 방식이 아닙니다 (역수는 일반적으로 수치 안정성과 속도 모두에 좋지 않습니다). 대신 QR 또는 LU 인수 분해에 뒤 이은 대체가 표시됩니다. –

답변

4

선형 해법은 일반적으로 BLAS 라이브러리의 높은 수준의 확장 인 LAPACK 라이브러리의 일부입니다. Linux를 사용하는 경우 인텔 MKL에는 고밀도 및 저밀도 매트릭스에 최적화 된 좋은 해결 방법이 있습니다. 당신이 창문에 있으면, MKL은 무료로 1 개월의 재판을받습니다. 솔직히 말해서 나는 다른 어느 곳도 시도하지 않았습니다. Atlas 패키지에는 무료 LAPACK 구현이 있지만 Windows에서 실행하는 것이 얼마나 어려운지는 확실하지 않습니다.

어쨌든 시스템에서 작동하는 LAPACK 라이브러리를 검색하십시오.

+4

참고 : LAPACK은 스파 스 솔버가 아니므로 스파 스 매트릭스를 매우 효율적으로 저장하지 않으며 스파 스 시스템을 특히 효율적으로 해결하지 못합니다. Intel MKL에는 스파 스 (sparse) 솔버 (http://software.intel.com/sites/products/collateral/hpc/mkl/mkl_brief.pdf), 특히 PARDISO 직접 스파 스 솔버 (http : //www.pardiso-project .org). 조밀하고 희소 한 수치 선형 대수 소프트웨어의 좋은 개요는 http://www.netlib.org/utk/people/JackDongarra/la-sw.html – las3rjock

+0

에서 찾을 수 있습니다. 실제로 그렇습니다. 상용 제품을 만들지 않으면 MKL 라이브러리를 거절하고 PARDISO를 얻는 것이 좋습니다. 그러면 돈을 절약하고 라이선스 문제를 해결해야 할 필요가 없습니다. – DeusAduro

3

부스트 문서를 읽는 중 w.r.t가 해결되지 않는 것 같습니다. x가 구현되었습니다. y를 풀면 행렬 - 벡터 (matrix-vector) 제품의 문제 일뿐입니다.

블래스터는 벡터 및 행렬 유형의 더하기, 곱하기 등과 같은 '쉬운'연산 만 구현한다는 점을 명심해야합니다. 더 진보 된 것 (선형 문제 해결, "x y = A x에서 풀기", 고유 벡터 및 코사인)는 BLAS 위에 구축 된 LAPACK의 일부입니다. 나는 그 점에서 부스트가 무엇을 제공하는지 모른다.

3

Boost의 선형 대수학 패키지의 튜닝은 "dense matrices"에 중점을 둡니다. 부스트 패키지에는 선형 시스템 솔버가 없습니다. "Numerical Recipe in C (http://www.nr.com/oldverswitcher.html)"에서 소스 코드 사용은 어떻습니까?

참고. 소스 코드에 미묘한 색인 버그가있을 수 있습니다 (일부 코드는 1에서 배열 색인 시작을 사용합니다)

+0

+1 링크에 감사드립니다. –

+1

그것은 버그가 아닙니다. Fortran 사용자를 위해 알고리즘을 더 맛있게 만드는 것이 었습니다. –

3

JAMA/TNT을 살펴보십시오. 필자는 비 스파 스 행렬 (QR 또는 LU 인수 분해 둘 다 솔버 유틸리티 메소드가 필요함)에 대해서만 사용했지만 분명히 희소 행렬에 대한 일부 기능을 가지고 있습니다. A는 드문 드문 경우에 도끼 = B에 대한 최선의 해법의

4

하나는, 팀 데이비스의 UMFPACK

UMFPACK 그것은 MATLAB이 때의 장면 뒤에 사용됩니다 알고리즘입니다 A.의 스파 스 LU 분해를 계산이다 당신은 x=A\b (그리고 A는 희박하다. 그리고 정사각형). UMFPACK은 자유 소프트웨어입니다 (GPL)

또한 y = Ax이고 x가 알려져 있지만 y가 아닌 경우 선형 시스템을 해결하지 않고 희소 행렬 벡터 곱하기를 수행하여 y를 계산합니다.

17

예, 부스트의 ublas 라이브러리로 선형 방정식을 풀 수 있습니다. 여기에 LU-인수 분해와 역 얻을-대체 다시 사용하여 하나 간단한 방법입니다

using namespace boost::ublas; 

Ainv = identity_matrix<float>(A.size1()); 
permutation_matrix<size_t> pm(A.size1()); 
lu_factorize(A,pm) 
lu_substitute(A, pm, Ainv); 

그래서 선형 시스템 도끼 = Y를 해결하기 위해, 당신은 도끼 = 트랜스 (A) 식 트랜스 (A)를 해결할 것 (trans (A) A)^- 1의 역행렬을 취하여 x : x = (trans (A) A)^- 1Ay를 얻는다.

+10

Ax = y에 대한 해답이 필요하다면,'permutation_matrix pm (A.size1());을 사용하면된다. lu_factorize (A, pm); lu_substitute (A, pm, y); 그리고'y'는 해로 대체됩니다. – Joey

관련 문제