Main Content

희소 행렬 생성하기

희소 행렬 만들기

MATLAB®은 희소 행렬을 절대 자동으로 만들지 않습니다. 대신, 행렬에 희소 행렬 기법의 이점을 누릴 수 있을 정도로 충분히 많은 0이 포함되어 있는지 사용자가 직접 판단해야 합니다.

행렬의 밀도는 0이 아닌 요소의 개수를 행렬 요소의 총 개수로 나눈 값입니다. 행렬 M에 대해 밀도는 다음과 같습니다.

nnz(M) / prod(size(M));
또는
nnz(M) / numel(M);

밀도가 매우 낮은 행렬은 희소 형식을 사용하기에 적합한 경우가 많습니다.

비희소 행렬(Full Matrix)을 희소 행렬로 변환하기

sparse 함수를 단일 인수와 함께 사용하여 비희소 행렬을 희소 저장 형식으로 변환할 수 있습니다.

예를 들면 다음과 같습니다.

A = [ 0   0   0   5
      0   2   0   0
      1   3   0   0
      0   0   4   0];
S = sparse(A)
 S =
     
   (3,1)        1
   (2,2)        2
   (3,2)        3
   (4,3)        4
   (1,4)        5

인쇄된 출력물에는 S의 0이 아닌 요소와 함께 해당 행 인덱스와 열 인덱스가 나열됩니다. 이러한 요소는 내부 데이터 구조를 반영하여 열을 기준으로 정렬됩니다.

행렬 차수가 너무 크지 않은 경우 full 함수를 사용하여 희소 행렬을 비희소 저장 형식으로 변환할 수 있습니다. 예를 들어, A = full(S)는 예제를 반대로 변환합니다.

비희소 행렬을 희소 저장 형식으로 변환하는 것이 가장 흔한 희소 행렬 생성 방법은 아닙니다. 비희소 저장 형식이 가능할 만큼 행렬 차수가 충분히 작은 경우에는, 희소 저장 형식으로 변환해도 대개 큰 공간 절약 효과가 나타나지 않습니다.

희소 행렬 직접 만들기

sparse 함수에 5개의 인수를 사용하여 0이 아닌 요소 목록에서 희소 행렬을 만들어 낼 수 있습니다.

S = sparse(i,j,s,m,n)

ij는 각각 행렬에서 0이 아닌 요소에 대한 행 인덱스와 열 인덱스의 벡터입니다. s는 대응되는 (i,j) 쌍으로 인덱스가 지정된 0이 아닌 값으로 구성된 벡터입니다. m은 결과로 반환되는 행렬의 행 차원이고, n은 열 차원입니다.

앞의 예제에 나와 있는 행렬 S는 다음을 사용하여 직접 생성할 수 있습니다.

S = sparse([3 2 3 4 1],[1 2 2 3 4],[1 2 3 4 5],4,4)
S =

   (3,1)        1
   (2,2)        2
   (3,2)        3
   (4,3)        4
   (1,4)        5

sparse 명령에는 여러 가지 대체 형식이 있습니다. 위의 예제에서는 행렬에서 0이 아닌 요소의 최대 개수를 length(s)로 설정하는 형식을 사용합니다. 원하는 경우, 더 큰 최댓값을 지정하는 6번째 인수를 추가할 수 있습니다. 이를 통해 나중에 희소 행렬을 재할당하지 않고 0이 아닌 요소를 추가할 수 있습니다.

두 번째 차분 연산자의 행렬 표현은 희소 행렬에 대한 좋은 예입니다. 이는 대각선에는 -2, 상부대각선 및 하부대각선에는 1이 포함된 삼중대각 행렬입니다. 이 행렬을 생성할 수 있는 방법은 많이 있습니다. 다음은 그 중의 한 예입니다.

n = 5;
D = sparse(1:n,1:n,-2*ones(1,n),n,n);
E = sparse(2:n,1:n-1,ones(1,n-1),n,n);
S = E+D+E'
S =

   (1,1)       -2
   (2,1)        1
   (1,2)        1
   (2,2)       -2
   (3,2)        1
   (2,3)        1
   (3,3)       -2
   (4,3)        1
   (3,4)        1
   (4,4)       -2
   (5,4)        1
   (4,5)        1
   (5,5)       -2

이제, F = full(S)는 대응되는 비희소 행렬을 표시합니다.

F = full(S)
F =

    -2     1     0     0     0
     1    -2     1     0     0
     0     1    -2     1     0
     0     0     1    -2     1
     0     0     0     1    -2

대각선 요소에서 희소 행렬 만들기

대각선 요소를 기반으로 하여 희소 행렬을 만드는 것은 일반적인 작업이므로, 함수 spdiags로 이 작업을 처리할 수 있습니다. 구문은 다음과 같습니다.

S = spdiags(B,d,m,n)

p 대각선의 요소를 사용하여 크기가 m×n인 출력 행렬 S를 만들려는 경우:

  • B는 크기가 min(m,n)×p인 행렬입니다. B의 열은 S의 대각선상의 요소를 채우는 값입니다.

  • d는 해당 정수 요소가 S에서 값을 채울 대각선 요소를 지정하는, 길이가 p인 벡터입니다.

즉, Bj열에 포함된 요소는 d의 요소 j로 지정되는 대각선을 채웁니다.

참고

B의 열이 대체하는 대각선보다 긴 경우, 상부대각선은 B의 열 하부에서 취하고 하부대각선은 B의 열 상부에서 취합니다.

이에 대한 예로, 행렬 B와 벡터 d를 고려해 보겠습니다.

B = [ 41    11     0
      52    22     0
      63    33    13
      74    44    24 ];

d = [-3
      0
      2];

다음 행렬을 사용하여 7×4 희소 행렬 A를 만듭니다.

A = spdiags(B,d,7,4)
A =

   (1,1)       11
   (4,1)       41
   (2,2)       22
   (5,2)       52
   (1,3)       13
   (3,3)       33
   (6,3)       63
   (2,4)       24
   (4,4)       44
   (7,4)       74

비희소 행렬 형식에서 A는 다음과 같습니다.

full(A)
ans =

    11     0    13     0
     0    22     0    24
     0     0    33     0
    41     0     0    44
     0    52     0     0
     0     0    63     0
     0     0     0    74

spdiags는 희소 행렬에서 대각선 요소를 추출하거나 행렬의 대각선 요소를 새 값으로 대체할 수도 있습니다. 자세한 내용을 보려면 help spdiags를 입력하십시오.

희소 행렬 가져오기

MATLAB 환경 외부에서 수행한 계산에서 희소 행렬을 가져올 수 있습니다. spconvert 함수를 load 명령과 함께 사용하여 인덱스와 0이 아닌 요소로 구성된 목록을 포함하는 텍스트 파일을 가져올 수 있습니다. 예를 들어, 첫 번째 열이 행 인덱스 목록이고, 두 번째 열이 열 인덱스 목록이며, 세 번째 열이 0이 아닌 값 목록인 3열 텍스트 파일 T.dat가 있다고 가정해 보겠습니다. 다음 명령문은 T.dat를 MATLAB으로 불러온 후 희소 행렬 S로 변환합니다.

load T.dat
S = spconvert(T)

save 명령과 load 명령은 MAT 파일에 이진 데이터로 저장된 희소 행렬을 처리할 수도 있습니다.

참고 항목

|

관련 항목