선형대수를 건너뛴 개발자를 위한 행렬 수학
Source: Dev.to
행렬과 기본 연산
표현
행렬은 단순히 숫자의 2차원 배열입니다. 예를 들어, 3×3 행렬:
| 1 | 2 | 3 |
|---|---|---|
| 4 | 5 | 6 |
| 7 | 8 | 9 |
JavaScript에서는 다음과 같이 만들 수 있습니다:
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
원소별 덧셈
두 행렬은 차원이 동일해야 합니다.
function add(A, B) {
return A.map((row, i) => row.map((val, j) => val + B[i][j]));
}
행렬 곱셈
곱셈은 원소별이 아닙니다. 결과 행렬의 (i, j) 위치에 있는 원소는 A의 i번째 행과 B의 j번째 열의 내적입니다.
조건: A의 열 수와 B의 행 수가 같아야 합니다. m×n 행렬에 n×p 행렬을 곱하면 m×p 행렬이 됩니다.
function multiply(A, B) {
const rows = A.length;
const cols = B[0].length;
const n = B.length;
const result = Array.from({ length: rows }, () =>
Array(cols).fill(0)
);
for (let i = 0; i
Array.from({ length: n }, (_, j) => (i === j ? 1 : 0))
);
}
전치
행과 열을 뒤바꿉니다; i번째 행이 i번째 열이 됩니다.
function transpose(M) {
return M[0].map((_, j) => M.map(row => row[j]));
}
전치는 머신러닝 파이프라인에서 “특성‑열”과 “특성‑행” 레이아웃을 전환할 때 자주 사용됩니다.
행렬식
정방 행렬의 행렬식은 하나의 숫자로, 가역성(0이 아님) 또는 특이성(0) 여부를 나타냅니다.
2×2 행렬식:
function det2x2(M) {
return M[0][0] * M[1][1] - M[0][1] * M[1][0];
}
일반 행렬식(여인자 전개):
function determinant(M) {
const n = M.length;
if (n === 1) return M[0][0];
if (n === 2) return det2x2(M);
let det = 0;
for (let j = 0; j
[...row.slice(0, j), ...row.slice(j + 1)]
);
det += M[0][j] * determinant(minor) * (j % 2 === 0 ? 1 : -1);
}
return det;
}
실제 적용 사례
CSS 변환
모든 CSS 변환(translate, rotate, scale, skew)은 내부적으로 행렬 연산으로 표현됩니다. 브라우저는 4×4 변환 행렬을 만든 뒤 각 픽셀에 적용합니다.
/* CSS 선언 */
transform: rotate(45deg) scale(1.5) translate(10px, 20px);
/* 내부적으로 계산된 행렬 */
transform: matrix(1.06, 1.06, -1.06, 1.06, -11.21, 25.61);
3D 그래픽
게임 엔진과 3D 렌더러는 카메라 위치 지정, 객체 변환, 3D 세계 공간을 2D 화면 공간으로 투영하기 위해 4×4 행렬을 사용합니다.
머신러닝
신경망은 본질적으로 가중치 행렬을 통한 일련의 행렬 곱셈(비선형 활성화 함수와 교차)으로 구성됩니다. 학습 과정에서 이 가중치 행렬이 조정됩니다.
이미지 처리
컨볼루션 필터(블러, 샤프닝, 에지 검출)는 작은 커널—즉, 로컬 이미지 패치에 곱해지는 행렬—을 사용해 적용됩니다.
편리한 도구
곱셈, 행렬식, 역행렬, 전치, 고유값 등 빠르고 인터랙티브한 계산을 위해 다음 무료 온라인 행렬 계산기를 사용해 보세요: