Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

sparse

희소 행렬 생성

설명

S = sparse(A)는 모든 0 요소를 제거하여 비희소 행렬(Full Matrix)을 희소 형식으로 변환합니다. 행렬에 0이 많이 포함되어 있는 경우 행렬을 희소 형식으로 변환하면 메모리가 절약됩니다.

예제

S = sparse(m,n)은 행렬의 모든 요소가 0인 희소 형식의 m×n 행렬을 생성합니다.

예제

S = sparse(i,j,v)S(i(k),j(k)) = v(k)를 만족하는 세 값 i, j, v에서 희소 행렬 S를 생성합니다. max(i)×max(j) 출력 행렬에는 length(v) 개수의 0이 아닌 요소에 할당된 공간이 있습니다.

입력 인수 i, j, v가 벡터나 행렬인 경우, 요소 개수가 서로 동일해야 합니다. 또는, 인수 v 및/또는 인수 ij 중 하나가 스칼라일 수 있습니다.

예제

S = sparse(i,j,v,m,n)S의 크기를 m×n으로 지정합니다.

예제

S = sparse(i,j,v,m,n,nz)nz 개수의 0이 아닌 요소에 대해 공간을 할당합니다. 희소 행렬 생성 후에 채우고자 하는 0이 아닌 값에 대한 여유 공간을 할당하려면 이 구문을 사용하십시오.

예제

예제

모두 축소

10,000×10,000 크기의 비희소 형식으로 저장된 단위 행렬을 만듭니다.

A = eye(10000);
whos A
  Name          Size                   Bytes  Class     Attributes

  A         10000x10000            800000000  double              

이 행렬은 800메가바이트의 메모리를 사용합니다.

행렬을 희소 형식으로 변환합니다.

S = sparse(A);
whos S
  Name          Size                Bytes  Class     Attributes

  S         10000x10000            240008  double    sparse    

희소 형식에서는 같은 행렬이 약 0.25메가바이트의 메모리를 사용합니다. 이 경우, 희소 단위 행렬을 직접 생성하는 speye 함수를 사용하여 비희소 저장을 완전히 방지할 수 있습니다.

S = sparse(10000,5000)
S = 
   All zero sparse: 10000x5000

세 개의 값 i, j, v에서 1500×1500 크기의 희소 행렬을 만듭니다.

i = [900 1000];
j = [900 1000];
v = [10 100];
S = sparse(i,j,v,1500,1500)
S = 
 (900,900)     10
(1000,1000)   100

크기를 max(i)×max(j)보다 크게 지정할 경우 sparse 함수는 0으로 이루어진 추가 행과 열로 출력값을 채웁니다.

size(S)
ans = 1×2

        1500        1500

0이 아닌 값이 10개뿐이지만, 0이 아닌 값 100개를 위한 공간이 할당된 희소 행렬을 만듭니다.

S = sparse(1:10,1:10,5,20,20,100);
N = nnz(S)
N = 10
N_alloc = nzmax(S)
N_alloc = 100

spalloc 함수는 0이 아닌 요소가 없지만 0이 아닌 요소에 대해 할당된 공간이 있는 희소 행렬을 간단히 만들 수 있는 방법입니다.

하나 이상의 루프를 사용하지 않으면 누적할 수 없는 값을 반복 첨자를 사용하여 단일 희소 행렬에 누적합니다.

데이터로 구성된 열 벡터와 첨자로 구성된 두 개의 열 벡터를 만듭니다.

i = [6 6 6 5 10 10 9 9]';
j = [1 1 1 2 3 3 10 10]';
v = [100 202 173 305 410 550 323 121]';

첨자와 값을 나란히 시각화합니다.

[i,j,v]
ans = 8×3

     6     1   100
     6     1   202
     6     1   173
     5     2   305
    10     3   410
    10     3   550
     9    10   323
     9    10   121

sparse 함수를 사용하여 동일한 첨자를 가진 값을 누적합니다.

S = sparse(i,j,v)
S = 
   (6,1)      475
   (5,2)      305
  (10,3)      960
   (9,10)     444

입력 인수

모두 축소

입력 행렬로, 비희소 행렬이나 희소 행렬로 지정됩니다. A가 이미 희소 행렬이면 sparse(A)A를 반환합니다.

데이터형: double | logical
복소수 지원 여부:

첨자 쌍으로, 스칼라, 벡터, 행렬 중 하나의 개별 인수로 지정됩니다. ij에서 서로 대응하는 요소는 출력값에서 v 값의 배치를 결정하는 S(i,j) 첨자 쌍을 지정합니다. ij는 동일한 데이터형이어야 합니다. ij 중 하나가 벡터 또는 행렬인 경우, 다른 입력값은 스칼라이거나 동일한 개수의 요소를 갖는 벡터나 행렬일 수 있습니다. 이 경우, sparsei(:)j(:)을 첨자로 사용합니다.

