通过Tcl脚本使用“计算文件中某列的标准偏差”;expr";作用

通过Tcl脚本使用“计算文件中某列的标准偏差”;expr";作用,tcl,Tcl,我想知道使用“expr”函数计算文件中列的标准偏差所需的Tcl脚本。假设我有一个名为“input.dat”的输入文件,其中包含以下数据: 6 7 5 6 3 8 9 2 6 7 5 6 3 8 9 2 我想只使用Tcl的“expr”函数来计算“Column 2”的标准偏差,那么Tcl脚本将如何进行计算呢。我对Tcl脚本非常陌生,有谁能帮我学习一下Tcl脚本吗?这有两个关键部分。第一个是从文件中获取数据列,第二个是计算该数据的标准偏差。因为我们有容易识别的部件,所以这是一个制作一些程序的好机会 有

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

6 7 5 6 3 8 9 2 6 7 5 6 3 8 9 2
我想只使用Tcl的“expr”函数来计算“Column 2”的标准偏差,那么Tcl脚本将如何进行计算呢。我对Tcl脚本非常陌生,有谁能帮我学习一下Tcl脚本吗?

这有两个关键部分。第一个是从文件中获取数据列,第二个是计算该数据的标准偏差。因为我们有容易识别的部件,所以这是一个制作一些程序的好机会

有几种方法可以编写列加载器。这里有一个:

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与之混合。这个公式基本上是直接从维基百科上抄下来的,毕竟:

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::+{*}…]
来计算列表的和。您可以使用
foreach
expr
,但它需要更多的代码。)

然后我们可以把这些部件插在一起:

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

分解问题对于制作您可以理解的程序至关重要。

如果您需要从Tcl开始的帮助,请使用。否则,我们希望您就您的实现提出一个特定的问题。阅读@glenn jackman,我不知道从哪里开始。这就是为什么要寻求帮助。