ecole42

matrix

matrix는 ecole42의 선형대수학 프로젝트로, TypeScript로 구현된 선형대수학 라이브러리. 벡터와 행렬 연산을 지원하며 실수와 복소수 타입을 모두 지원한다. 벡터 연산(덧셈, 뺄셈, 내적, 노름), 행렬 연산(곱셈, 전치, 행렬식, 역행렬, 랭크), 유틸리티 함수(선형결합, 선형보간, 외적, 투영 행렬) 등을 구현하여 선형대수학의 핵심 개념과 수학적 알고리즘을 학습한다

TypeScript

개요

ecole42의 선형대수학(Linear Algebra) 구현 프로젝트다. 이 프로젝트는 TypeScript로 구현된 선형대수학 라이브러리다. 벡터와 행렬 연산을 지원하며, 실수와 복소수 타입을 모두 지원한다.

주요 기능

Vector (벡터)

  • 덧셈/뺄셈: 같은 크기의 벡터 간 연산
  • 스칼라 곱셈: 벡터에 스칼라 값을 곱하기
  • 내적(Dot Product): 두 벡터의 내적 계산
  • 노름(Norm):
    • norm_1(): 맨하탄 노름 (L1 norm)
    • norm(): 유클리드 노름 (L2 norm)
    • norm_inf(): 최대 노름 (L∞ norm)

Matrix (행렬)

  • 덧셈/뺄셈: 같은 크기의 행렬 간 연산
  • 스칼라 곱셈: 행렬에 스칼라 값을 곱하기
  • 벡터 곱셈: 행렬과 벡터의 곱셈
  • 행렬 곱셈: 두 행렬의 곱셈
  • 전치(Transpose): 행렬의 전치 행렬 계산
  • 행렬식(Determinant): 정사각 행렬의 행렬식 계산
  • 역행렬(Inverse): 가역 행렬의 역행렬 계산
  • 랭크(Rank): 행렬의 랭크 계산
  • 행 사다리꼴 형태(Row Echelon Form): 가우스 소거법을 통한 행 사다리꼴 형태 변환

유틸리티 함수

  • 선형결합(Linear Combination): 여러 벡터의 선형결합 계산
  • 선형보간(Linear Interpolation): 두 값, 벡터, 또는 행렬 사이의 선형보간
  • 각도 코사인(Angle Cosine): 두 벡터 사이의 각도의 코사인 값 계산
  • 외적(Cross Product): 3차원 벡터의 외적 계산
  • 투영 행렬(Projection Matrix): 3D 그래픽스를 위한 투영 행렬 생성

타입 시스템

  • R (Real): 실수 타입
  • C (Complex): 복소수 타입 (예: "2 + 3i" 형식 지원)
  • Field: 실수와 복소수를 추상화한 기본 클래스

설치

pnpm install

개발

개별 연습 문제를 실행하려면:

pnpm run dev src/ex00
pnpm run dev src/ex01
pnpm run dev src/ex02
# ...

테스트

개별 연습 문제를 테스트하려면:

pnpm start src/ex00
pnpm start src/ex01
pnpm start src/ex02
# ...

또는 모든 테스트를 감시 모드로 실행:

pnpm test

빌드

TypeScript 코드를 JavaScript로 컴파일:

pnpm run build

프로젝트 구조

src/
├── ex00/          # 벡터/행렬 덧셈
├── ex01/          # 선형결합
├── ex02/          # 선형보간
├── ex03/          # 내적
├── ex04/          # 노름
├── ex05/          # 각도 코사인
├── ex06/          # 외적
├── ex07/          # 행렬 곱셈
├── ex08/          # 행렬식
├── ex09/          # 역행렬
├── ex10/          # 랭크
├── ex11/          # 복소수 연산
├── ex12/          # 행 사다리꼴 형태
├── ex13/          # 투영 행렬
├── ex14/          # 3D 그래픽스 (추가 프로젝트)
├── ex15/          # 추가 연습 문제들
└── utils/         # 핵심 클래스 및 유틸리티 함수
    ├── Vector.class.ts
    ├── Matrix.class.ts
    ├── Type.class.ts
    ├── linear_combination.ts
    ├── linear_interpolation.ts
    ├── angle_cos.ts
    ├── cross_product.ts
    └── projection.ts

사용 예시

벡터 연산

import { Vector, R } from './utils';

// 벡터 생성
const v1 = Vector.from(R.map([1, 2, 3]));
const v2 = Vector.from(R.map([4, 5, 6]));

// 덧셈
const sum = v1.add(v2); // [5, 7, 9]

// 내적
const dot = v1.dot(v2); // 32

// 노름
const norm = v1.norm(); // 유클리드 노름

행렬 연산

import { Matrix, R } from './utils';

// 행렬 생성
const m1 = Matrix.from(
  R.map2([
    [1, 2],
    [3, 4],
  ]),
);
const m2 = Matrix.from(
  R.map2([
    [5, 6],
    [7, 8],
  ]),
);

// 곱셈
const product = m1.mul_mat(m2);

// 행렬식
const det = m1.determinant();

// 역행렬
const inverse = m1.inverse();

복소수 연산

import { Vector, C } from './utils';

// 복소수 벡터 생성
const v = Vector.from(C.map(['1 + 2i', '3 - 4i', '5i']));

// 연산 수행
const result = v.norm();

기술 스택

  • TypeScript: 타입 안전성을 위한 언어
  • Jest: 테스트 프레임워크
  • Babel: TypeScript 컴파일
  • pnpm: 패키지 관리자