使用“ expr”功能通过Tcl脚本从文件计算列的标准偏差

时间:2019-04-03 09:45:53

标签: tcl

我想知道使用“ expr”功能从文件计算列的标准偏差所需的Tcl脚本。假设我有一个名为“ input.dat”的输入文件,其中包含以下数据:

6 7
5 6
3 8
9 2

并且我只想使用Tcl的“ expr”函数来计算“第2列”的标准偏差,那么执行计算的Tcl脚本将是什么。我在这个Tcl脚本中非常新,有人可以在Tcl脚本中帮我吗?

1 个答案:

答案 0 :(得分:0)

这有两个关键部分。第一个是从文件中获取数据列,第二个是计算该数据的标准偏差。由于我们具有易于识别的零件,因此这是进行某些程序的绝佳机会。

有几种写列装载器的方法。这是一个:

proc LoadColumn {filename columnIndex} {
    set f [open $filename]
    set column {}
    while {[gets $f line] >= 0} {
        set datum [lindex [split $line] $columnIndex]
        if {$datum != ""} {
            lappend column $datum
        }
    }
    close $f
    return $column
}

现在,计算标准偏差非常简单,因为我们不需要在其中混合I / O。毕竟,该公式基本上是直接从Wikipedia复制的:

proc StandardDeviation {data} {
    set n [expr {double([llength $data])}]
    set sum [tcl::mathop::+ {*}$data]
    set mean [expr {$sum / $n}]
    set sum2 [tcl::mathop::+ {*}[lmap x $data {expr {($x - $mean) ** 2}}]]
    return [expr {sqrt($sum2 / ($n - 1))}]
}

(这里唯一真正的高级技术是[tcl::mathop::+ {*}…]来计算列表的总和。您可以使用foreachexpr来代替,但这需要更多的代码。)

然后,我们可以将各个部分插入在一起:

set file "myfile.dat"
set column [LoadColumn $file 1];  # Column indices count from zero
set sd [StandardDeviation $column]
puts "The standard deviation is $sd"

解决问题对于创建可以理解的程序至关重要。