GSL에서의 역행렬은 LU분해와 Cholesky분해를 이용하여 구할 수 있습니다.

역행렬을 구하기 위해서는 LU분해를 먼저 수행하여야 합니다.
LU분해를 위한 함수는 다음과 같습니다.
int gsl_linalg_LU_decomp (gsl_matrix * A, gsl_permutation * p, int *signum)
행렬 A를 분해하여 다시 A에 저장합니다. p는 순열행렬이며 signum은 순열행렬의 부호입니다.
(LU분해에 대한 더 자세한 내용은 다음 기회에 다시 설명하겠습니다.)
이렇게 얻은 LU행렬과 순열행렬 p를 이용하여 역행렬을 구합니다.
int gsl_linalg_LU_invert (const gsl_matrix * LU, const gsl_permutation * p, gsl_matrix * inverse)
역행렬은 inverse에 저장됩니다.
이제, GSL로 구한 역행렬을 Mathematica와 비교해 보고, 간단한 샘플코드를 작성하여 보겠습니다.

위에 난수값을 가지고 GSL을 이용하여 역행렬을 구해보겠습니다.

여기서 반드시 순영행렬 P와 역행렬이 저장될 수 있는 minv는 미리 메모리를 할당하여야 합니다.
[실행결과]

보시는 바와 같이 결과가 거의 동일함을 알 수 있습니다.
Cholesky분해로 역행렬 구하기
#include <gsl/gsl_linalg.h>
마찬가지로 gsl_linalg.h 헤더파일을 포함하여야 합니다.
Cholesky분해 함수는 다음과 같습니다.
iint gsl_linalg_cholesky_decomp (gsl_matrix * A)
행렬 A를 분해하여 다시 A에 저장합니다.
이렇게 얻은 행렬을 이용하여 역행렬을 구합니다.
int gsl_linalg_cholesky_invert (gsl_matrix * cholesky)
역시나 입출력을 같은 변수를 이용합니다.
Mathematica를 이용하여 Cholesky분해할 대칭행렬을 만들어보고 실제로 GSL을 이용하여 Cholesky분해를 수행하여 보겠습니다.

[실행결과]











