# 제 5장: 행렬의 고급 분해 및 응용

## 5.1 행렬의 분해

행렬 분해는 행렬을 보다 간단한 형태로 분해하여 다양한 수치 해석 및 계산 문제를 해결하는 방법이다. 이 장에서는 고급 행렬 분해 기법을 살펴보겠다: LU 분해, QR 분해, 그리고 SVD(특잇값 분해)이다.

## 5.2 LU 분해 (LU Decomposition)

LU 분해는 행렬 $ \mathbf{A} $를 하삼각 행렬 $ \mathbf{L} $과 상삼각 행렬 $ \mathbf{U} $로 분해하는 방법이다:

$$
\mathbf{A} = \mathbf{L} \mathbf{U}
$$

### 5.2.1 LU 분해의 용도

* **선형 방정식 시스템 해결**: $ \mathbf{A} \mathbf{x} = \mathbf{b} $ 형태의 시스템을 해결하는 데 유용하다. $ \mathbf{L} $과 $ \mathbf{U} $를 이용하여 두 개의 간단한 시스템을 해결할 수 있다.
* **행렬의 역계산**: 역행렬을 구할 때 LU 분해를 활용할 수 있다.

### 5.2.2 C++ Eigen3를 이용한 LU 분해

```cpp
#include <Eigen/Dense>
#include <iostream>

int main() {
    // 계수 행렬 정의
    Eigen::Matrix2d A;
    A << 2, 1,
         1, 2;

    // LU 분해
    Eigen::PartialPivLU<Eigen::Matrix2d> lu(A);

    // 행렬의 역계산
    Eigen::Matrix2d A_inv = lu.inverse();
    std::cout << "Inverse of A: \n" << A_inv << std::endl;

    return 0;
}
```

이 코드에서는 `PartialPivLU`를 사용하여 행렬 $ \mathbf{A} $의 LU 분해를 수행하고, `inverse()` 함수를 통해 역행렬을 구한다.

## 5.3 QR 분해 (QR Decomposition)

QR 분해는 행렬 $ \mathbf{A} $를 직교 행렬 $ \mathbf{Q} $와 상삼각 행렬 $ \mathbf{R} $로 분해하는 방법이다:

$$
\mathbf{A} = \mathbf{Q} \mathbf{R}
$$

### 5.3.1 QR 분해의 용도

* **최소 제곱 문제 해결**: 데이터에 대한 회귀 분석에서 발생하는 최소 제곱 문제를 해결하는 데 유용하다.
* **행렬의 차원 축소**: 주성분 분석(PCA)에서 데이터의 주요 성분을 추출할 때 활용된다.

### 5.3.2 C++ Eigen3를 이용한 QR 분해

```cpp
#include <Eigen/Dense>
#include <iostream>

int main() {
    // 행렬 정의
    Eigen::Matrix2d A;
    A << 1, 2,
         3, 4;

    // QR 분해
    Eigen::HouseholderQR<Eigen::Matrix2d> qr(A);

    // 직교 행렬 Q와 상삼각 행렬 R 출력
    Eigen::Matrix2d Q = qr.householderQ();
    Eigen::Matrix2d R = qr.matrixQR().triangularView<Eigen::Upper>();

    std::cout << "Q: \n" << Q << std::endl;
    std::cout << "R: \n" << R << std::endl;

    return 0;
}
```

이 코드에서는 `HouseholderQR`를 사용하여 행렬 $ \mathbf{A} $의 QR 분해를 수행하고, `householderQ()`와 `matrixQR().triangularView<Eigen::Upper>()`를 통해 직교 행렬 $ \mathbf{Q} $와 상삼각 행렬 $ \mathbf{R} $을 출력한다.

## 5.4 특잇값 분해 (SVD)

특잇값 분해(SVD)는 행렬 $ \mathbf{A} $를 세 개의 행렬로 분해하는 방법이다:

$$
\mathbf{A} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^T
$$

여기서:

* $ \mathbf{U} $는 좌측 특이 벡터 행렬이다.
* $ \mathbf{\Sigma} $는 대각선에 특잇값이 있는 대각 행렬이다.
* $ \mathbf{V}^T $는 우측 특이 벡터의 전치 행렬이다.

### 5.4.1 SVD의 용도

* **데이터 압축**: 이미지 압축 및 신호 처리에서 데이터의 압축에 사용된다.
* **잡음 제거**: 노이즈가 있는 데이터에서 잡음을 제거하는 데 유용하다.
* **차원 축소**: 고차원 데이터를 저차원으로 변환하여 분석을 용이하게 한다.

### 5.4.2 C++ Eigen3를 이용한 SVD

```cpp
#include <Eigen/Dense>
#include <iostream>

int main() {
    // 행렬 정의
    Eigen::Matrix2d A;
    A << 1, 2,
         3, 4;

    // SVD 분해
    Eigen::JacobiSVD<Eigen::Matrix2d> svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV);

    // 좌측 특이 벡터 U, 대각 행렬 Sigma, 우측 특이 벡터 V 출력
    Eigen::Matrix2d U = svd.matrixU();
    Eigen::Matrix2d Sigma = svd.singularValues().asDiagonal();
    Eigen::Matrix2d V = svd.matrixV();

    std::cout << "U: \n" << U << std::endl;
    std::cout << "Sigma: \n" << Sigma << std::endl;
    std::cout << "V: \n" << V << std::endl;

    return 0;
}
```

이 코드에서는 `JacobiSVD`를 사용하여 행렬 $ \mathbf{A} $의 SVD를 수행하고, `matrixU()`, `singularValues().asDiagonal()`, `matrixV()`를 통해 특잇값 분해의 결과를 출력한다.

## 5.5 고급 응용: 시스템의 안정성 분석

행렬의 고급 분해는 시스템의 안정성 분석에도 활용된다. 시스템의 안정성은 행렬의 고유값을 분석하여 평가할 수 있다. 예를 들어, 선형 동적 시스템의 행렬이 모든 고유값의 실부가 음수인 경우, 시스템은 안정적이라고 판단할 수 있다.

## 5.6 요약

이 장에서는 LU 분해, QR 분해, SVD와 같은 고급 행렬 분해 기법을 소개하고, 이들을 C++ Eigen3를 사용하여 구현하는 방법을 설명하였다. 이러한 분해 기법은 다양한 수치 해석 문제와 데이터 분석 작업에 유용하게 사용된다. 다음 장에서는 행렬의 응용에 대한 구체적인 사례와 실제 문제 해결 방법을 다루겠다.
