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.
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 blockJ'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.
-
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 cecirescale_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 donnerescale_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 donnerescale_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.
Bonjour!
Catégories
- 163.1K Toutes les catégories
- 7 Collège/Lycée
- 21.9K Algèbre
- 37.1K Analyse
- 6.2K Arithmétique
- 52 Catégories et structures
- 1K Combinatoire et Graphes
- 11 Sciences des données
- 5K Concours et Examens
- 11 CultureMath
- 47 Enseignement à distance
- 2.9K Fondements et Logique
- 10.3K Géométrie
- 62 Géométrie différentielle
- 1.1K Histoire des Mathématiques
- 68 Informatique théorique
- 3.8K LaTeX
- 39K Les-mathématiques
- 3.5K Livres, articles, revues, (...)
- 2.7K Logiciels pour les mathématiques
- 24 Mathématiques et finance
- 312 Mathématiques et Physique
- 4.9K Mathématiques et Société
- 3.3K Pédagogie, enseignement, orientation
- 10K Probabilités, théorie de la mesure
- 772 Shtam
- 4.2K Statistiques
- 3.7K Topologie
- 1.4K Vie du Forum et de ses membres