créer une matrice

Utilisation à l'épreuve de modélisation de l'agrégation de mathématiques

Modérateur : xcasadmin

Denizou
Messages : 61
Inscription : mer. juin 13, 2012 7:23 am

créer une matrice

Message par Denizou » dim. mars 01, 2015 3:44 pm

Bonjour,

J'aimerais savoir s'il est possible de créer une matrice à partir d'une liste vide en définissant la matrice terme à terme (sans utiliser makemat c'est à dire une matrice dont les termes ne dépendent a priori pas d'une fonction). C'est possible pour un vecteur, par exemple :

Code : Tout sélectionner

M:=[];
for(k:=0;k<n;k++){M[k]:=rand()}
return M
fonctionne, mais

Code : Tout sélectionner

M:=[[]];
for(k:=0;k<n;k++){
for(l:=0;l<n;l++){
M[k,l]:=rand() 
}
}
ne fonctionne pas du fait d'une erreur de dimension (la liste vide n'est pas vue comme une liste vide de listes vide j'imagine).
On peut évidemment créer la matrice ligne par ligne et concaténer mais y a - t - il une autre solution ?

Merci

FD

parisse
Messages : 5731
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: créer une matrice

Message par parisse » dim. mars 01, 2015 5:27 pm

Il faut creer M[k]:=[] avant la boucle for l
Bon, ici il est plus simple d'utiliser randmatrix

Denizou
Messages : 61
Inscription : mer. juin 13, 2012 7:23 am

Re: créer une matrice

Message par Denizou » jeu. mars 05, 2015 6:18 am

parisse a écrit :Il faut creer M[k]:=[] avant la boucle for l
Bon, ici il est plus simple d'utiliser randmatrix
ok merci

Denizou
Messages : 61
Inscription : mer. juin 13, 2012 7:23 am

Re: créer une matrice

Message par Denizou » jeu. mars 05, 2015 8:18 am

parisse a écrit :Il faut creer M[k]:=[] avant la boucle for l
Bonjour,

je viens de tester, mais ça ne passe pas. Il y a toujours une erreur de dimension :

Code : Tout sélectionner

f(n):={
  local k,l,M;
  M:=[[]]; // j'ai essayé aussi M:=[]
for(k:=0;k<n;k++){
  M[k]:=[]
for(l:=0;l<n;l++){
M[k,l]:=rand() // j'ai essayé aussi M[k][l]:=rand() qui me paraissait plus cohérent
}
}
  retourne M;
}:;

parisse
Messages : 5731
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: créer une matrice

Message par parisse » jeu. mars 05, 2015 8:53 am

en effet, il faut créer une liste intermédiaire:

Code : Tout sélectionner

f(n):={
 local k,l,L,M;
 M:=[]; 
 for(k:=0;k<n;k++){
  L:=[]
  for(l:=0;l<n;l++){
   L[l]:=rand();
  }
  M[k]:=L;
 }
 retourne M;
}:;

Denizou
Messages : 61
Inscription : mer. juin 13, 2012 7:23 am

Re: créer une matrice

Message par Denizou » jeu. mars 05, 2015 4:49 pm

parisse a écrit :en effet, il faut créer une liste intermédiaire:
C'est aussi la conclusion à laquelle j'étais arrivé. J'espérais qu'il était possible de conserver un seul nom pour la matrice, surtout pour pouvoir utiliser les indices de ligne et de colonnes (c'est un peu plus facile pour savoir ce que l'on fait).

Jusqu'à présent, je créais une matrice nulle ce qui me permettait de la remplir comme je le souhaitais (en ligne ou en colonne d'ailleurs). ça fonctionne très bien avec les dimensions de mes exemples : le temps de calcul pour remplir une matrice de 10 par 1000 reste acceptable (un peu plus d'1 seconde de temps de calcul sur mon programme). Evidemment ce n'est pas satisfaisant sur des tailles plus importantes.

Cette méthode est quasiment 2 fois plus rapide mais demande un peu plus de concentration pour ne pas se perdre dans les indices...

Merci de vos réponses

parisse
Messages : 5731
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: créer une matrice

Message par parisse » ven. mars 06, 2015 6:31 am

Si la question du temps d'exécution devient importante, vous pouvez utiliser l'affectation en place dans la boucle intérieure (L[l]=<rand()), mais il faut alors faire attention à la façon dont L est créée (L:=copy([])).
Pour une matrice aléatoire, le mieux c'est d'utiliser ranm (=randmatrix).

Répondre