从 TCL 中的文本文件中获取矩阵的单列
Get a single column of matrix from a text file in TCL
我是TCL语言新手,想知道如何进行下面的流程。假设我有一个程序,每个 运行 创建一个文本文件,并且应该 运行 10000 次。每个 运行 都会创建一个名为“OUT.out” 的文本文件。我感兴趣的是单个 运行.
中那个 OUT.out 文件的特定列中的单个数字
单个 运行 的理想情况应如下所示:
- 启动main 运行,(假设重复10000次)
- 运行案例一
- 完成案例 1
- 打开文本文件,OUT.out。
- 找出文本文件第 4 列中的最大绝对值。
- 将最大值保存在第 1 行的单独文本文件中。
- 删除 OUT.out 文件
- 运行案例二
- 完成主循环的案例2
- 打开文本文件,OUT.out。
- 找出文本文件第 4 列中的最大绝对值。
- 将最大值保存在第 2 行的单独文本文件中。
- 删除 OUT.out 文件
- 运行案例3
- 完成主循环的案例3
- 打开文本文件,OUT.out。
- 找出文本文件第 4 列中的最大绝对值。
- 将最大值保存在第 3 行的单独文本文件中。
- 删除 OUT.out 文件
- 运行案例4
.
.
.
我认为代码应该比我的笔记短。预先感谢您的帮助。
根据分隔符的不同,您可以这样做:
# Read in the data and list-ify it; REAL data is often messier though
set f [open OUT.out]
set table [lmap row [split [read $f] "\n"] {split $row}]
close $f
# Kill that unwanted file
file delete OUT.out
# Tcl indexes start at 0
set col4abs [lmap row $table {
expr { abs([lindex $row 3]) }
}]
# Get the maximum of a list of values
set maxAbs [tcl::mathfunc::max {*}$col4abs]
# You don't say what file to accumulate maximums in
set f [open accumulate.out "a"]; # IMPORTANT: a == append mode
puts $f $maxAbs
close $f
然后在每个 运行 之后重复。我相信你能弄清楚如何做到这一点。
但是如果您经常这样做,您可能应该考虑将结果存储在数据库中;它们 比一堆普通文件更适合这种事情。 (我完全可以推荐 SQLite;我们将批量结果数据管理移入其中,极大地提高了我们管理事物的能力,这保留了许多相当大的二进制 blob 以及各种可分析的元数据块。)
我是TCL语言新手,想知道如何进行下面的流程。假设我有一个程序,每个 运行 创建一个文本文件,并且应该 运行 10000 次。每个 运行 都会创建一个名为“OUT.out” 的文本文件。我感兴趣的是单个 运行.
中那个 OUT.out 文件的特定列中的单个数字单个 运行 的理想情况应如下所示:
- 启动main 运行,(假设重复10000次)
- 运行案例一
- 完成案例 1
- 打开文本文件,OUT.out。
- 找出文本文件第 4 列中的最大绝对值。
- 将最大值保存在第 1 行的单独文本文件中。
- 删除 OUT.out 文件
- 打开文本文件,OUT.out。
- 运行案例二
- 完成主循环的案例2
- 打开文本文件,OUT.out。
- 找出文本文件第 4 列中的最大绝对值。
- 将最大值保存在第 2 行的单独文本文件中。
- 删除 OUT.out 文件
- 打开文本文件,OUT.out。
- 运行案例3
- 完成主循环的案例3
- 打开文本文件,OUT.out。
- 找出文本文件第 4 列中的最大绝对值。
- 将最大值保存在第 3 行的单独文本文件中。
- 删除 OUT.out 文件
- 打开文本文件,OUT.out。
- 运行案例4 . . .
我认为代码应该比我的笔记短。预先感谢您的帮助。
根据分隔符的不同,您可以这样做:
# Read in the data and list-ify it; REAL data is often messier though
set f [open OUT.out]
set table [lmap row [split [read $f] "\n"] {split $row}]
close $f
# Kill that unwanted file
file delete OUT.out
# Tcl indexes start at 0
set col4abs [lmap row $table {
expr { abs([lindex $row 3]) }
}]
# Get the maximum of a list of values
set maxAbs [tcl::mathfunc::max {*}$col4abs]
# You don't say what file to accumulate maximums in
set f [open accumulate.out "a"]; # IMPORTANT: a == append mode
puts $f $maxAbs
close $f
然后在每个 运行 之后重复。我相信你能弄清楚如何做到这一点。
但是如果您经常这样做,您可能应该考虑将结果存储在数据库中;它们 比一堆普通文件更适合这种事情。 (我完全可以推荐 SQLite;我们将批量结果数据管理移入其中,极大地提高了我们管理事物的能力,这保留了许多相当大的二进制 blob 以及各种可分析的元数据块。)