Programmation Matlab

Résolu/Fermé
mattkowsky Messages postés 28 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 13 janvier 2010 - 14 déc. 2009 à 12:41
 pouchu - 5 avril 2012 à 15:52
Bonjour,

je poste ce message dans l'espoir que quelqu'un puisse me guider sur les étapes de ce programme matlab par des commentaires ou des simplifications qui permettraient à un novice de Matlab de le comprendre, je vous remercie par avance du temps que vous me consacrerez.

voilà le dit programme qui sert à la représentation des dépôts ballistique linéaires :

clear all
close all
clc
largeur=1000;

Nparticules=50000;

Image=[ones(largeur,1) zeros(largeur,1)];

for particule=1:Nparticules
depot=ceil(largeur*rand(1,1));
if depot==1
s=[Image(largeur,:) ; Image((depot):(depot+1),:)];
elseif depot==largeur
s=[Image((depot-1):(depot),:) ; Image(1,:) ; ];
else
s=Image((depot-1):(depot+1),:);
end

T=find(sum(s)>0);

index=T(1,end);

Image(depot,index+1)=1;

if(sum(Image(:,end)')>0)
Image=[Image zeros(largeur,1)];
end
end

taille=size(Image,2);

imagesc(Image(:,taille:-1:2)')
colormap bone


encore merci et bonne journée à tous...

2 réponses

Bonjour,

S'il te plaît n'aie pas peur de la longueur, c'est juste très détaillé et je ne veux pas l'avoir fait pour rien!! Donc lis-le, ce n'est pas difficile!!

Est-ce que tu sais qu'il existe une fonction help sur Matlab? Tu tapes help xxx où xxx est une commande et tu auras toutes les informations nécessaires sur cette commande pour comprendre! N'hésite pas à l'utiliser et penses-y à chaque fois que tu découvres une nouvelle commande, c'est très pratique! un inconvénient, c'est en anglais!

Tu dis être débutant donc je suppose que tu n'y connais rien et je vais tout détailler pour que tu puisses bien comprendre, et être capable de modifier!

Sinon, ton programme en détails :

un point-virgule à la fin d'une commande permet d'empêcher Matlab d'afficher le résultat de la commande dans la fenêtre de commande. C'est pratique quand comme ici tu travailles avec des grosses matrices.
Tu peux aussi insérer des commentaires dans un programme Matlab si ça t'aide. Il suffit de mettre le symbole % et derrière, tu peux écrire tout ce que tu veux! Ce ne sera pas pris en compte comme étant des commandes. (ça s'écrit aussi en vert pour me t'y retrouver!)


clear all efface toutes les attributions de variables. Matlab efface toutes les variables qu'il avait en mémoire.
close all : ferme toutes les fenêtres (graphiques, visualisations...).
clc : efface la fenêtre de commande "command window". clc ne supprime pas les attributions de variables.

largeur=1000; : attribution de la valeur 1000 à la variable "largeur".

Nparticules=50000; : attribution de la valeur 1000 à la variable "largeur".

Image=[ones(largeur,1) zeros(largeur,1)];

la commande "ones(x,y)" crée une matrice de x lignes et y colonnes remplie avec des "1".
la commande "zeros(x,y)" crée une matrice de x lignes et y colonnes remplie avec des "0".
et si A et B sont deux matrices avec le même nombre de lignes, [A B] est une matrice avec autant de lignes que A et B et avec autant de colonnes que la somme des nombres de colonnes de A et B et remplie avec les matrices A et B sans changer l'ordre = concaténation de matrices!

Donc dasn ton cas Image est une matrice de 1000 lignes (=largeur) et 2 colonnes (=1+1). la première colonne n'est que des "1", la seconde que des "0".

Boucles for :

for i = a : b

loop

end

effectue la comande "loop" (qui peut être n'importe quoi) b-a+1 fois (pour i allant de a à b) et i est incrémenté de 1 à chaque fois.

depot=ceil(largeur*rand(1,1)); :

la commande "rand(x,y)" crée une matrice de x lignes et y colonnes remplies de valeurs aléatoires entre 0 et 1.

rand(1,1) va donner une matrice 1x1 donc un nombre normal. Sous Matlab, tout est une matrice, même un nombre!
Dans ce cas tu peux écrire "rand(1)" ou même "rand".

"largeur*rand" permet de trouver une valeur aléatoire entre "0" et "largeur" puisque rand est entre "0" et "1"

ceil(X) donne la valeur entière la plus proche de X et supérieure à X. (ceil(2.4)=3)
depot est donc une valeur entière aléatoire entre 1 et 1000.

boucle if regarde si la condition est vérifiée et applique la commande en fonction :

Ici :

si depot = 1 alors s est une matrice définie par s=[Image(largeur,:) ; Image((depot):(depot+1),:)];

Image(largeur,:) signifie que tu prends les largeur premières lignes et toutes les colonnes (:) de la matrice Image. (A(a:b,c:d) signifie que tu prends les lignes de a à b et les colonnes de c à d de la matrice A)

Comme depot=1, le double égale signifie qu'on teste l'affirmation. Le résultat est donc VRAI ou FAUX (booléen).
Image((depot):(depot+1),:) est une matrice composée des deux premières lignes et de toutes les colonnes de Image.

si A et B sont deux matrices avec le même nombre de colonnes, [A ; B] est une matrice avec autant de colonnes que A et B et avec autant de lignes que la somme des nombres de lignes de A et B et remplie avec les matrices A et B sans changer l'ordre = concaténation de matrices!

donc s est la matrice Image avec deux lignes supplémentaires en bas (en l'occurrence, les deux premières de Image)

et si depot /= (différent) de 1

alors tu arrives sur elseif (else = sinon en anglais) et la à cause du if tu as une nouvelle condition. "elseif" attaché est une notation spéciale de Matlab pour éviter d'avoir à mettre plusieurs "end" à la fin des boucles "if" si on veut en imbriquer plusieurs :

if condition1
command1

elseif condition2
command2

else command3

end

au lieu de

if condition1
command1

else
if condition2
command2

else command3
end
end


Revenons au programme

si depot = largeur (=1000)
alors s est une matrice avec les deux dernières lignes de Image (largeur est le nombre de lignes de Image) comme premières lignes et la première ligne de Image comme troisième ligne.

et sinon (si depot /=1 ET depot /=largeur)
s est une matrice de trois lignes. les trois lignes entre depot-1 et depot+1 de Image.

end signifie la fin de la boucle if.

sum(s) est un vecteur ligne (avec autant de colonnes que Image). la première valeur du vecteur sum(s) vaut la somme des éléments de la première colonne de la matrice s. la deuxième valeur du vecteur sum(s) vaut la somme des éléments de la deuxième colonne de la matrice s. etc

T=find(sum(s)>0) cherche les colonnes du vecteur sum(s) qui contiennent une valeur non nulle et attribue les indices de colonne au vecteur ligne T.

index=T(1,end) attribue à la variable "index" la valeur de la première ligne et dernière (end) colonne de T.
Comme T est un vecteur ligne, tu peux écrire juste "index=T(end);"

Image(depot, index+1)=1; attribue la valeur 1 à l'élément de Image situé à la ligne "depot" et à la colonne "index+1".
exemple
si Image =
a b
c d
e f
Image(2,1)=1 va donner :
Image =
a b
1 d
e f

Nouvelle boucle if

Image(:,end) sélectionne la dernière colonne de Image (":" permet de sélectionner toutes les lignes)
la fonction sum va donner la somme de tous les éléments de cette dernière colonne de Image.
Si cette somme est strictement positive alors
La nouvelle matrice Image sera composée de l'ancienne matrice Image à laquelle tu rajoutes une colonne à la fin composée uniquement de zéros.
end signifie la fin de la boucle if
end signifie la fin de la boucle for. Cela signifie que tu refais tout depuis "depot=ceil(largeur*rand(1));" jusqu'à ce end pour une nouvelle valeur de particule (incrémentation). La boucle sera au total effectuée Nparticules fois (50000 fois ici!).

Une fois que tous ces calculs sont finis, tu peux finir le programme:

size(A) donne les dimensions de la matrice A (nombre lignes, nombre colonnes) dans un vecteur ligne.
size(A,2) donnera uniquement la seconde dimension de A, soit le nombre de colonnes!

taille:-1:2 crée un vecteur qui va de "taille" à "2" avec un pas de "-1" (chaque élément est égal au précédent-1).


Image(:,taille:-1:2)'
va créer une matrice à partir de Image :
cette nouvelle matrice aura toutes les lignes de Image (:) et les colonnes seront celles de A indexées par les valeurs du vecteur "taille:-1:2".
ce vecteur sélectionne les colonnes de "2" à "taille" mais inverse leur ordre. (Prend d'abord la taille-ième puis celle juste avant...etc...jusqu'à la deuxième)

imagesc va créer une image à partir de cette matrice! Mais là je ne connais pas cette fonction et les explications Matlab ne m'inspirent pas réellement! Désolé!! tape help image pour essayer de comprendre! (Si vraiment tu ne comprends rien, je pourrais essayer plus tard mais pas là!! ;-)!

et sinon demande sur le forum! Tu auras surement des chances que quelqu'un t'aide si tu pose une question très précise!

la fonction colormap sert à définir la couleur de la figure!

Voilà, j'ai touot détaillé! Tu peux tout retrouver en utilisant la fonction help de Matlab! C'est aussi pour cela que tu ne trouveras pas beaucoup de monde pour faire ce boulot parce que tu es sensé de débrouiller un peu tout seul aussi! MAis si tu n'as jamais utilisé MAtlab, ni même à l'école, je peux comprendre que ce soit difficile! Il faut aussi arriver à bien imaginer les opérations sur les matrices dans sa tête et tout ira tout seul ;-)

A plus!

ben
5
mattkowsky Messages postés 28 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 13 janvier 2010
13 janv. 2010 à 07:52
Bonjour,
Merci beaucoup pour ton aide et surtout pour le temps que tu m'as accordé, je t'en suis très reconnaissant, tout est beaucoup plus clair maintenant. Bonne journée à toi.

Encore merci.
0
merci aussi,ca m a bcp bcp aidé
0
Bonjour,

Si ta question tient toujours, je m'y pencherai ce weekend dessus sinon je laisse tomber.
Dis moi si tu cherches encore ou si tu as trouve ailleurs ou si tu as abandonne!

Cordialement
-1
mattkowsky Messages postés 28 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 13 janvier 2010
12 janv. 2010 à 17:10
bonjour,
Désolé de ne pas avoir répondu avant, sinon oui je suis toujours en recherche... si tu peux m'apporter ton aide j'en serais ravi, merci d'avance.

bonne soirée
0