Page 1 sur 1

créer une matrice

Publié : dim. mars 01, 2015 3:44 pm
par Denizou
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

Re: créer une matrice

Publié : dim. mars 01, 2015 5:27 pm
par parisse
Il faut creer M[k]:=[] avant la boucle for l
Bon, ici il est plus simple d'utiliser randmatrix

Re: créer une matrice

Publié : jeu. mars 05, 2015 6:18 am
par Denizou
parisse a écrit :Il faut creer M[k]:=[] avant la boucle for l
Bon, ici il est plus simple d'utiliser randmatrix
ok merci

Re: créer une matrice

Publié : jeu. mars 05, 2015 8:18 am
par Denizou
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;
}:;

Re: créer une matrice

Publié : jeu. mars 05, 2015 8:53 am
par parisse
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;
}:;

Re: créer une matrice

Publié : jeu. mars 05, 2015 4:49 pm
par Denizou
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

Re: créer une matrice

Publié : ven. mars 06, 2015 6:31 am
par parisse
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).