Bash计算方差

一个计算方差的bash函数,使用bc进行计算,默认精度是20(bc的-l选项)

join(){
    # Concatenate arguments with seperator
    # like implode() in PHP or string.join() in python
    local ret=""
    local seperator=$1
    shift

    for i in $@
    do
        if [[ -z $ret ]]
        then
            ret=$i
        else
            ret="${ret}${seperator}${i}"
        fi
    done
    echo $ret
}

variance(){
    local total=`join '+' $@|bc -l`
    local average=`echo "${total}/$#"|bc -l`
    local d=0

    for i in $@
    do
        d=`echo "$d+($i-$average)^2"|bc -l`
    done
    echo "$d/$#"|bc -l
}

2011-07-17 UPDATE:

haohaolee在留言中给出了另一种简单的join()函数的实现,所以整个variance()函数可以简化如下:

variance(){
    IFS=+ local total=$( echo $*|bc -l )
    local average=$( echo "${total}/$#"|bc -l )
    local d=0

    for i in $@
    do
        d=$( echo "$d+($i-$average)^2"|bc -l )
    done
    echo "$d/$#"|bc -l
}

P.S.顺便把``方式的subshell换成了$()方式

使用方法:

$ variance 1 2 3
.66666666666666666666
$ variance 1 1 1
0.00000000000000000000

Comments !

blogroll

social