2015-03-13 54 views
0

我想知道如何添加一些列表变量到单个变量,有些东西看起来像矩阵。如何添加列表变量到表格框或类似的东西

llappend到什么样的...?!?

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

例如:

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

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

 
[MATRIX] 4*5 

$a $b $c $d $e 
$f $g $h $i $j 
$k $l $m $n $o 
$p $q $r $s $t 

,也是我想问另一个问题... 怎么可以创造这个矩阵的反面,我的意思是改变行到列,我不知道,也许在英文中称它为逆或什么否则:-)

我的意思是这样的:

 
[MATRIX] 5*4 

$a $f $k $p 
$b $g $l $q 
$c $h $m $r 
$d $i $n $s 
$e $j $o $t 
+0

我试图改善你的问题的格式;请仔细检查! (您寻找的术语不是“反转”,而是“转置”。) – 2015-03-13 09:32:21

+0

谢谢。你是对的。转置矩阵。第一个问题的解释是:我如何在tcl中构建Matrix。例如我有4 [list]:[list1] [list2] [list3]和[list4],他们都是1 * 20,现在我想用这四个列表构建[Matrix] 4 * 20。我搜索像llappend这样的命令,在矩阵中逐行添加列表。由于某种原因,我无法使用split命令,而是寻找另一种方式。最后,我应该说我在说英语方面不够专业和本地化。对不起,我可怕的语言。 – 2015-03-13 10:58:34

+0

你的意思是[this](http://codepad.org/Dtx9fSGd)?确切地说, – Jerry 2015-03-13 11:51:21

回答

0

在阐述我的意见,让我们说你有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 

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

+0

'连接[lmap行$ matrix1 {连接$行\ t}] \ n' – 2015-03-14 22:34:16

相关问题