É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 :)
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".) –
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. –
Voulez-vous dire quelque chose comme [this] (http://codepad.org/Dtx9fSGd)? – Jerry