Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » Convertir une liste en matrice
MassenaHors ligneRédacteurPoints: 840 Défis: 3 Message

Convertir une liste en matrice

Posté le 01/08/2019 19:32

Bonjour à tous !
Alors je pense que le titre est assez explicite, mais je me demande :

Peut-on convertir une liste (de, par exemple, 25 items) en une matrice (par exemple en 5x5) ?

La fonction List->Mat ne rempli pas ces critères puisqu'elle assemble plusieurs listes de même longueur pour former une matrice.

En espérant pouvoir compter sur votre aide,
Masséna


Krevo_Hors ligneMaître du PuzzlePoints: 304 Défis: 0 Message

Citer : Posté le 01/08/2019 19:39 | #


Oui, pourquoi pas ... en écrivant un peu de code. ça pourrais être un sujet pour voir comment chacun l'implémente...

Genre comme ça =>


{0,1,2,3,4,.......}
{5, 5} -> Dim Mat A
For 1 -> A To 5
    For 1 -> B To 5
        List Ans[5(A-1)+B] -> Mat A[A, B]
    Next
Next


PS: C'est ce que je fais dans Labybug, dans le sous-programme LX où je part d'une liste de 8 éléments pour finir avec une matrice de 16 x 8.
Découvrez mon projet principal : Casio Basic Web Interpreter, le basic Casio dans votre navigateur web !
AlexotHors ligneMembrePoints: 355 Défis: 14 Message

Citer : Posté le 01/08/2019 20:45 | #


On peut aussi faire quelque chose comme ça :

{0,1,2,3,4,.......}
{5, 5} -> Dim Mat A
For 1 -> A To 25
       List Ans[A] -> Mat A[MOD(A-1, 5)+1, Int((A-1)/5)+1]
Next

Cliquez pour découvrir
Cliquez pour recouvrir
2b 5b 2d 2d 2d 2d 2d 3e 2b 2b 2b 3c 5d 3e 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 2e 2d 2d 2d 2d 2e 2b 2b 2b 2e 2b 5b 2d 2d 3e 2b 3c 5d 3e 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2e 2b 5b 2d 2d 3e 2b 2b 2b 2b 2b 3c 5d 3e 2b 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2b 2b 2b 2b 2b 2b 2e 2d 2e 2b 2e 2d 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 3c 5d 3e 2e 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 3c 5d 3e 2d 2e 2d 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2d 2e 2b 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 3c 5d 3e 2d 2d 2e 2b 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 2b 2b 3c 5d 3e 2d 2e 3e 2b 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2b 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e
Krevo_Hors ligneMaître du PuzzlePoints: 304 Défis: 0 Message

Citer : Posté le 01/08/2019 21:05 | #


Tout à fait. Une seule boucle et du modulo, j'allais le proposer...
Découvrez mon projet principal : Casio Basic Web Interpreter, le basic Casio dans votre navigateur web !
MassenaHors ligneRédacteurPoints: 840 Défis: 3 Message

Citer : Posté le 02/08/2019 10:15 | #


Merci beaucoup pour ces réponses
Now, Luke. A true gentleman suscribe to Planet Casio. This reminds me of a puzzle...
FilojiHors ligneMembrePoints: 140 Défis: 12 Message

Citer : Posté le 02/08/2019 10:39 | #


