在 TCL 脚本中添加两个 3x3 矩阵

Addition of two 3x3 matrices in TCL scripting

我最近开始使用 TCL 脚本。我发现很难编写添加两个 3x3 矩阵并打印结果的脚本。 这是我尝试过的:

set arr1 {{1 2 3} {4 5 6} {7 8 9}}
set arr2 {{3 2 1} {6 4 5} {8 9 7}}
foreach a $arr1 b $arr2 {
    foreach c $a d $b {
        set sum [expr $c + $d]
        lappend z $sum
    }
    lappend y $z
    unset z
}  
puts $y

上面的脚本给了我{4 4 4} {10 9 11} {15 17 16}

有没有更好的方法来获得相同的结果?

你必须做大约那么多的工作。然而,有一些优化是可能的,其中唯一真正重要的是支撑你的表达式(以启用编译它们)。这是单行添加:

set y [lmap a $arr1 b $arr2 {lmap c $a d $b {expr {$c+$d}}}]

拆分、重命名变量并添加一些空格:

set y [lmap row1 $arr1 row2 $arr2 {
    lmap cell1 $row1 cell2 $row2 {
        expr {$cell1 + $cell2}
    }
}]

lmapforeach 类似,只是它根据评估其主体所获得的值创建了一个列表(foreach 将其丢弃)。在 lmap 中使用 lmap 可以对单元格进行加法运算。 (如果将此代码放入过程中,您将获得最优化的编译。)


要做得更好,需要使用 VecTcl 等可以将计算提升到 C 中的包。