개요
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: 패키지 관리자