# sprand

ランダム疎行列

## 呼び出し手順

    sp=sprand(nrows,ncols,density [,typ])

## パラメータ

nrows

  整数 (行数)

ncols

  整数 (列数)

density

  占有率 (密度)

typ

  文字列, `"uniform"` (デフォルト) または `"normal"`

sp

  疎行列

## 説明

`sp=sprand(nrows,ncols,density)` は, `nrows` 行`ncols`列, 近似的に`density*nrows*ncols`個の非ゼロ エントリを有する疎行列`sp`を返します.

`density`パラメータは `[0,1]` の範囲で指定されます. そうでない場合, 自動的にこの範囲に変換されます. このため, 0 より小さいか 1より大きい density を使用しても, エラーも警告も発生しません: 式`density=max(min(density,1),0)`が使用されます.

`typ="uniform"`の場合, 一様分布の 値 [0,1]が生成されます. `typ="normal"` の場合,正規分布の 値が生成されます (平均=0 および標準偏差=1).

出力行列のエントリは指定された分布関数`typ`に 基づき計算されます. 非ゼロ要素のインデックスはランダムに計算され, 非ゼロの平均的な数は`density`となります. 実際のインデックスの値は,指数分布関数により計算されます. ただし,分布関数のパラメータは同時に計算されます.

副作用として,`rand`および `grand`ランダム数値生成器の状態はこの関数により修正されます. 非ゼロエントリのインデックスは指数分布関数およびgrand関数から計算されます. 行列の値はユーザーにより指定される分布関数(すなわち uniform または normal) およびrand関数から計算されます.

## 例

以下の例では,近似的に密度0.001の 100x1000疎行列を生成します. すなわち,およそ 100*1000*0.001=100個の非ゼロエントリとなります.

    // 行列のエントリは一様分布となります.
    W=sprand(100,1000,0.001);
    // 行列のエントリは正規分布となります.
    W=sprand(100,1000,0.001,"normal");

以下のスクリプトは, 行列のエントリが指定した分布を有することを確認します. 非ゼロエントリを取得するためにspget関数を用います. 次に,エントリの最小値,最大値,平均を計算し, limit値と比較します.

    typ = "normal";
    // typ = "uniform";
    nrows = 1000;
    ncols = 2000;
    density = 1/100;
    s=sprand(nrows,ncols,density,typ);
    nnzs=nnz(s);
    [ij,v]=spget(s);
    [%inf -%inf 0 %inf 1] // Limit values for "normal"
    [nnzs min(v) mean(v) max(v) variance(v)]
    [%inf 0 0.5 1 1/12] // Limit values for "uniform"

以下のスクリプトでは,ランダムに選択したエントリのインデックスを調べ, 正しい分布を有することを確認します. 一様分布の`kmax`ランダム疎行列を生成します. ここで,各行列について,生成する非ゼロのエントリのインデックスについて 考えます. すなわち, `i=1,2,...,nrows` および `j=1,2,...,ncols`ｒとなる 各`i` および `j`について イベント `Aij = {エントリ (i,j) が非ゼロ}` が発生するかどうかを調べます. 行列`C(i,j)`はイベント`Aij` が発生する回数を保存します. 行列 `R(k)` は,`k=1,2,...,kmax` について試行回数`k`の実際の密度を保存します.

        kmax = 1000;
        ncols=10;
        nrows=15;
        density=0.01;
        typ="uniform";
        C=zeros(nrows,ncols);
        R=[];
        for k=1:kmax
          M=sprand(nrows,ncols,density,typ);
          NZ=find(M<>0);
          NZratio = size(NZ,"*")/(nrows*ncols);
          R=[R NZratio];
          C(NZ)=C(NZ)+1;
        end

このアルゴリズムが実行される場合(時々必要となる可能性があります), アルゴリズムが正しく実行されていることを確認するために 要素の統計値を計算することができます.

      // A_ijの期待値は
      density * kmax
      // この値を実際のイベントと比較 :
      C
      // 平均値は期待値に近くなります.
      [density*kmax mean(C)]
      // 密度は密度の期待値に近くなります
      [density mean(R)]

## 参照

- sparse
- full
- rand
- speye