# C++ Eigen3 구현 예제

Eigen 라이브러리는 C++에서 행렬 및 벡터 연산을 위한 매우 강력한 도구이다. `Eigen3`는 다양한 행렬 연산과 노름 계산을 지원한다. 여기서는 간단한 예제를 통해 Eigen 라이브러리를 사용하여 행렬의 다양한 노름을 계산하는 방법을 보여드리겠다.

#### 예제: Eigen을 사용한 행렬 노름 계산

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

int main() {
    // Eigen 라이브러리를 사용하는 간단한 예제

    // 3x3 행렬 A를 정의한다.
    Eigen::Matrix3d A;
    A << 1, 2, 3,
         4, 5, 6,
         7, 8, 9;

    // 1-노름 (열의 최대 절대값 합) 계산
    double norm1 = A.colwise().lpNorm<1>().maxCoeff();
    std::cout << "1-노름: " << norm1 << std::endl;

    // ∞-노름 (행의 최대 절대값 합) 계산
    double normInf = A.rowwise().lpNorm<1>().maxCoeff();
    std::cout << "∞-노름: " << normInf << std::endl;

    // Frobenius 노름 계산
    double normFro = A.norm();
    std::cout << "Frobenius 노름: " << normFro << std::endl;

    // 스펙트럴 노름 (2-노름, 최대 특이값) 계산
    double normSpectral = A.jacobiSvd().singularValues().maxCoeff();
    std::cout << "스펙트럴 노름: " << normSpectral << std::endl;

    return 0;
}
```

#### 코드 설명

1. **행렬 정의**:
   * `Eigen::Matrix3d` 타입을 사용하여 3x3 행렬 `A`를 정의한다.
   * `A << 1, 2, 3, 4, 5, 6, 7, 8, 9;` 구문을 통해 행렬을 초기화한다.
2. **1-노름 계산**:
   * `colwise().lpNorm<1>()`를 사용하여 각 열의 1-노름을 계산하고, `maxCoeff()`로 최대값을 가져온다.
3. **∞-노름 계산**:
   * `rowwise().lpNorm<1>()`를 사용하여 각 행의 1-노름(사실상 ∞-노름)을 계산하고, `maxCoeff()`로 최대값을 가져온다.
4. **Frobenius 노름 계산**:
   * `A.norm()`를 사용하여 행렬의 Frobenius 노름을 계산한다.
5. **스펙트럴 노름 계산**:
   * `jacobiSvd()`를 사용하여 행렬의 SVD를 수행하고, `singularValues().maxCoeff()`로 최대 특이값을 얻어 스펙트럴 노름을 계산한다.

#### 컴파일 방법

이 코드를 컴파일하려면 `Eigen3` 라이브러리를 설치해야 한다. 컴파일 명령은 다음과 같다.

```bash
g++ -I /usr/include/eigen3 -o norm_example norm_example.cpp
```

여기서 `/usr/include/eigen3`는 Eigen 라이브러리가 설치된 경로이다. 경로는 시스템에 따라 다를 수 있다.

이렇게 하면 `norm_example` 실행 파일이 생성되며, 실행하면 행렬의 다양한 노름 값이 출력된다.
