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
となります.
実際のインデックスの値は,指数分布関数により計算されます.
ただし,分布関数のパラメータは同時に計算されます.
例
以下の例では,近似的に密度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
rとなる
各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
このアルゴリズムが実行される場合(時々必要となる可能性があります), アルゴリズムが正しく実行されていることを確認するために 要素の統計値を計算することができます.
Report an issue | ||
<< spones | Sparse Matrix Manipulation | spzeros >> |