CXCORE リファレンス マニュアル
最終変更者: 怡土順一, 最終変更リビジョン: 448, 最終変更日時: 2008-12-24 00:28:23 +0900 (水, 24 12月 2008)
- 基本構造体(Basic Structures)
- 配列操作(Operations on Arrays)
- 動的構造体(Dynamic Structures)
- 描画関数(Drawing Functions)
- データ永続性と実行時型情報(Data Persistence and RTTI)
- その他の関数(Miscellaneous Functions)
- エラーハンドリングとシステム関数(Error Handling and System Functions)
配列操作(Operations on Arrays)
乱数生成(Random Number Generation)
RNG
乱数生成器の状態を初期化する
CvRNG cvRNG( int64 seed=-1 );
- seed
- ランダムシーケンスを開始するために使用される64ビットの数値.
関数cvRNGは乱数生成器を初期化し,その状態を返す. 状態へのポインタは関数cvRandInt,cvRandReal,cvRandArrに渡される.現在の実装では,multiply-with-carry RNGが利用されている.
RandArr
配列を乱数で埋め,RNGの状態を更新する
void cvRandArr( CvRNG* rng, CvArr* arr, int dist_type, CvScalar param1, CvScalar param2 );
- rng
- cvRNGによって初期化されたRNGの状態.
- arr
- 出力配列.
- dist_type
- 分布のタイプ.
CV_RAND_UNI - 一様分布
CV_RAND_NORMAL - 正規分布(ガウス分布)
- param1
- 分布の第一パラメータ.一様分布では,発生する乱数の下限値(この値を含む)である. 正規分布では,乱数の平均値である.
- param2
- 分布の第二パラメータ.一様分布では,発生する乱数の上限値(この値は含まない)である. 正規分布では,乱数の標準偏差である.
関数cvRandArrは,一様または正規分布の乱数で出力配列を埋める. 正規分布の浮動小数点型の値を2次元配列中のランダムな位置に加算する例を以下に示す.
/* noisy_screenを,「めちゃくちゃな」浮動小数点型の2次元配列にする */ CvRNG rng_state = cvRNG(0xffffffff); int i, pointCount = 1000; /* 点の座標の配列を確保する */ CvMat* locations = cvCreateMat( pointCount, 1, CV_32SC2 ); /* ランダムな点の値の配列 */ CvMat* values = cvCreateMat( pointCount, 1, CV_32FC1 ); CvSize size = cvGetSize( noisy_screen ); cvRandInit( &rng_state, 0, 1, /* 現在はダミーパラメータを使用し,さらにそれらを調整する */ 0xffffffff /* ここでは,固定された種を使用する */, CV_RAND_UNI /* 一様分布の指定 */ ); /* 位置の初期化 */ cvRandArr( &rng_state, locations, CV_RAND_UNI, cvScalar(0,0,0,0), cvScalar(size.width,size.height,0,0) ); /* 正規分布値を生成するRNGを作るためにRNGを修正する */ rng_state.disttype = CV_RAND_NORMAL; cvRandSetRange( &rng_state, 30 /* 偏差 */, 100 /* 点の明るさの平均 */, -1 /* すべての次元を初期化する */ ); /* 値を生成 */ cvRandArr( &rng_state, values, CV_RAND_NORMAL, cvRealScalar(100), // average intensity cvRealScalar(30) // deviation of the intensity ); /* 点をセットする */ for( i = 0; i < pointCount; i++ ) { CvPoint pt = *(CvPoint*)cvPtr1D( locations, i, 0 ); float value = *(float*)cvPtr1D( values, i, 0 ); *((float*)cvPtr2D( noisy_screen, pt.y, pt.x, 0 )) += value; } /* 一時的な配列を解放することを忘れないように */ cvReleaseMat( &locations ); cvReleaseMat( &values ); /* RNG状態は解放の必要はない */
RandInt
32ビット符号なし整数を返し,RNGを更新する
unsigned cvRandInt( CvRNG* rng );
- rng
- RandInitによって初期化され, オプションでRandSetRangeによってカスタマイズされたRNGの状態(後者の関数は,この関数の結果に影響を及ぼさない).
関数cvRandIntは,一様分布した32ビット符号なし整数型の乱数を返し,RNGの状態を更新する. これは,C言語のランタイムライブラリでいうところのrand() 関数に類似している. しかし,rand()が0からRAND_MAX(2**16 または 2**32,プラットホームに依存する)までの数を返すの対して,この関数では常に32ビットの数を生成する. この関数は点座標やパッチサイズ,テーブルインデックスなどのスカラーの乱数を生成するのに役立つ. ここで,ある範囲の整数は剰余演算によって生成され,浮動小数点型の数は,指定範囲を0..1にスケーリングすることで生成することができる. cvRandIntを利用して,前述の例を書き直したものを以下に示す.
/* 入力とタスクは前のサンプルと同じである. */ CvRNG rng_state = cvRNG(0xffffffff); int i, pointCount = 1000; /* ... - ここで配列は確保されない */ CvSize size = cvGetSize( noisy_screen ); /* オーバヘッドを減らすため,正規分布した数値のためのバッファを生成する */ #define bufferSize 16 float normalValueBuffer[bufferSize]; CvMat normalValueMat = cvMat( bufferSize, 1, CV_32F, normalValueBuffer ); int valuesLeft = 0; for( i = 0; i < pointCount; i++ ) { CvPoint pt; /* ランダムな点の生成 */ pt.x = cvRandInt( &rng_state ) % size.width; pt.y = cvRandInt( &rng_state ) % size.height; if( valuesLeft <= 0 ) { /* バッファが空の場合,正規分布した数値でバッファを埋める */ cvRandArr( &rng_state, &normalValueMat, CV_RAND_NORMAL, cvRealScalar(100), cvRealScalar(30) ); valuesLeft = bufferSize; } *((float*)cvPtr2D( noisy_screen, pt.y, pt.x, 0 ) = normalValueBuffer[--valuesLeft]; } /* 行列のヘッダとデータはスタックに持っているため,normalValueMatを解放する必要はない. これは小さい固定サイズの行列で実行する際に,良く知られている効果的な方法である*/
RandReal
浮動小数点型の乱数を返し,RNGを更新する
double cvRandReal( CvRNG* rng );
- rng
- cvRNGによって初期化された,RNGの状態.
関数cvRandRealは,0から1(1は含まれない)の範囲に一様分布する浮動小数点型の乱数を返す.