Vous pensez quoi de cela ?
? -> A
A -> Dim List 1
Seq(X, X, 1, Dim List 1, 1 -> List 1
Int (√(Dim List 1)) + 1(Int √(Dim List 1) != √(Dim List 1) -> B
{B, B - 1(B * (B - 1) = A) -> Dim Mat A
For 1 -> A To Dim List 1
    List 1[A] -> Mat A[A - B(Int ((A - 1) / B)), (Int ((A - 1) / B)) + 1
Next

Il permet de créer n'importe quel matrice à partir de n'importe quel dimension de listes, et s'adapte automatiquement si il y a un colonne vide !
Krevo_Hors ligneMaître du PuzzlePoints: 304 Défis: 0 Message

Citer : Posté le 02/08/2019 11:30 | #


@Filoji: Un peu complexe à mon goût. Et ça veux aussi dire que tu cherche à faire des matrices "carrés" ou en tous cas deviner la taille de la matrice finale. Ensuite tu utilise Seq(...) mais en fait on veux convertir n'importe quel liste en matrice.... on ne veut pas juste générer une matrice avec 1,2,3,....,N. La liste à mettre en matrice pourrais être {3,12,26,53,5,4,89,6} ou n'importe quoi. Si j'analyse bien ton programme, c'est en réalité une sorte de Seq() pour les matrices que tu as écris là, et non un convertisseur liste existante -> matrice.

@Axolot: je me suis aperçu que tu remplissais la matrice en remplissant la 1ere colonne ligne par ligne, puis la 2e colonne, etc .... alors que dans ma double boucle je faisais l'inverse....

En fait j'ai utilisé le nombre "5" a plusieurs endroits pour 2 significations différentes : le nombre de lignes et le nombre de colonnes.... alors qu'il serait bien plus propre et plus compréhensible de faire une variable L nb de lignes et C pour le nb de colonnes. D'ailleurs, je regrette un peu mon code initial, mais je l'avais voulu très simple et très court.

De manière générique, si on a une liste de m x n éléments, on peut faire une matrice de m lignes et n colonnes OU une matrice de n lignes et m colonnes (c'est un peu pareil me dirait vous).

Ainsi pour être tout à fait générique pour convertir une liste de m x n éléments (ou moins) en matrice, on peut faire :


' nombre de lignes
m -> L
' nombre de colonnes
n -> C
' Liste d'au plus m x n éléments
{n1, n2, n3, ...}
{L, C} -> Dim Mat A
For 1 -> A To Dim List Ans
       List Ans[A] -> Mat A[Int((A-1)/C)+1, MOD((A-1),C)+1]
Next

sauf éventuelle erreur de ma part, ça doit marcher (ATTENTION pas testé sur calculatrice .... normalement c'est "(A-1)" ... au début j'avais mis "A" dans les formules avec Int et MOD...)

OU en version "double boucle" (boucle extérieure pour les lignes, boucle intérieure pour les colonnes) :


' nombre de lignes
m -> L
' nombre de colonnes
n -> C
' Liste d'au plus m x n éléments
{n1, n2, n3, ...}
{L, C} -> Dim Mat A
For 1 -> A To L
    For 1 -> B To C
        List Ans[C(A-1)+B] -> Mat A[A, B]
    Next
Next


Voilà...

Avec une liste {1,2,3,4,5,6,7,8,9,10,11,12} et nb ligne L = 4 et nb colonnes C = 3, ça fait :


1   2   3
4   5   6
7   8   9
10  11  12


avec la même liste mais nb ligne L = 3 et nb colonnes C = 4, ça fait :


1   2   3   4
5   6   7   8
9   10  11  12


Enfin, si vous vouliez genre :


1  4  7  10
2  5  8  11
3  6  9  12


Il faudra faire inverser les index donnant ligne / colonne de la matrice et diviser par L plutôt :


...
       List Ans[A] -> Mat A[MOD((A-1),L)+1, Int((A-1)/L)+1]
...


... ou alors il suffit de transposer par la fonction Trn !
Découvrez mon projet principal : Casio Basic Web Interpreter, le basic Casio dans votre navigateur web !
AlexotHors ligneMembrePoints: 355 Défis: 14 Message

Citer : Posté le 02/08/2019 16:10 | #


@Krevo_ bien vu en effet je ne m'étais pas préoccupé de l'ordre de remplissage ligne par ligne ou colonne par colonne, et je n'avais pas pensé à mettre A-1 au lieu de A dans les formules avec MOD et Int.

Cliquez pour découvrir
Cliquez pour recouvrir
2b 5b 2d 2d 2d 2d 2d 3e 2b 2b 2b 3c 5d 3e 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 2e 2d 2d 2d 2d 2e 2b 2b 2b 2e 2b 5b 2d 2d 3e 2b 3c 5d 3e 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2e 2b 5b 2d 2d 3e 2b 2b 2b 2b 2b 3c 5d 3e 2b 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2b 2b 2b 2b 2b 2b 2e 2d 2e 2b 2e 2d 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 3c 5d 3e 2e 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 3c 5d 3e 2d 2e 2d 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2d 2e 2b 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 3c 5d 3e 2d 2d 2e 2b 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 2b 2b 3c 5d 3e 2d 2e 3e 2b 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2b 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e
LephenixnoirHors ligneAdministrateurPoints: 15492 Défis: 136 Message

Citer : Posté le 02/08/2019 16:48 | #


Je passe en coup de vent mais il y a pas une fonction comme Seq() pour les matrices ? La double boucle paraît lourde ultimement.
Krevo_Hors ligneMaître du PuzzlePoints: 304 Défis: 0 Message

Citer : Posté le 02/08/2019 17:02 | #


Je l'ai dit tout au début :
Krevo_ a écrit :
ça pourrais être un sujet pour voir comment chacun l'implémente...

... donc n'hésite pas à poster ta propre version. Je ne connais pas assez bien les fonctions dispo. sur les matrices pour savoir s'il y a quelque-chose d'intéressant pour se faciliter la tâche.

Tu parle d'un éventuel équivalent de Seq(..) pour les matrices, mais en fait ici on veut convertir n'importe quelle liste en matrice... donc c'est pas forcément {1,2,3, ....} . Si j'ai mis une liste {1,2,3,4,5,6,7,8,9,10,11,12}, c'est juste que c'est plus facile après pour voir comment sont rangés les éléments dans la matrice après que le programme à tourné. Mais le programme converti une liste quelconque en matrice.

J'en profite également pour dire que j'ai laissé un commentaire sur la commande List->Mat

J'ai fait pas mal d' edit pour clarifier le code et/ou les propos.
Découvrez mon projet principal : Casio Basic Web Interpreter, le basic Casio dans votre navigateur web !

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2019 | Il y a 33 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd