Scilab Home page | Wiki | Bug tracker | Forge | Mailing list archives | ATOMS | File exchange
Please login or create an account
Change language to: English - Français - Português -

Please note that the recommended version of Scilab is 6.0.1. This page might be outdated.
See the recommended documentation of this function

Scilab help >> Sparses Matrix > sprand

sprand

ランダム疎行列

呼び出し手順

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

パラメータ

nrows

整数 (行数)

ncols

整数 (列数)

density

占有率 (密度)

typ

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

sp

疎行列

説明

sp=sprand(nrows,ncols,density) は, nrowsncols列, 近似的に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,...,ncolsrとなる 各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 — 疎単位行列
Scilab Enterprises
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Thu Mar 03 11:00:56 CET 2011