<< metanet metanet metanet_module_path >>

metanet >> metanet > bandwr

bandwr

réduction de largeur de bande pour une matrice creuse

Séquence d'appel

[iperm,mrepi,prof,ierr] = bandwr(sp,[iopt])
[iperm,mrepi,prof,ierr] = bandwr(lp,ls,n,[iopt])

Paramètres

sp

matrice creuse

lp

vecteur ligne d'entiers

ls

vecteur ligne d'entiers

n

entier

iopt

entier

iperm

vecteur ligne d'entiers

mrepi

vecteur ligne d'entiers

prof

vecteur ligne d'entiers

ierr

entier

Description

bandwr résout le problème de la réduction de largeur de bande pour une matrice creuse : la matrice est supposée triangulaire supérieure avec une diagonale pleine.

Dans la première séquence d'appel, sp désigne une matrice creuse; l'argument optionnel iopt vaut 0 ou 1 : 1 si réduire le profil de la matrice est plus important que réduire la largeur de bande et 0 si la largeur de bande est plus important.

La deuxième séquence d'appel correspond à la description d'un graphe : lp est un vecteur ligne de pointeurs de la description du graphe sous forme de liste d'adjacence (sa taille est le nombre de sommets du graphe + 1); ls est un vecteur ligne, tableau de sommets de la description du graphe sous forme de liste d'adjacence (sa taille est le nombre d'arêtes du graphe, c'est à dire le nombre de termes non-nuls de la matrice creuse associée). n est le nombre de sommets (dimension de sp).

iperm est le vecteur de la permutation pour réordonner les lignes et les colonnes, qui réduit la largeur de bande et/ou le profil (nouvelle numérotation des sommets du graphe). mrepi est la permutation inverse (mrepi(iperm) est l'identité). prof est le tableau donnant le profil de la matrice creuse après la réduction de largeur de bande si iopt vaut 1. Si iopt vaut 0 ce tableau est nul sauf pour le premier terme, donnant alors la largeur de bande. La simple commande max(prof(2:$)-prof(1:($-1))) renvoie la largeur de bande de la matrice. ierr est un entier indiquant une erreur si sa valeur est non nulle.

Exemples

//Construction du graphe initial
ta=[2  1 3 2 2 4 4 5 6 7 8 8 9 10 10 10 10 11 12 13 13 14 15 16 16 17 17];
he=[1 10 2 5 7 3 2 4 5 8 6 9 7 7 11 13 15 12 13  9 14 11 16 1 17 14 15];
g=make_graph('foo',0,17,ta,he);
g.nodes.graphics.x=[283 163 63 57 164 164 273 271 339 384 504 513 439 623 631 757 642];
g.nodes.graphics.y=[59 133 223 318 227 319 221 324 432 141 209 319 428 443 187 151 301];
//Première visualisation
g.nodes.graphics.name=string(1:17);
g.nodes.graphics.display='name';
show_graph(g);

a=graph_2_mat(g,'node-node');
ww=tril(a)'+eye();
ww1=full(ww);
scf(1);
hist3d((ww1+tril(ww1',-1)+tril(ww1,-1)'),52,85); 
// Réduction de largeur de bande de la matrice
[iperm,mrepi,prof,ierr]=bandwr(ww);
disp(max(prof(2:$)-prof(1:($-1))));

// Le graphe avec la nouvelle numérotation
g2=g;
g2.nodes.graphics.name=string(iperm);
show_graph(g2,'new')
// La nouvelle matrice
n=g.nodes.number;
yy=ww1(mrepi,mrepi);
scf(3)
hist3d((yy+tril(yy',-1)+tril(yy,-1)'),52,85); 

// On recommence avec la même matrice
[ij,v,mn]=spget(ww);
g1=make_graph('foo',0,n,ij(:,1)',ij(:,2)');
g1.nodes.graphics.x=g.nodes.graphics.x;g1.nodes.graphics.y=g.nodes.graphics.y;
// Le graphe
//show_graph(g1,'rep');
[lp,la,ls] = adj_lists(1,n,g1.edges.tail,g1.edges.head);
[iperm,mrepi,prof,ierr]=bandwr(lp,ls,n,0);
g2=g;g2.nodes.graphics.name=string(iperm);
show_graph(g2,'new');

<< metanet metanet metanet_module_path >>