# LU 분해 : C++ Eigen3

LU 분해는 선형대수학에서 중요한 역할을 하는 행렬 분해 기법이다. 특히, C++의 Eigen 라이브러리를 이용한 LU 분해는 효율적인 계산을 가능하게 하며, 다양한 수치해석 문제를 해결하는 데 사용된다. 다음에서는 LU 분해의 기본 개념부터 Eigen3 라이브러리에서의 구현 방법까지 체계적으로 설명하겠다.

#### LU 분해의 기본 개념

LU 분해는 주어진 정방행렬 $ A $를 두 개의 행렬로 분해하는 기법이다. 즉, 행렬 $ A $를 하삼각 행렬 $ L $과 상삼각 행렬 $ U $의 곱으로 표현할 수 있다.

* **하삼각 행렬 (L)**: 주대각선 위의 모든 원소가 1인 삼각 행렬이다. 즉, $ L\_{ij} = 0 $ for $ i < j $.
* **상삼각 행렬 (U)**: 주대각선 아래의 모든 원소가 0인 삼각 행렬이다. 즉, $ U\_{ij} = 0 $ for $ i > j $.

LU 분해의 수학적 표현은 다음과 같다:

$$
A = LU
$$

이러한 분해는 시스템의 해를 구하는 데 유용하며, 행렬의 역행렬 계산, 행렬식 계산 등의 다양한 문제를 해결하는 데 사용된다.

#### Eigen3 라이브러리 소개

Eigen3은 C++로 작성된 선형대수 라이브러리로, 행렬 연산 및 벡터 연산을 효율적으로 처리할 수 있는 도구를 제공한다. Eigen3은 빠르고 강력한 수치 해석 기능을 제공하며, LU 분해를 포함한 다양한 분해 기법을 지원한다.

#### Eigen3에서 LU 분해 수행하기

Eigen3에서 LU 분해를 수행하는 과정은 다음과 같다:

1. **헤더 파일 포함**

   Eigen3의 LU 분해를 사용하기 위해서는 우선 필요한 헤더 파일을 포함해야 한다.

   ```cpp
   #include <Eigen/Dense>
   ```
2. **행렬 정의 및 초기화**

   Eigen3에서는 `Eigen::MatrixXd` 클래스를 사용하여 행렬을 정의하고 초기화할 수 있다. 여기서 `MatrixXd`는 실수형 원소를 가진 행렬을 의미한다.

   ```cpp
   Eigen::MatrixXd A(3, 3);
   A << 4, -2, 1,
        1,  6, 2,
       -1,  1, 5;
   ```
3. **LU 분해 수행**

   Eigen3의 `Eigen::PartialPivLU` 클래스를 사용하여 LU 분해를 수행할 수 있다. `PartialPivLU`는 부분 피봇팅을 사용한 LU 분해를 구현한다.

   ```cpp
   Eigen::PartialPivLU<Eigen::MatrixXd> lu_decomp(A);
   ```
4. **분해된 행렬 접근**

   LU 분해 결과로부터 하삼각 행렬 $ L $과 상삼각 행렬 $ U $에 접근할 수 있다. Eigen3에서는 `matrixL()` 및 `matrixU()` 메서드를 통해 각각의 행렬에 접근할 수 있다.

   ```cpp
   Eigen::MatrixXd L = lu_decomp.matrixL();
   Eigen::MatrixXd U = lu_decomp.matrixU();
   ```
5. **해 계산**

   LU 분해를 이용하여 선형 시스템 $ Ax = b $의 해를 구할 수 있다. Eigen3에서는 `solve` 메서드를 통해 이를 간단히 해결할 수 있다.

   ```cpp
   Eigen::VectorXd b(3);
   b << 1, 2, 3;
   Eigen::VectorXd x = lu_decomp.solve(b);
   ```

#### 관련 자료:

***

* **Eigen Documentation**: <https://eigen.tuxfamily.org/dox/>
* **LU Decomposition in Eigen**: <https://eigen.tuxfamily.org/dox/classEigen_1_1PartialPivLU.html>
