【问题标题】:Addition of two 3x3 matrices in TCL scripting在 TCL 脚本中添加两个 3x3 矩阵
【发布时间】:2021-05-23 18:14:20
【问题描述】:

我最近开始使用 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}

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

【问题讨论】:

  • 如果您正在着手进行更广泛的矩阵运算,请考虑使用 tcllib math::linearalgebra 包。由于这是 Tcl,因此源代码很容易获得。

标签: matrix tcl addition


【解决方案1】:

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

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 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多