如何将列表变量添加到表格框或类似矩阵的东西



我想知道如何将一些列表变量添加到单个变量中,有些东西看起来像矩阵。

附在什么样的... ?!?

set EarthquakesNameForFactorLineNO [list]
set EarthquakesNameForFactor [list]
set FirstRow [list]
set SecondRow [list]

例如:

EarthquakesNameForFactorLineNO = [$a $b $c $d $e]地震名称因子 = [$f $g $h $i $g]设置第一行 [列表] = [$k $l $m $n $o]设置第二行 [列表] = [$p $q $r $s $t]

现在我需要这样的单个变量:

[矩阵] 4*5$a $b $c $d $e$f $g $h $i $j$k $l $m $n $o$p $q $r $s $t

我还想问另一个问题...我如何创建这个矩阵的反面,我的意思是将行更改为列,我不确定,也许在英语中称之为反向或其他什么:-)

我的意思是:

[矩阵] 5*4$a $f $k $p$b $g $l $q$c $h $m $r$d $i $n $s$e $j $o $t

详细阐述我的评论,假设您有以下 4 个列表,列表的内容是一些字母而不是变量(这应该不会造成任何问题)

set EarthquakesNameForFactorLineNO [list a b c d e]
set EarthquakesNameForFactor       [list f g h i j]
set FirstRow                       [list k l m n o]
set SecondRow                      [list p q r s t]

现在,为了得到矩阵,我们将创建一个包含所有 4 个列表的列表:

set matrix1 [list $EarthquakesNameForFactorLineNO $EarthquakesNameForFactor $FirstRow $SecondRow]
# Equivalent to
# set matrix1 [list [list a b c d e] [list f g h i g] [list k l m n o] [list p q r s t]]

如果你想以 4x5 的方式查看该"矩阵",你只需要打印列表,用换行符连接:

puts [join $matrix1 n]
# This displays:
# a b c d e
# f g h i g
# k l m n o
# p q r s t

然后,您可以使用一些基本的循环来转置矩阵。此处的内部循环正在遍历行,而外部循环正在遍历列。 matrix2将是转置矩阵,newrow将在转置矩阵中具有当前行。由于循环的设置方式,以下内容将首先添加每行中的所有第一个值,然后获取每行中的所有第二个值,依此类推。

set matrix2 [list]
for {set column 0} {$column < [llength [lindex $matrix1 0]]} {incr column} {
    set newrow [list]
    foreach row $matrix1 {
        lappend newrow [lindex $row $column]
    }
    lappend matrix2 $newrow
}
puts [join $matrix2 n]

对于上述内容,如果您想要单个循环,则可以使用以下可能更复杂的循环:

for {set a 0; set b 0} {
    $a < [llength [lindex $matrix1 0]] && $b <= [llength $matrix1]
} {incr b} {
    if {$b == [llength $matrix1]} {
        set b -1
        incr a
        lappend matrix2 $newrow
        set newrow [list]
    } else {
        lappend newrow [lindex $matrix1 $b $a]
    }
}
puts [join $matrix2 n]

无论你选择哪一种,如果你经常使用它,你可能想把上面的内容放在一个过程中:

proc transpose_matrix {matrix1} {
    for {set a 0; set b 0} {
        $a < [llength [lindex $matrix1 0]] && $b <= [llength $matrix1]
    } {incr b} {
        if {$b == [llength $matrix1]} {
            set b -1
            incr a
            lappend matrix2 $newrow
            set newrow [list]
        } else {
            lappend newrow [lindex $matrix1 $b $a]
        }
    }
    return $matrix2
}

之后,您将在调用时获得matrix2转置矩阵

set matrix2 [transpose_matrix $matrix1]

请注意,如果您有长度可变的数字或单词,则显示可能不会太漂亮......例如,对于其他值,矩阵可能如下所示:

1.45 1 2 310 43
0 2.3 10 20 13
342.04 11.49 87.32 0.987 2.3
3.2 12.45 11.11 43.2 35

这可能很难阅读...但是,这是一个不同的问题:)

package require struct::matrix
struct::matrix xdata
xdata add columns 5
xdata add rows    4
xdata set rect 0 0 {
{a b c d e}
{f g h i g}
{k l m n o}
{p q r s t}
}
join [xdata get rect 0 0 end end] n
# a b c d e
# f g h i g
# k l m n o
# p q r s t
xdata transpose
join [xdata get rect 0 0 end end] n
# a f k p
# b g l q
# c h m r
# d i n s
# e g o t
xdata destroy

这实现了相同的结果,但使用 struct::matrix 也包括一个矩阵转置命令

最新更新