다차원 배열을 다룰 때 row-major
와 column-major
는 필수 개념입니다.
이 차이는 단순한 순서 문제가 아니라 내부 저장 방식, 성능 최적화, 그리고 언어/라이브러리 간 호환성에 큰 영향을 미칩니다.
개념 | 설명 |
---|---|
Row-major | 행 우선 저장: 한 행의 데이터가 메모리에 연속 저장 |
Column-major | 열 우선 저장: 한 열의 데이터가 메모리에 연속 저장 |
아래 2×3 배열을 예로 들어보겠습니다.
A = [[1, 2, 3],
[4, 5, 6]]
[1, 2, 3, 4, 5, 6]
A[0][0], A[0][1], A[0][2], A[1][0], A[1][1], A[1][2]
사용 예: C/C++, PyTorch, NumPy(기본)
[1, 4, 2, 5, 3, 6]
A[0][0], A[1][0], A[0][1], A[1][1], A[0][2], A[1][2]
사용 예: Fortran, MATLAB, VTK, Eigen
언어/라이브러리 | 저장 방식 |
---|---|
C/C++, PyTorch, NumPy (기본) | Row-major |
Fortran, MATLAB, VTK, Eigen (기본) | Column-major |
NumPy (order='F' ) | Column-major 전환 가능 |
PyTorch (.permute(...) ) | 수동 제어 가능 |
캐시 적중률에 따라 반복문의 효율성이 달라집니다.
VTK, Eigen 등 column-major 기반 라이브러리와 데이터를 주고받을 때는 저장 순서 변환이 필요합니다.
transpose
, reshape
, order='F'
활용 필수!int index = row * num_cols + col;
int index = col * num_rows + row;
항목 | Row-major | Column-major |
---|---|---|
저장 우선 순서 | 행 우선 | 열 우선 |
메모리 순서 | A[0][0], A[0][1], A[1][0], ... | A[0][0], A[1][0], A[0][1], ... |
사용 예 | C/C++, PyTorch | Fortran, VTK, Eigen |
성능 최적화 | 반복문 순서와 일치해야 효율적 | 동일 |