# 제 1장: 선형 대수의 소개

## 1.1 선형 대수란 무엇인가?

선형 대수는 벡터와 행렬을 이용하여 선형 방정식의 해를 구하고, 벡터 공간의 성질을 연구하는 수학의 한 분야이다. 이 학문은 컴퓨터 그래픽스, 데이터 분석, 기계 학습, 물리학 등 다양한 분야에서 중요한 역할을 한다.

## 1.2 벡터와 행렬의 기초

### 1.2.1 벡터 (Vector)

벡터는 크기와 방향을 가지는 수학적 객체이다. 벡터는 여러 차원의 값을 포함할 수 있으며, 보통 기호 $ \mathbf{v} $로 표시한다. 2차원 벡터는 다음과 같이 쓸 수 있다:

$$
\mathbf{v} = \begin{pmatrix} v\_1 \ v\_2 \end{pmatrix}
$$

여기서 $ v\_1 $과 $ v\_2 $는 벡터의 성분이다. 3차원 벡터는 다음과 같이 표현된다:

$$
\mathbf{v} = \begin{pmatrix} v\_1 \ v\_2 \ v\_3 \end{pmatrix}
$$

### 1.2.2 행렬 (Matrix)

행렬은 숫자들이 직사각형 형태로 배열된 표이다. 행렬은 행(row)과 열(column)의 개수로 정의된다. 예를 들어, 2행 3열의 행렬 $ \mathbf{A} $는 다음과 같이 쓸 수 있다:

$$
\mathbf{A} = \begin{pmatrix} a\_{11} & a\_{12} & a\_{13} \ a\_{21} & a\_{22} & a\_{23} \end{pmatrix}
$$

여기서 $ a\_{ij} $는 행렬의 성분이다. 행렬은 주로 벡터를 변환하거나 연립 방정식을 푸는 데 사용된다.

## 1.3 벡터와 행렬의 연산

### 1.3.1 벡터의 덧셈과 스칼라 곱

벡터의 덧셈과 스칼라 곱은 다음과 같이 정의된다. 두 벡터 $ \mathbf{u} $와 $ \mathbf{v} $의 덧셈은 다음과 같다:

$$
\mathbf{u} + \mathbf{v} = \begin{pmatrix} u\_1 \ u\_2 \end{pmatrix} + \begin{pmatrix} v\_1 \ v\_2 \end{pmatrix} = \begin{pmatrix} u\_1 + v\_1 \ u\_2 + v\_2 \end{pmatrix}
$$

벡터 $ \mathbf{v} $에 스칼라 $ \alpha $를 곱하는 것은 다음과 같이 계산된다:

$$
\alpha \mathbf{v} = \alpha \begin{pmatrix} v\_1 \ v\_2 \end{pmatrix} = \begin{pmatrix} \alpha v\_1 \ \alpha v\_2 \end{pmatrix}
$$

### 1.3.2 행렬의 덧셈과 곱셈

행렬의 덧셈은 두 행렬이 동일한 크기일 때 정의된다. 예를 들어, 두 행렬 $ \mathbf{A} $와 $ \mathbf{B} $의 덧셈은 다음과 같다:

$$
\mathbf{A} + \mathbf{B} = \begin{pmatrix} a\_{11} & a\_{12} \ a\_{21} & a\_{22} \end{pmatrix} + \begin{pmatrix} b\_{11} & b\_{12} \ b\_{21} & b\_{22} \end{pmatrix} = \begin{pmatrix} a\_{11} + b\_{11} & a\_{12} + b\_{12} \ a\_{21} + b\_{21} & a\_{22} + b\_{22} \end{pmatrix}
$$

행렬 곱셈은 행렬의 열 수와 열의 수가 같을 때 정의된다. 예를 들어, $ 2 \times 3 $ 행렬 $ \mathbf{A} $와 $ 3 \times 2 $ 행렬 $ \mathbf{B} $의 곱은 다음과 같다:

$$
\mathbf{C} = \mathbf{A} \mathbf{B}
$$

여기서 $ \mathbf{C} $는 $ 2 \times 2 $ 행렬이다. $ \mathbf{C} $의 성분은 다음과 같이 계산된다:

$$
c\_{ij} = \sum\_{k} a\_{ik} b\_{kj}
$$

이제, C++의 Eigen3 라이브러리를 사용하여 벡터와 행렬 연산을 구현하는 방법을 살펴보겠다.

## 1.4 C++ Eigen3 라이브러리 사용하기

Eigen3은 C++에서 벡터와 행렬 연산을 간편하게 수행할 수 있도록 도와주는 라이브러리이다. 다음은 벡터와 행렬을 사용하는 기본적인 코드 예제이다.

### 1.4.1 벡터 연산 예제

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

int main() {
    // 벡터 정의
    Eigen::Vector2d v1(1.0, 2.0);
    Eigen::Vector2d v2(3.0, 4.0);

    // 벡터 덧셈
    Eigen::Vector2d v3 = v1 + v2;

    std::cout << "v1 + v2 = " << v3.transpose() << std::endl;

    // 스칼라 곱
    Eigen::Vector2d v4 = 2.0 * v1;
    std::cout << "2.0 * v1 = " << v4.transpose() << std::endl;

    return 0;
}
```

### 1.4.2 행렬 연산 예제

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

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

    Eigen::Matrix2d B;
    B << 5, 6,
         7, 8;

    // 행렬 덧셈
    Eigen::Matrix2d C = A + B;
    std::cout << "A + B = \n" << C << std::endl;

    // 행렬 곱셈
    Eigen::Matrix2d D = A * B;
    std::cout << "A * B = \n" << D << std::endl;

    return 0;
}
```

이제 선형 대수의 기초를 이해하고, C++에서 어떻게 벡터와 행렬 연산을 수행할 수 있는지 알게 되었다. 다음 장에서는 벡터 공간과 선형 변환에 대해 자세히 다뤄보겠다.
