Sage Python permutation ligne matrice

Bonjour,

j'aimerais définir une fonction sur SAGE dont les paramètres sont une matrice mmatrix, i et j qui donnera une matrice dont la ième ligne sera permutée avec la jième ligne.

Voici le code que j'ai défini mais cela ne fonctionne pas.
def swap_rows(mmatrix, i, j)
    l=len(mmatrix)
    c=range(l)
    for i in c
    for j in c
    m=mmatrix
    n=deepcopy(mmatrix)
    n [ i ] = m [ j ]
    n [ j ] = m [ i ]
    print(n)
Merci d'avance !

Réponses

  • Il y a déjà une méthode swap_rows sur les matrices en Sage. Pourquoi en refaire une ?
  • Bonjour GaBuZoMeu
    Parce qu'on doit apprendre à coder des fonctions simples...

    [Inutile de reproduire le message précédent. AD]
  • Il y a suffisamment d'occasions pour le faire sur de vrais problèmes.
  • Mais je ne m'amuse pas à faire ça pour le plaisir... C'est un exercice donné en cours et je ne suis déjà pas capable de coder ça...
  • 1°) Tu as systématiquement oublié les : dans ton code
    2°) Sage renvoie un message d'erreur. Quel est-il ?
    3°) Peux-tu expliquer en mots ce qu'est censé faire ton algo ?
  • Après avoir corrigé mon code comme ceci
    def swap_rows(mmatrix, i, j):
        l=len(mmatrix)
        c=range(l)
        for i in c:
        for j in c:
        m=mmatrix
        n=deepcopy(mmatrix)
        n[ i]=m[j]
        n[j]=m[ i]
        return(n)
    
    Note : Décidément, il y a toujours un problème quand je copie. La fin est :
    [Mettre une espace entre [ et i sinon l'afficheur du forum prend cela pour unr bannière BBcode qui passe en italique. AD]

    Je reçois ceci comme erreur :
    Error in lines 1-10
    Traceback (most recent call last):
    File "/cocalc/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 1013, in execute
    exec compile(block+'\n', '', 'single') in namespace, locals
    File "<string>", line 5
    for j in c:
    ^
    IndentationError: expected an indented block


    Le but de notre exercice est de calculer une matrice inverse à une matrice carrée donnée. Pour cela, le prof nous exige de coder tout d'abord la méthode de Gauss. Pour le faire, le prof nous demande de définir des fonctions de bases, la première étant la permutation de deux lignes d'une matrice, la deuxième, multiplier une matrice par un réel et la troisième, ajouter une combinaison linaire à une autre ligne.
    Une fois ces trois fonctions codées, il nous donne le code pour la méthode de Gauss.
    Ensuite, il nous demande qu'à une matrice carrée donnée, nous puissions donner une matrice nx2n qui rajoute une matrice identité à côté de la matrice carrée donnée. On applique ensuite la méthode de Gauss à cette nouvelle matrice et on extrait la deuxième partie de la matrice qui est en réalité la matrice inverse.
  • Et le but de mon algorithme ici, c'est qu'à une matrice mmatrix donnée, je la copie puis je lui fais une série de modifications.
    J'impose que mes paramètres i et j soientt dans la suite allant de 1 à mon nombre de lignes et ensuite, je remplace la valeur de la ième ligne de ma matrice copiée par la valeur de la jième ligne de ma matrice de départ.
  • Le message d'erreur est clair :
    IndentationError: expected an indented block
    Ensuite
    J'impose que mes paramètres i et j soientt dans la suite allant de 1 à mon nombre de lignes et ensuite, je remplace la valeur de la ième ligne de ma matrice copiée par la valeur de la jième ligne de ma matrice de départ.
    Ce n'est pas du tout ce que je lis dans ton code. Pour commencer, i et j sont normalement des variables d'entrée données mais après tu les traites comme variables locales parcourant range(c).
  • Je te remercie, à vrai dire, le prof ne nous a pas donné un cours de programmation, on doit se débrouiller un peu par nous même donc je ne comprenais rien à la partie erreur. Maintenant, c'est plus clair après quelques recherches.

    Au départ, je voulais dire que si quelqu'un mettait des paramètres i, j qui seraient plus grands que le nombre de lignes, je mettrais une phrase d'erreur "personnalisée".

    Bref, cela fonctionne maintenant, un grand merci !
  • Peux-tu donner ton code ?
    Sage donne lui-même un message d'erreur "index out of range" si on déborde.
  • Voici mon code
    def swap_rows(mmatrix, i, j):
        l=len(mmatrix)
        m=mmatrix
        n=deepcopy(mmatrix)
        n[ i]=m[j]
        n[j]=m[ i]
        return(n)
    
    Encore une fois de plus, la fin ne se copie pas correctement, je suis obligée de rajouter des espaces entre chaque caractère :
    n [ i ] = m [ j ]
    n [ j ] = m [ i ]
    return(n)
    [Mettre une espace entre [ et i sinon l'afficheur du forum prend cela pour une bannière BBcode qui passe en italique. AD]
  • AD t'a déjà expliqué : [Mettre une espace entre [ et i sinon l'afficheur du forum prend cela pour unr bannière BBcode qui passe en italique. AD]

    Ton code produit le message d'erreur :
    TypeError: object of type 'sage.matrix.matrix_integer_dense.Matrix_integer_dense' has no len()
  • Bonjour,

    Pourtant, je n'ai pas d'erreurs quand je teste avec des matrices...

    Et pour multiplier une ligne par un réel alpha donné, j'ai un problème quand je teste des valeurs. On me dit dans le message d'erreur que c'est "out of range".
    def rescale_row(mmatrix, i, alpha):
        m=mmatrix
        n=deepcopy(mmatrix)
        l=len(m)
        c=len(m[0])
        j=0
        while j<=c:
            n [ i ] =alpha*m [ i ] [j]
            j=j+1
        return(n)
    
    Quand je le teste pour ceci
    rescale_row([[2,1],[5,6]],0,3) #Je teste bien sur la première ligne en multipliant par 3
    
    J'ai ce message d'erreur :
    Error in lines 1-1
    Traceback (most recent call last):
      File "/cocalc/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 1013, in execute
        exec compile(block+'\n', '', 'single') in namespace, locals
      File "", line 1, in <module>
      File "", line 8, in rescale_row
    IndexError: list index out of range
    

    Mon k représente la colonne à laquelle je suis, j'impose que j commence à 0 (donc première colonne) et ça va jusqu'au nombre de colonnes qui est c. Tant que ça reste plus petit ou égal à c, je multiplie par la valeur de alpha... Quelqu'un peut me dire où se trouve mon erreur ? Merci
  • Remplace <= par < pour commencer.
    Ensuite, tu pourrais te demander ce qu’est réellement nn (abuse de print un peu partout pour le savoir).
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bon...
    def rescale_row(mmatrix, i, alpha):
        m=mmatrix
        n=deepcopy(mmatrix)
        l=len(m)
        c=len(m[0])
        j=0
        n[ i]=[]
        print(n)
        while j < c:
            n [ i ] =alpha*m [ i ] [j]
            j=j+1
        return(n)
    
    J'ai commencé par ceci, et cela me donne
    rescale_row([[1,2],[5,6]],1,2)
    [[1, 2], []]
    [[1, 2], 12]
    
    Du coup, j'ai voulu utiliser la fonction append...
    def rescale_row(mmatrix, i, alpha):
        m=mmatrix
        n=deepcopy(mmatrix)
        l=len(m)
        c=len(m[0])
        j=0
        while j < c:
            n [ i ] =m [ i ] .append(alpha*m [ i ] [j])
            j=j+1
        return(n)
    
    et cela me donne
    rescale_row([[1,2],[5,6]],1,2)
    
    [[1, 2], []]
    [[1, 2], None]
    
  • Tes matrices ne sont pas des matrices Sage, mais des listes de listes. Voila pourquoi tu peux appliquer "len" sans que Sage proteste.
    Pour les matrices, la méthode qui donne le nombre de lignes est "nrows".
  • Merci pour ta remarque GaBuZoMeu, mais le prof nous demande de considérer des matrices comme des listes de listes justement...
  • Drôle de façon d'utiliser Sage. Enfin ...
  • J'ai trouvé finalement, merci !
Connectez-vous ou Inscrivez-vous pour répondre.