성긴 행렬
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
성긴 행렬은 0이 대부분을 차지하는 행렬을 의미하며, 이러한 행렬의 효율적인 저장 및 연산을 위해 다양한 자료 구조와 알고리즘이 연구된다. 일반적인 2차원 배열 대신, 0이 아닌 값만 저장하여 메모리 사용량을 줄이는 다양한 기법이 사용된다. 이러한 기법에는 DOK, LIL, COO, CSR, CSC, BSR 등이 있으며, 각각 효율적인 수정, 접근, 행렬 연산을 지원한다. 특수한 형태의 성긴 행렬로는 띠 행렬, 대각 행렬, 대칭 희소 행렬, 블록 대각 행렬 등이 있다. 성긴 행렬은 채움 감소, 희소 행렬 방정식 풀이 등에 활용되며, 파일 시스템에서 0으로 이루어진 데이터 섹션을 효율적으로 저장하는 성긴 파일의 개념으로도 사용된다. PETSc, Trilinos, SciPy 등 다양한 소프트웨어 라이브러리에서 성긴 행렬 연산을 지원하며, '성긴 행렬'이라는 용어는 해리 마코위츠에 의해 처음 사용되었을 가능성이 있다.
더 읽어볼만한 페이지
- 성긴 행렬 - 영행렬
영행렬은 환 $R$ 위의 모든 성분이 0인 $m \times n$ 행렬로서, 행렬 공간의 덧셈 항등원 역할을 하고, 임의의 행렬에 곱하면 영행렬이 되며, 선형 변환에서는 모든 벡터를 영벡터로 보내는 변환을 나타낸다. - 성긴 행렬 - 대각 행렬
대각 행렬은 주대각 성분 외 모든 성분이 0인 정사각 행렬로, 대칭 행렬이자 고윳값은 대각 성분이며 대각화 가능하고, 스칼라 행렬은 주대각 성분이 같은 대각 행렬이다. - 수치해석학 - 수학적 최적화
수학적 최적화는 주어진 집합에서 실수 또는 정수 변수를 갖는 함수의 최댓값이나 최솟값을 찾는 문제로, 변수 종류, 제약 조건, 목적 함수 개수에 따라 다양한 분야로 나뉘며 여러 학문 분야에서 활용된다. - 수치해석학 - 선형대수학
선형대수학은 벡터, 벡터 공간, 행렬 등의 개념으로 선형 방정식과 선형 변환을 연구하는 수학 분야로, 선형성을 활용해 행렬로 표현 및 계산하며, 연립일차방정식 해법, 고유값/고유벡터를 통한 행렬 분석, 벡터 공간의 기저와 차원 등을 다루고 물리학, 공학, 컴퓨터 과학 등 다양한 분야에 응용된다. - 표시 이름과 문서 제목이 같은 위키공용분류 - 라우토카
라우토카는 피지 비치레부섬 서부에 위치한 피지에서 두 번째로 큰 도시이자 서부 지방의 행정 중심지로, 사탕수수 산업이 발달하여 "설탕 도시"로 알려져 있으며, 인도에서 온 계약 노동자들의 거주와 미 해군 기지 건설의 역사를 가지고 있고, 피지 산업 생산의 상당 부분을 담당하는 주요 기관들이 위치해 있다. - 표시 이름과 문서 제목이 같은 위키공용분류 - 코코넛
코코넛은 코코넛 야자나무의 열매로 식용 및 유지로 사용되며, 조리되지 않은 과육은 100g당 354kcal의 열량을 내는 다양한 영양 성분으로 구성되어 있고, 코코넛 파우더의 식이섬유는 대부분 불용성 식이섬유인 셀룰로오스이며, 태국 일부 지역에서는 코코넛 수확에 훈련된 원숭이를 이용하는 동물 학대 문제가 있다.
성긴 행렬 | |
---|---|
개요 | |
종류 | 행렬 |
밀도 | 대부분의 원소가 0 |
설명 | |
정의 | 대부분의 원소가 0인 행렬 |
활용 | 희소 행렬은 빅 데이터 분석에 사용될 수 있다. 계산 복잡도를 줄여준다. |
저장 형식 | |
COO (Coordinate List) | 좌표 리스트를 사용한다. |
CSC (Compressed Sparse Column) | 압축된 희소 열을 사용한다. |
CSR (Compressed Sparse Row) | 압축된 희소 행을 사용한다. |
BSR (Block Sparse Row) | 블록 희소 행을 사용한다. |
LIL (List of Lists) | 리스트의 리스트를 사용한다. |
DOK (Dictionary of Keys) | 키의 딕셔너리를 사용한다. |
관련 항목 | |
관련 항목 | 희소 배열 |
2. 성긴 행렬의 자료구조 저장법
성긴 행렬은 대부분의 요소가 0인 행렬을 의미한다. 이러한 행렬을 일반적인 2차원 배열 형태로 저장하면, 0인 값들도 모두 저장해야 하므로 메모리를 비효율적으로 사용하게 된다. 예를 들어 m × n 크기의 행렬을 저장하려면 m × n에 비례하는 메모리 공간이 필요하다.
이러한 비효율성을 피하기 위해, 성긴 행렬에서는 0이 아닌 요소들만 저장하는 다양한 자료구조 저장 방식이 사용된다. 이 방식들은 0이 아닌 요소의 값과 그 위치(행 인덱스 i, 열 인덱스 j) 정보만을 저장하여 메모리 사용량을 크게 줄일 수 있다. 하지만 0이 아닌 요소만 저장하기 때문에 개별 요소에 접근하는 과정이 일반적인 2차원 배열보다 복잡해지며, 원래 행렬을 정확히 복원하기 위한 추가적인 구조 정보가 필요하다는 단점이 있다.
성긴 행렬을 저장하는 형식들은 크게 두 가지 그룹으로 나눌 수 있다.
- 효율적인 수정을 지원하는 형식: 행렬을 구성하거나 특정 요소의 값을 변경하는 작업에 유리하다. 주로 행렬을 만드는 데 사용된다.
- DOK (Dictionary of keys, 키 사전)
- LIL (List of lists, 리스트의 리스트)
- COO (Coordinate list, 좌표 리스트)
- 효율적인 접근 및 행렬 연산을 지원하는 형식: 행렬의 특정 행이나 열에 빠르게 접근하거나 행렬 곱셈 등의 연산을 효율적으로 수행하는 데 유리하다.
- CSR (Compressed Sparse Row, 압축 희소 행)
- CSC (Compressed Sparse Column, 압축 희소 열)
- BSR (Block Sparse Row, 블록 희소 행)
이러한 형식 명칭들은 Netlib[17], Intel Math Kernel Library[18], SciPy와 같은 수치 계산 라이브러리에서 사용되는 것을 기반으로 한다.
2. 1. Dictionary of keys (DOK)
사전식 키(Dictionary of keys, DOK) 방식은 성긴 행렬을 저장하는 방법 중 하나로, 매핑된 연관 배열(딕셔너리)을 사용한다. 이 방식에서는 0이 아닌 행렬 요소의 `(행 번호, 열 번호)` 순서쌍을 키(key)로 사용하고, 해당 위치의 요소 값(ai,j)을 값(value)으로 저장한다.[27] 행렬 요소의 값이 0인 위치에 대한 정보는 저장하지 않음으로써 메모리 사용량을 줄인다.DOK 형식은 특정 순서 없이 임의로 행렬 요소를 추가하거나 수정하기 편리하다는 장점이 있다. 따라서 성긴 행렬을 점진적으로 구성하는 초기 단계에서 유용하게 사용될 수 있다.[4]
하지만 DOK는 키가 특정 순서로 정렬되어 있지 않기 때문에, 행이나 열 순서와 같이 일정한 순서에 따라 0이 아닌 요소들을 반복적으로 접근하거나 탐색하는 작업에는 비효율적이다.[4] 이러한 이유로, 일반적으로 DOK 형식으로 행렬 데이터를 먼저 구성한 뒤, 실제 계산이나 분석 단계에서는 CSR(압축 희소 행)이나 CSC(압축 희소 열)과 같이 접근 및 행렬 연산에 더 최적화된 다른 형식으로 변환하여 사용하는 경우가 많다.[27][4]
DOK는 LIL(리스트의 리스트), COO(좌표 리스트)와 함께 행렬의 효율적인 수정을 지원하는 형식 그룹에 속한다. 이는 CSR, CSC 등 효율적인 접근 및 행렬 연산을 지원하는 형식들과 구분된다.
2. 2. List of lists (LIL)
리스트의 리스트(List of lists영어, '''LIL''')는 행마다 연결 리스트를 생성하고, 해당 리스트 안에 (열, 값)의 튜플을 저장하는 방식이다.[28][5] 일반적으로 각 행의 리스트 내 항목들은 빠른 조회를 위해 열 인덱스 순서대로 정렬된다.[5]LIL 방식은 연결 리스트의 특성상 행렬 요소의 추가와 삭제가 용이하다는 장점이 있다.[28] 따라서 점진적으로 행렬을 구성하는 데 적합한 형식으로 평가받는다.[5]
하지만 CSR이나 CSC 방식과 비교했을 때, 각 리스트 노드에 대한 포인터 등으로 인해 메모리 사용량이 더 많을 수 있다는 단점이 있다.[28]
LIL은 DOK(키 사전), COO(좌표 리스트)와 함께 행렬의 효율적인 수정(편집)을 지원하는 형식 그룹에 속하며, 주로 행렬을 구성하는 단계에서 사용된다.
2. 3. Coordinate list (COO)
Coordinate list|좌표 리스트영어(Coordinate list, '''COO''') 형식은 성긴 행렬에서 0이 아닌 요소들을 저장하는 방식 중 하나이다. 이 방식은 0이 아닌 각 요소를 (행 인덱스, 열 인덱스, 값) 형태의 튜플 목록으로 저장한다.[29][6][19]예를 들어, 다음과 같은 4×4 행렬 A가 있다고 가정해보자.
이 행렬 A를 COO 형식으로 표현하면 0이 아닌 요소들의 값, 행 인덱스, 열 인덱스를 각각의 리스트(또는 배열)에 저장한다. 원본 소스의 예시[19]를 따르면 다음과 같다. (여기서는 1-기반 인덱스를 사용한다.)
값 (A) | 행 인덱스 (IA) | 열 인덱스 (JA) |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
1 | 2 | 4 |
2 | 3 | 1 |
2 | 3 | 4 |
1 | 4 | 4 |
이 (행, 열, 값) 튜플 목록은 특정 요소에 대한 임의 접근 시간을 개선하기 위해 행 인덱스를 기준으로 먼저 정렬하고, 행 인덱스가 같으면 열 인덱스를 기준으로 정렬하는 것이 이상적이다.[29][6] 위 표의 예시는 이미 이 순서대로 정렬되어 있다.
COO 형식은 DOK(키 사전), LIL(리스트의 리스트) 형식과 함께 행렬을 점진적으로 구성하거나 기존 행렬의 요소를 수정하는 데 효율적인 방식으로 분류된다.[29] 특히 0이 아닌 새로운 요소를 추가할 때 목록 끝에 새로운 (행, 열, 값) 튜플을 추가하기만 하면 되므로 구현이 비교적 간단하다. 하지만 특정 행이나 열의 모든 요소에 접근하거나 행렬 곱셈과 같은 연산을 수행할 때는 CSR(압축 희소 행)이나 CSC(압축 희소 열) 형식보다 비효율적일 수 있다.
2. 4. Compressed sparse row (CSR or CRS)
'''압축 희소 행'''(Compressed Sparse Row, '''CSR''') 또는 '''압축 행 저장소'''(Compressed Row Storage, '''CRS''') 방식은 성긴 행렬을 저장하는 형식 중 하나로, 행을 기준으로 0이 아닌 값들을 압축하여 저장한다.[30][31][20] 이 형식은 예일 포맷(Yale format)으로도 알려져 있으며[10], 1967년에 처음 완전한 설명이 나타났다.[7] CSR 형식은 행에 대한 빠른 접근과 행렬-벡터 곱셈 ('''Mx''')에 효율적이다.[7][22]CSR 형식은 ''m'' × ''n'' 크기의 행렬 '''M'''에서 0이 아닌 요소(Non-Zero elements, NNZ)의 개수를 NNZ라고 할 때, 세 개의 1차원 배열을 사용하여 행렬을 표현한다. 일반적으로 0부터 시작하는 인덱스를 사용한다.
1. 값 배열 (V): 행렬에서 0이 아닌 값들을 행 우선 순서(row-major order)로 저장한다. 배열의 길이는 NNZ이다.
2. 열 인덱스 배열 (COL_INDEX): `V` 배열에 저장된 각 값에 해당하는 원래 행렬에서의 열 인덱스를 저장한다. 배열의 길이는 NNZ이다.
3. 행 포인터 배열 (ROW_INDEX): 각 행이 시작되는 `V` 배열과 `COL_INDEX` 배열의 인덱스를 저장한다. 배열의 길이는 ''m'' + 1이다. `ROW_INDEX[i]`는 ''i''번째 행 이전까지의 행들에 포함된 0이 아닌 요소들의 총 개수를 나타낸다. 따라서 ''i''번째 행의 0이 아닌 요소들은 `V`와 `COL_INDEX` 배열에서 `ROW_INDEX[i]`부터 `ROW_INDEX[i+1] - 1`까지의 인덱스에 해당한다. `ROW_INDEX[0]`은 항상 0이며, `ROW_INDEX[m]`은 항상 NNZ이다.[8]
예를 들어, 다음과 같은 4 × 4 행렬이 있다고 가정해보자.
(행렬 표시)
5 0 0 0
0 8 0 0
0 0 3 0
0 6 0 0
이 행렬에는 0이 아닌 요소가 4개(NNZ = 4) 있다. CSR 형식으로 표현하면 다음과 같다. (0부터 시작하는 인덱스 기준)
- `V = [ 5, 8, 3, 6 ]`
- `COL_INDEX = [ 0, 1, 2, 1 ]`
- `ROW_INDEX = [ 0, 1, 2, 3, 4 ]`
- `V`: 0이 아닌 값 5, 8, 3, 6을 순서대로 저장한다.
- `COL_INDEX`: 각 값의 열 인덱스 0, 1, 2, 1을 저장한다.
- `ROW_INDEX`:
- `ROW_INDEX[0] = 0`: 0번째 행 이전에는 0이 아닌 요소가 없다.
- `ROW_INDEX[1] = 1`: 0번째 행에는 0이 아닌 요소가 1개 있다 (`V[0]`). 1번째 행은 `V[1]`부터 시작한다.
- `ROW_INDEX[2] = 2`: 0, 1번째 행까지 0이 아닌 요소가 총 2개 있다 (`V[0]`, `V[1]`). 2번째 행은 `V[2]`부터 시작한다.
- `ROW_INDEX[3] = 3`: 0, 1, 2번째 행까지 0이 아닌 요소가 총 3개 있다 (`V[0]`, `V[1]`, `V[2]`). 3번째 행은 `V[3]`부터 시작한다.
- `ROW_INDEX[4] = 4`: 모든 행에 걸쳐 0이 아닌 요소는 총 4개이다 (NNZ).
특정 행(예: 1번째 행, 즉 두 번째 행)의 데이터를 추출하려면 `ROW_INDEX`를 사용한다.
- 행 시작 인덱스: `row_start = ROW_INDEX[1] = 1`
- 행 끝 인덱스 (다음 행 시작 인덱스): `row_end = ROW_INDEX[2] = 2`
따라서 1번째 행의 데이터는 `V[row_start : row_end]` 즉 `V[1:2] = [8]`이고, 해당 열 인덱스는 `COL_INDEX[row_start : row_end]` 즉 `COL_INDEX[1:2] = [1]`이다. 이를 통해 1번째 행에는 1번 열에 값 8이 있다는 것을 알 수 있다.
다른 예시로 다음 4 × 6 행렬을 보자.
(행렬 표시)
10 20 0 0 0 0
0 30 0 40 0 0
0 0 50 60 70 0
0 0 0 0 0 80
이 행렬은 0이 아닌 요소가 8개(NNZ = 8) 있다. CSR 형식 표현은 다음과 같다.
- `V = [ 10, 20, 30, 40, 50, 60, 70, 80 ]`
- `COL_INDEX = [ 0, 1, 1, 3, 2, 3, 4, 5 ]`
- `ROW_INDEX = [ 0, 2, 4, 7, 8 ]`
- `ROW_INDEX`는 `V` 배열을 각 행별로 구분한다: `(10, 20)`, `(30, 40)`, `(50, 60, 70)`, `(80)`. 각 괄호는 `V`와 `COL_INDEX`에서 해당 행의 시작과 끝 인덱스를 나타낸다.
- `COL_INDEX`는 각 값의 열 위치를 나타낸다.
CSR 형식은 0이 아닌 요소의 수가 `NNZ < (''m''(''n'' − 1) − 1) / 2` 일 때 일반적으로 메모리를 절약할 수 있다. 행 단위의 접근이 매우 빠르다는 장점이 있지만, 특정 열의 모든 요소에 접근하려면 `COL_INDEX` 배열 전체를 탐색해야 하므로 열 접근에는 비효율적이다.[23]
예일 포맷(Yale format)은 CSR 형식의 인스턴스이다.[9] 이 이름은 1977년 예일 대학교 컴퓨터 과학부의 Yale Sparse Matrix Package 보고서에서 제안되었기 때문에 붙여진 것으로 추정된다.[10] 구형 예일 포맷은 위에서 설명한 세 개의 배열(V, COL_INDEX, ROW_INDEX)을 그대로 사용한다. 신형 예일 포맷은 `ROW_INDEX`와 `COL_INDEX`를 하나의 배열로 결합하고 행렬의 대각선 요소를 별도로 처리하기도 한다.[9]
논리적 인접 행렬과 같이 값 자체가 중요하지 않고 연결 유무만 중요한 경우에는 값 배열 `V`를 생략하고 `COL_INDEX`와 `ROW_INDEX`만 사용하여 저장 공간을 더 절약할 수 있다.
2. 5. Compressed sparse column (CSC or CCS)
CSC(압축 희소 열, Compressed Sparse Column영어) 또는 CCS(압축 열 저장, Compressed Column Storage영어)는 희소 행렬을 저장하는 방식 중 하나로[24], CSR(압축 희소 행)과 유사하지만 값을 열 기준으로 압축하여 저장한다. 즉, 행렬의 0이 아닌 값들을 열 우선 순서(위에서 아래로, 왼쪽에서 오른쪽으로)로 나열하고, 각 값에 해당하는 행 인덱스와 각 열이 시작하는 값 배열 내 위치 정보를 함께 저장한다.CSC 형식은 일반적으로 세 개의 배열로 표현된다: ''val'', ''row_ind'', ''col_ptr''.
- ''val'': 행렬에서 0이 아닌 값들을 열 우선 순서로 저장한 배열이다.
- ''row_ind'': ''val'' 배열의 각 값에 해당하는 행 인덱스를 저장한 배열이다.
- ''col_ptr'': 각 열이 시작하는 ''val'' 배열의 인덱스를 저장한 목록이다. 예를 들어, ''col_ptr''[''j'']는 ''j''번째 열의 첫 번째 0이 아닌 값이 ''val'' 배열에서 시작하는 위치를 나타낸다. 목록의 마지막 요소는 일반적으로 ''val'' 배열에 있는 총 0이 아닌 요소의 수를 나타낸다.
이 이름은 COO(좌표 리스트) 형식과 비교했을 때 열 인덱스 정보가 압축되어 저장되기 때문에 붙여졌다. CSC 형식은 LIL(리스트의 리스트) 형식에 비해 메모리 사용량을 줄일 수 있다는 장점이 있지만, 행렬 요소의 추가나 삭제가 쉽지 않다는 단점이 있다. 이 때문에 행렬을 처음 구성할 때는 DOK(키 사전), LIL, COO와 같이 수정이 용이한 형식을 사용하고, 이후 효율적인 계산을 위해 CSC 형식으로 변환하는 경우가 많다.
CSC 형식은 산술 연산, 열 슬라이싱, 행렬-벡터 곱셈과 같은 연산에 효율적이다. 이러한 장점으로 인해 MATLAB에서 `sparse` 함수를 통해 희소 행렬을 지정하는 전통적인 방식으로 사용된다. 또한 Netlib[17], Intel Math Kernel Library[18], SciPy 등 여러 수치 계산 라이브러리에서도 이 형식을 지원한다.
2. 6. Block Compressed Row Storage (BCRS or BSR)
블록 압축 행 저장(Block Compressed Row Storage, BCRS) 형식은 CRS를 블록 단위로 나눈 것이다. 다른 이름으로는 Block Sparse Row ('''BSR''') 형식[25]이 있다.3. 특수한 경우
성긴 행렬 중에는 특정한 구조를 가져서 저장 공간을 절약하거나 계산 속도를 높이는 등 더 효율적으로 다룰 수 있는 경우가 있다. 이러한 행렬들은 특정 문제 해결에 유용하게 사용된다. 대표적인 예로는 띠 행렬, 대각 행렬, 대칭 희소 행렬, 블록 대각 행렬 등이 있으며, 각각의 구조적 특징을 활용하여 최적화된 알고리즘을 적용할 수 있다.
3. 1. 띠 행렬 (Banded Matrix)
성긴 행렬의 중요한 특수한 유형 중 하나는 '''띠 행렬(Banded Matrix)'''이다. 행렬 '''A'''의 하단 대역폭은 ''i'' > ''j'' + ''p''일 때마다 항목 ''a''''i'',''j''가 0이 되는 가장 작은 수 ''p''를 의미한다. 비슷하게, 상단 대역폭은 ''i'' < ''j'' − ''p''일 때마다 ''a''''i'',''j'' = 0이 되는 가장 작은 수 ''p''이다. 예를 들어, 삼각 행렬은 하단 대역폭과 상단 대역폭이 모두 1이다.하단 및 상단 대역폭이 모두 3인 희소 행렬의 예시는 다음과 같다. 이 행렬은 주대각선을 중심으로 위아래로 3칸 내에만 0이 아닌 값(X로 표시)이 존재하고, 그 외의 위치(점으로 표시)는 모두 0이다.
상단 및 하단 대역폭이 비교적 작은 행렬을 띠 행렬이라고 부른다. 띠 행렬은 일반적인 희소 행렬보다 더 간단한 알고리즘을 적용할 수 있으며, 때로는 밀집 행렬 알고리즘을 적용하면서 인덱스 수를 줄여 효율성을 높일 수도 있다.
행렬 '''A'''의 행과 열을 재정렬하여 하단 대역폭이 더 작은 행렬 '''A'''′을 얻는 것도 가능하다. 이러한 대역폭 최소화를 위한 여러 알고리즘이 개발되어 있다.
3. 1. 1. 대각 행렬 (Diagonal Matrix)
띠 행렬의 극단적인 형태인 '''대각 행렬'''은 주대각선 상의 요소만 값을 가지고 나머지 요소는 모두 0인 행렬이다. 이러한 구조 덕분에 주대각선의 항목만을 1차원 배열로 저장하는 매우 효율적인 방식이 가능하다. 따라서 ''n'' × ''n'' 크기의 대각 행렬은 단지 ''n''개의 항목만 저장하면 된다.3. 2. 대칭 희소 행렬 (Symmetric Sparse Matrix)
대칭 희소 행렬은 주대각선을 기준으로 원소들이 대칭적인 성긴 행렬이다. 즉, i행 j열의 원소와 j행 i열의 원소가 같다. 이러한 행렬은 무향 그래프의 인접 행렬로 나타낼 수 있으며, 인접 리스트를 사용하면 효율적으로 저장할 수 있다.3. 3. 블록 대각 행렬 (Block Diagonal Matrix)
블록 대각 행렬은 주대각선을 따라 여러 개의 작은 정사각 행렬 블록들이 위치하고, 그 외의 모든 요소는 0인 행렬을 말한다. 블록 대각 행렬 는 다음과 같은 형식을 갖는다.여기서 는 ''k'' = 1, ..., ''n''에 대해 모두 정사각 행렬이다. 이러한 구조 덕분에 각 블록 행렬 는 서로 독립적으로 연산하거나 분석할 수 있다.
4. 활용
성긴 행렬은 0이 아닌 요소가 매우 적다는 특성 때문에 다양한 계산 문제에서 효율적으로 사용된다. 특히 대규모 행렬 연산 과정에서 발생하는 채움(fill-in) 현상, 즉 원래 0이었던 항목이 계산 중에 0이 아닌 값으로 변하는 것을 최소화하여 메모리 사용량과 계산 시간을 절약하는 데 중요한 역할을 한다. 이를 위해 행렬의 구조를 분석하고 행과 열의 순서를 바꾸는 등의 최적화 기법들이 연구되고 있다. (채움 감소 참조)
또한, 수치해석학이나 과학 컴퓨팅 분야에서 자주 등장하는, 성긴 행렬을 포함하는 대규모 선형 방정식 시스템을 푸는 데 효과적으로 활용된다. 반복법이나 직접법과 같은 다양한 알고리즘이 성긴 행렬의 특성을 이용하여 개발되었으며, 이는 문제 해결의 효율성을 크게 높인다. (희소 행렬 방정식 풀이 참조)
4. 1. 채움 감소 (Reducing fill-in)
행렬 연산 과정에서 원래 0이었던 항목이 알고리즘 실행 중에 0이 아닌 값으로 바뀌는 현상을 채움(fill-in)이라고 한다. 채움이 많이 발생하면 알고리즘 실행에 필요한 메모리 양과 계산량이 늘어나게 된다. 따라서 연산 효율을 높이기 위해 채움을 최소화하는 것이 중요하며, 이를 위해 행렬의 행과 열 순서를 적절히 바꾸는 방법을 사용할 수 있다.기호적 촐레스키 분해는 실제 촐레스키 분해를 수행하기 전에 발생할 수 있는 최악의 채움 정도를 미리 계산하는 데 사용될 수 있다.
촐레스키 분해 외에도 다른 방법들이 사용된다. 예를 들어, 최소 자승법 문제를 풀 때는 QR 분해와 같은 직교화 방법이 자주 사용된다. 이론적으로 발생하는 채움의 양은 같을 수 있지만, 실제 계산 과정에서 나타나는 "가짜 0이 아닌 값"(실제로는 0에 가깝지만 계산 오류 등으로 0이 아닌 값으로 처리되는 경우)은 사용하는 방법에 따라 달라질 수 있다. 이러한 다른 알고리즘들의 기호적 버전 역시 기호적 촐레스키 분해와 마찬가지로 최악의 경우 발생할 수 있는 채움을 계산하는 데 사용될 수 있다.
4. 2. 희소 행렬 방정식 풀이 (Solving sparse matrix equations)
희소 행렬을 포함하는 선형 방정식 시스템을 푸는 방법에는 크게 반복법과 직접법 두 가지 방식이 존재한다.공액 기울기법이나 GMRES(Generalized Minimal Residual method)와 같은 반복법은 행렬 A가 희소 행렬일 때, 행렬-벡터 곱셈 A xi을 효율적으로 빠르게 계산할 수 있다는 장점을 활용한다. 이러한 반복법의 계산 속도, 즉 수렴 속도를 더욱 높이기 위해 전처리자를 사용하기도 한다.
5. 성긴 파일 (Sparse File)
성긴 파일은 파일 내부에 0으로만 채워진 큰 영역이 있을 경우, 디스크 공간을 절약하기 위해 사용하는 파일 형식이다. NTFS 파일 시스템에서는 파일에 '성긴(sparse)' 속성을 지정할 수 있는데, 이 경우 NTFS는 실제 데이터가 기록된 부분에 대해서만 디스크 공간(클러스터)을 할당한다. 데이터가 기록되지 않은 빈 영역은 디스크 공간을 차지하지 않는다.
성긴 파일에서 데이터가 실제로 저장된 부분을 읽으면 해당 데이터가 반환된다. 반면, 데이터가 없는 부분을 읽으면 0이 반환된다. 예를 들어, 윈도우의 인덱싱 서비스는 NTFS 볼륨에 생성하는 목록을 성긴 파일 형태로 저장한다.
파일 시스템 API는 성긴 파일을 복사하거나, 파일 내에서 실제 데이터가 있는 부분과 비어 있는(성긴) 부분을 구분하여 접근하는 기능을 제공한다. 또한, 파일 내 어느 영역에 데이터가 할당되어 있는지 조회할 수도 있다. 이 API를 활용하면 프로그램은 실제 데이터가 저장된 부분만 읽어서 전체 파일 내용을 복원할 수 있다. 이를 통해 디스크 공간을 효율적으로 사용하고 파일 접근 속도를 높일 수 있다.
6. 소프트웨어
성긴 행렬 연산 및 관련 선형 시스템 해법을 지원하는 다양한 오픈 소스 소프트웨어 라이브러리가 존재한다.
라이브러리 | 주요 특징 | 주요 언어 |
---|---|---|
PETSc | 다양한 행렬 저장 형식과 해법을 포함하는 대규모 라이브러리 | C |
Trilinos | 조밀 행렬 및 성긴 행렬 저장과 선형 시스템 해법에 특화된 하위 라이브러리를 갖춘 대규모 라이브러리 | C++ |
Eigen3 | 여러 성긴 행렬 해법을 포함하지만, 병렬화는 지원하지 않음 | C++ |
MUMPS | 전면 해법(Multifrontal Massively Parallel sparse direct Solver) 기반의 라이브러리 | Fortran90 |
deal.II | 성긴 선형 시스템과 해법을 위한 하위 라이브러리를 갖춘 유한 요소 라이브러리 | C++ |
DUNE | 성긴 선형 시스템과 해법을 위한 하위 라이브러리를 갖춘 또 다른 유한 요소 라이브러리 | C++ |
Armadillo | BLAS 및 LAPACK를 위한 사용자 친화적인 래퍼 제공 | C++ |
SciPy | 여러 성긴 행렬 형식, 선형 대수 및 해법 지원 | 파이썬 |
ALGLIB | 성긴 선형 대수 지원 | C++, C# |
ARPACK | 아놀디 알고리즘을 사용한 성긴 행렬 대각화 및 조작 | Fortran 77 |
SLEPc | 대규모 선형 시스템 및 성긴 행렬 해법 지원 | C |
scikit-learn | 기계 학습 라이브러리로, 성긴 행렬 및 해법 지원 | 파이썬 |
https://docs.julialang.org/en/v1/stdlib/SparseArrays/ SparseArrays | 줄리아 표준 라이브러리 | 줄리아 |
PSBLAS | GPU 지원, 여러 형식을 지원하는 성긴 선형 시스템 해결 툴킷 | C++, Fortran |
7. 역사
'성긴 행렬'이라는 용어는 선구적인 연구를 시작했지만 이후 이 분야를 떠난 해리 마코위츠에 의해 만들어졌을 가능성이 있다.[11]
참조
[1]
간행물
2017 IEEE 17th International Conference on Communication Technology (ICCT)
IEEE
[2]
웹사이트
Cerebras Systems Unveils the Industry's First Trillion Transistor Chip
https://www.business[...]
2019-08-19
[3]
간행물
Argonne National Laboratory Deploys Cerebras CS-1, the World's Fastest Artificial Intelligence Computer {{!}} Argonne National Laboratory
https://www.anl.gov/[...]
[4]
문서
scipy.sparse.dok_matrix
http://docs.scipy.or[...]
[5]
문서
scipy.sparse.lil_matrix
http://docs.scipy.or[...]
[6]
문서
scipy.sparse.coo_matrix
http://docs.scipy.or[...]
[7]
간행물
Parallel sparse matrix-vector and matrix-transpose-vector multiplication using compressed sparse blocks
https://people.eecs.[...]
[8]
서적
SIAM
[9]
간행물
Sparse Matrix Multiplication Package (SMMP)
http://www.mgnet.org[...]
[10]
웹사이트
Yale Sparse Matrix Package
https://apps.dtic.mi[...]
1977-04
[11]
기타
Oral history interview with Harry M. Markowitz
http://purl.umn.edu/[...]
[12]
간행물
An efficient sparse-dense matrix multiplication on a multicore system
IEEE
[13]
뉴스
Argonne National Laboratory Deploys Cerebras CS-1, the World’s Fastest Artificial Intelligence Computer {{!}} Argonne National Laboratory
https://www.anl.gov/[...]
2019-12-02
[14]
웹사이트
Cerebras Systems Unveils the Industry's First Trillion Transistor Chip
https://www.business[...]
2019-08-19
[15]
웹사이트
プロセッサ開発のセンス ~第4回 ベクトル・プロセッサ~ {{!}} 株式会社エヌエスアイテクス (NSITEXE,Inc.)
https://www.nsitexe.[...]
2023-02-22
[16]
문서
疎行列にアクセスする際に行われる、巨大な配列データを大域的にインデックス参照で引いてくるランダムメモリアクセスを多用する操作は、一般的なスカラ型の[[CPU]]やGPGPUにとっては苦手な処理である。
[17]
문서
Survey of Sparse Matrix Storage Formats
http://netlib.org/li[...]
[18]
문서
Intel® MKL Sparse BLAS Overview | Intel® Developer Zone
https://software.int[...]
[19]
문서
scipy.sparse.coo_matrix
https://docs.scipy.o[...]
[20]
문서
scipy.sparse.csr_matrix
https://docs.scipy.o[...]
[21]
문서
csr_matrix((data, indices, indptr) ... is the standard CSR representation where the column indices for row i are stored in indices[indptr[i]:indptr[i+1]]
and their corresponding values are stored in data[indptr[i]:indptr[i+1]]
.
https://docs.scipy.o[...]
[22]
문서
Advantages of the CSR format ... efficient row slicing
https://docs.scipy.o[...]
[23]
문서
Disadvantages of the CSR format slow column slicing operations
https://docs.scipy.o[...]
[24]
문서
scipy.sparse.csc_matrix
https://docs.scipy.o[...]
[25]
문서
scipy.sparse.bsr_matrix
https://docs.scipy.o[...]
[26]
문서
매스월드
http://mathworld.wol[...]
[27]
문서
scipy.sparse.dok_matrix
http://docs.scipy.or[...]
[28]
문서
scipy.sparse.lil_matrix
http://docs.scipy.or[...]
[29]
문서
scipy.sparse.coo_matrix
http://docs.scipy.or[...]
[30]
문서
www.netlib.org
http://netlib.org/li[...]
[31]
인용
Sparse Matrix Multiplication Package (SMMP)
http://www.mgnet.org[...]
2017-11-29
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com