Main Content

sparse

スパース行列の作成

説明

S = sparse(A) は、ゼロ要素を取り除いて非スパース行列をスパース型の行列に変換します。行列に多数のゼロが含まれる場合、行列をスパース ストレージに変換することでメモリを節約できます。

S = sparse(m,n) は、すべての要素がゼロである mn 列のスパース行列を作成します。

S = sparse(i,j,v) は、ij および v の 3 要素から、S(i(k),j(k)) = v(k) であるようなスパース行列 S を作成します。max(i)max(j) 列の出力行列には、length(v) 非ゼロ要素用に割り当てられたスペースがあります。

入力 ij および v がベクトルまたは行列である場合、これらの要素の数は同じでなければなりません。あるいは、引数 v および/または引数 ij のどちらかをスカラーにすることもできます。

S = sparse(i,j,v,m,n) は、S のサイズを mn 列に指定します。

S = sparse(i,j,v,m,n,nz) は、nz の非ゼロ要素用に領域を割り当てます。この構文を使用して、行列の作成後に非ゼロ値で埋められる、追加の領域を割り当てます。

すべて折りたたむ

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

ij および v の 3 要素から、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 は出力に追加される行と列をゼロでパディングします。

size(S)
ans = 1×2

        1500        1500

10 個の非ゼロ値をもつスパース行列を作成し、100 個の非ゼロ値を保存できる領域を割り当てます。

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

関数 spalloc は、非ゼロ要素を "もたない" が非ゼロをいくつか保存できる領域が割り当てられているスパース行列を作成する省略形です。

添字の繰り返しを使用して、1 つのスパース行列に複数の値を累積します。その他の方法では、1 つ以上のループが必要となります。

データの列ベクトルを 1 つ、添字の列ベクトルを 2 つ作成します。

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 の対応する要素で添字のペア S(i,j) を指定します。これにより、出力における v の値の配置が決定されます。ij は同じデータ型をもたなければなりません。ij の一方がベクトルまたは行列の場合、もう一方の入力にはスカラーか、同じ数の要素をもつベクトルまたは行列を使用できます。この場合、sparsei(:)j(:) を添字として使用します。

ijv における複数の要素について同じ値をもつ場合、sparse は繰り返されたインデックスを v 内にもつ値を集約します。集約の動作は v 内の値のデータ型に依存します。

  • logical 値については、sparse は関数 any を適用します。

  • double 値については、sparse は関数 sum を適用します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

値。スカラー、ベクトルまたは行列として指定します。v がベクトルまたは行列の場合、入力 ij のどちらか一方は、同じ数の要素をもつベクトルまたは行列でなければなりません。

v にあるゼロ要素はすべて無視され、これに対応する ij の添字も無視されます。ただし、出力の次元のサイズ m および n を指定しない場合、sparse は、v のゼロ要素を無視する前に、最大値 m = max(i) および n = max(j) を計算します。

データ型: double | logical
複素数のサポート: あり

各次元のサイズ。整数値の個別の引数として指定します。m (行サイズ) を指定する場合、n (列サイズ) も指定する必要があります。

mn を指定しない場合、sparse は既定値の m = max(i)n = max(j) を使用します。これらの最大値は v からゼロ要素を取り除く前に計算されます。

データ型: double

非ゼロ要素のストレージ割り当て。非負の整数として指定します。通常、nzmax([numel(i), numel(j), numel(v), 1]) 以上でなければなりません。ただし、ijv のサイズが、nz の値を 0 に指定できるようなサイズである場合、sparse は代わりに値を 1 に設定します。

スパース行列 S について、関数 nnz は行列にある非ゼロ要素の数を返し、関数 nzmax は非ゼロの行列要素に割り当てられるストレージの量を返します。nnz(S) の結果と nzmax(S) の結果が異なる場合、実際に必要な量以上のストレージが割り当てられる可能性があります。そのため、nz は、値を後で設定する場合のみに指定してください。

nz を指定しない場合、sparsemax([numel(i), numel(j), numel(v), 1]) の既定値を使用します。

データ型: double

制限

  • 任意の入力 i,j または m,n が、32 ビット プラットフォームについて 2^31-1 より大きいか、64 ビット プラットフォームについて 2^48-1 より大きい場合は、スパース行列を作成できません。

ヒント

  • MATLAB® はスパース行列を圧縮されたスパース列の形式で保存します。詳細については、John R. Gilbert、Cleve Moler および Robert Schreiber の『Sparse Matrices In MATLAB: Design and Implementation』を参照してください。

  • 関数 accumarray の動作は、sparse の累積動作に似ています。

    • accumarray は n 次元の添字を使用してデータをビンにグループ化しますが、sparse では 2 次元の添字を使用してデータをビンにグループ化します。

    • accumarray は、既定では同一の添字をもつ要素を出力に加算しますが、オプションで任意の関数をビンに適用できます。sparse は同一の添字をもつ要素に対し、関数 sum (double 値について) または関数 any (logical 値について) を出力に適用します。

参照

[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 より前に導入

すべて展開する