地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

ちょっと便利な数学関連の関数

pythonデータ分析試験の勉強をしつつこれperlで書くとどうなんだろってものが何点かあったのでメモ的に記載

平均

sub mean
{
    local($s) = 0;
    local($n) = 0;
    foreach $_ (@_) { if ($_ =~ /[0-9]/) { $s += $_; $n++; } }
    if ($n == 0) { ""; }
    else         { $s /= $n; }
}

分散と標準偏差

sub dist
{
    local($i, $m, $n, $s);
    ($m, $n, $s) = (0,0,0);
    if (@_ < 2) { return 0; }
    $m = &mean(@_);
    for ($i = 0; $i < @_; $i++) {
        if ($_[$i] =~ /[0-9]/) { $s += ($_[$i] - $m) * ($_[$i] - $m); $n++; }
    }
    if    ($n < 1) { ""; }
    elsif ($n < 2) { $s; }
    else           { $s /= ($n - 1); }
}
sub stdev { sqrt(&dist); }

最大値、最小値、中央値

sub max
{
    local ($i,$max);
    for ($i = 0; $i < @_; $i++) {
        if ($_[$i] =~ /[0-9]/) { $max = $_[$i]; last; }
    }
    foreach $_ (@_) { if (($_ =~ /[0-9]/) && ($max < $_)) { $max = $_; }}
    if (!($max =~ /[0-9]/)) { $max = ""; }
    $max;
}

sub min
{
    local ($i,$min);
    for ($i = 0; $i < @_; $i++) {
        if ($_[$i] =~ /[0-9]/) { $min = $_[$i]; last; }
    }
    foreach $_ (@_) { if (($_ =~ /[0-9]/) && ($min > $_)) { $min = $_; }}
    if (!($min =~ /[0-9]/)) { $min = ""; }
    $min;
}