我想知道使用"expr"函数计算文件中列的标准偏差所需的Tcl脚本。假设我有一个名为"input.dat"的输入文件,其中包含以下数据:
6 75 63 89 2
而且我想仅使用 Tcl 的"expr"函数计算"列 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"
将问题拆分对于制作您可以理解的程序至关重要。