2015-03-13 3 views
0

Je veux savoir comment puis-je ajouter une variable de liste à une seule variable, quelque chose ressemble à la matrice.Comment puis-je ajouter une variable de liste à la boîte de table ou quelque chose comme la matrice

llappend à quel genre de ...?!?

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

par exemple:

 
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] 

Maintenant, je besoin seule variable comme ceci:

 
[MATRIX] 4*5 

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

et aussi je veux poser une autre question ... comment puis-je créer le contraire de cette matrice, je veux dire changer de ligne en colonne, je ne suis pas sûr, peut-être en anglais l'appeler inverse ou quelque chose :-) autre

Je veux dire ceci:

 
[MATRIX] 5*4 

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

J'ai essayé d'améliorer la mise en forme de votre question; s'il vous plaît vérifier (Le terme que vous recherchez n'est pas "inverse", mais plutôt "transposer".) –

+0

Merci. tu as raison. Transposer la matrice. L'explication de la première question est: Comment puis-je construire Matrix en tcl. par exemple j'ai 4 [liste]: [liste1] [liste2] [liste3] et [liste4] que tous sont 1 * 20, maintenant je veux construire [matrice] 4 * 20 par ces quatre liste. Je recherche la commande comme llappend pour ajouter les listes Ligne par ligne dans la matrice. à cause d'une raison quelconque, je ne peux pas utiliser la commande split et je cherche une autre façon. Enfin, je dois dire que je ne suis pas professionnel et natif en parlant anglais. Désolé pour ma langue terrible. –

+0

Voulez-vous dire quelque chose comme [this] (http://codepad.org/Dtx9fSGd)? – Jerry

Répondre

0

Élaborant sur mon commentaire, disons que vous avez les 4 listes comme ci-dessous, le contenu des listes des lettres au lieu des variables (qui ne devrait pas poser toute question) maintenant

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] 

, pour obtenir la matrice, nous allons faire une liste contenant tous les 4 listes:

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]] 

Si vous voulez voir que « matrice » de façon 4x5, il vous suffit d'imprimer la liste, rejointe par une nouvelle ligne:

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 

Ensuite, vous pouvez utiliser une boucle de base pour obtenir la matrice transposée. La boucle interne passe ici par les lignes, tandis que les boucles externes passent par les colonnes. matrix2 sera la matrice transposée et aura la ligne courante dans la matrice transposée. En raison de la façon dont la boucle a été configurée, les éléments suivants ajouteront d'abord toutes les premières valeurs de chaque ligne, puis toutes les secondes valeurs de chaque ligne, et ainsi de suite.

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] 

Pour ce qui précède, si vous voulez une seule boucle, vous pouvez utiliser le ci-dessous éventuellement boucle plus complexe:

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] 

Quel que soit, vous choisissez, si vous utilisez ce lot, vous pouvez veulent mettre ceci dans un proc:

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 
} 

Après quoi vous obtiendrez la matrice transposée dans matrix2 chaque fois que vous appelez

set matrix2 [transpose_matrix $matrix1] 

Notez que si vous avez des chiffres ou des mots qui sont de longueur variable, l'affichage pourrait ne pas être trop jolie ... par exemple, avec d'autres valeurs, la matrice pourrait ressembler à:

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 

Ce qui peut être difficile à lire ...mais alors, c'est un problème différent :)

+0

'rejoindre [lmap row $ matrix1 {rejoindre $ row \ t}] \ n' –