スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
MEL でツールを作っていると
正規分布(ガウス分布)確率分布関数のような関数を使いたくなることが
たまにあります。

『正規分布』と言っても何のことやらよく分からないかも知れませんが
下図のような鐘形の曲線になる分布のことです。
実際 MEL の gauss コマンドもこの分布を使用しています。



しかしこの関数、入力し得るパラメータは平均と分散だけであって
縦軸の最大値も分からなければ横軸が漸近線なので
どうも使い勝手が悪いです。

というわけで使いやすいように正規化して MEL プロシージャにしてみました。

global proc float[] normalizedBellCurve(int $div, float $var)
{
float $nepC = 2.718281828;

float $yList[];
float $ofst = 0.0;

for($i = 0; $i < $div; $i++)
{
float $x = $i - ($div - 1)/2.0;
float $y = pow($nepC,(-pow($x,2)/2*pow($var,2)));

if($i == 0) $ofst = $y;
$y = ($y - $ofst)/(1.0 - $ofst);

$yList[size($yList)] = $y;
}
return $yList;
}


ご覧の通り「正規化してみました」とはいっても
ほんの1,2行使って引き算や割り算を少し加えただけなのですが。

x を入力して y を出力するような関数には敢えてせず、
第一引数を分割数、第二引数を分布の分散
(式をいじっているので本来の意味での分散とは違いますが)にし
それに対応する値を配列で返すようにしました。

111127_1.gif

実際に実行するとこのように 0 から始まり真中で 1 になりまた 0 に戻り、
その間の補完が第二引数の値によって変わるというものになります。

今このプロシージャを利用してリグ用のツールを作っているので
次回あたりの記事でそれをお見せしたいと思っています。
コメント
管理者のみ閲覧可能にする
Profile
HN らい

都内某社テクニカルディレクター
都内某専門学校講師
都内某企業講師
元中国某社S3Dスーパーバイザー
Contact
(ENGLISH OK. 可以用中文。)
Categories
Archives
RSS Link
QR Code