我是使用 Tcl 的初学者。我将它用作 VMD(分子可视化)软件将其用作脚本语言。
我有一个蛋白质的原子位置坐标列表,例如:{{1 2 3} {7 9 13}, ...}
我有一个具有不同位置的相同长度的单独列表说:{{3 5 2} {7 3 8}, ...}
。
VMD 有一个内置vecsub
函数,可以减去{1 2 3}
和{3 5 2}
给出{-2 -3 1}
。我编写了一个foreach
循环来迭代整个列表并计算vecsub
.
我的代码如下:\
set sel1 [atomselect 0 "protein"] # selecting protein1
set sel2 [atomselect 1 "protein"] # selecting protein2
# create a list of same length as protein to store values
# $sel1 get index returns length of protein
foreach i [$sel1 get index] {
lappend x 0
}
# veclength2 returns square of vector length
# $sel1 get {x y z} returns a position list as described earlier
foreach i [$sel1 get index] {
lset x $i [expr [veclength2 [vecsub [lindex [$sel1 get {x y z}] $i] [lindex [$sel2 get {x y z}] $i]]]]
}
在 Tcl 中是否有另一种方法可以做到这一点?也许类似于 python 数组减法?