ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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) の非ゼロ要素用の領域が割り当てられます。sparse は、ij で添字が重複する 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 の一方がベクトルまたは行列の場合、もう一方の入力にはスカラーか、同じ数の要素をもつベクトルまたは行列を使用できます。この場合、sparsei(:)j(:) を添字として使用します。ij に、v の複数の要素に対して同じ値がある場合、これらの要素は加算されます。

メモ

i または j に、32 ビット プラットフォームの場合は 2^31-1 より大きい値、64 ビット プラットフォームの場合は 2^48-1 より大きい値が含まれている場合は、スパース行列を作成できません。

データ型: double | 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

ヒント

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

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

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

    • accumarray は、既定では同一の添字をもつ要素を出力に加算しますが、オプションで任意の関数をビンに適用できます。sparse は、同一の添字をもつ要素のみを出力に加算します。

拡張機能

R2006a より前に導入