ijv의 여러 요소에 대해 동일한 값을 갖는 경우 sparse는 반복된 인덱스가 있는 v의 값을 집계합니다. 집계 동작은 v에 있는 값의 데이터형에 따라 달라집니다.

  • 논리값의 경우 sparseany 함수를 적용합니다.

  • double형 값의 경우 sparsesum 함수를 적용합니다.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

값으로, 스칼라, 벡터, 행렬 중 하나로 지정됩니다. v가 벡터나 행렬이면 입력 인수 ij 중 하나도 동일한 개수의 요소를 갖는 벡터나 행렬이어야 합니다.

v에서 0인 요소는 모두 무시되며, 이에 대응하는 ij 내의 첨자도 마찬가지로 무시됩니다. 그러나 출력값의 차원 크기 mn을 지정하지 않으면 sparse는 최댓값 m = max(i)n = max(j)를 계산한 후 v의 0 요소를 무시합니다.

데이터형: double | logical
복소수 지원 여부:

각 차원의 크기로, 정수 값으로 구성된 개별 인수로 지정됩니다. m(행 크기)을 지정할 경우 n(열 크기)도 지정해야 합니다.

mn을 지정하지 않으면 sparse는 디폴트 값 m = max(i)n = max(j)를 사용합니다. 이러한 최댓값은 v의 0을 제거하기 전에 계산됩니다.

데이터형: double

0이 아닌 요소에 저장 공간을 할당하는 것으로, 이러한 요소의 개수 nz는 음이 아닌 정수로 지정되며 일반적으로 max([numel(i), numel(j), numel(v), 1])보다 크거나 같아야 합니다. 그러나 i, j, v의 크기에서 nz에 값 0을 지정하는 게 가능한 경우 sparse는 대신 값을 1로 설정합니다.

희소 행렬 S에 대해 nnz 함수는 행렬에서 0이 아닌 요소의 개수를 반환하고 nzmax 함수는 0이 아닌 행렬 요소에 할당된 저장 공간의 크기를 반환합니다. nnz(S)nzmax(S)가 다른 결과를 반환할 경우, 실제로 필요한 것보다 더 많은 저장 공간이 할당되었을 수 있습니다. 이런 이유로, 나중에 요소를 더 채울 것으로 예상되는 경우에만 nz를 설정하십시오.

nz를 지정하지 않으면 sparsemax([numel(i), numel(j), numel(v), 1])의 디폴트 값을 사용합니다.

데이터형: double

제한 사항

  • i,jm,n의 입력값이 2^31-1보다 크거나(32비트 플랫폼의 경우) 2^48-1보다 크면(64비트 플랫폼의 경우), 희소 행렬을 생성할 수 없습니다.

  • MATLAB®은 희소 행렬을 압축된 희소 열 형식으로 저장합니다. 자세한 내용은 Sparse Matrices In MATLAB: Design and Implementation(저자: John R. Gilbert, Cleve Moler, Robert Schreiber)을 참조하십시오.

  • accumarray 함수도 sparse와 유사하게 누적 동작을 실행합니다.

    • accumarrayn차원 첨자를 사용하여 데이터를 Bin으로 그룹화하는 반면, sparse는 2차원 첨자를 사용하여 데이터를 Bin으로 그룹화합니다.

    • accumarray는 동일한 첨자를 가진 요소를 출력값에 추가하는 기본 동작 외에, 필요할 경우 Bin에 함수를 적용할 수도 있습니다. sparse는 double형 값인 경우 출력값으로 동일한 첨자를 가진 요소에 sum 함수를 적용하거나, 논리값인 경우 any 함수를 적용합니다.

참고 문헌

[1] Gilbert, John R., Cleve Moler, and Robert Schreiber. “Sparse Matrices in MATLAB: Design and Implementation.” SIAM Journal on Matrix Analysis and Applications 13, no. 1 (January 1992): 333–356. https://doi.org/10.1137/0613024.

[2] Chen, Yanqing, Timothy A. Davis, William W. Hager, and Sivasankaran Rajamanickam. “Algorithm 887: CHOLMOD, Supernodal Sparse Cholesky Factorization and Update/Downdate.” ACM Transactions on Mathematical Software 35, no. 3 (October 2008): 1–14. https://doi.org/10.1145/1391989.1391995.

확장 기능

버전 내역

R2006a 이전에 개발됨

모두 확장