2015-03-13 53 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

相關問題