Matrices Dispersas
Matrices Dispersas
Matrices Dispersas
Miguel Vargas-Flix
[email protected]
http://www.cimat.mx/~miguelvargas
CIMAT, August 14, 214 1/!4
Matrices "ispersas
Son matrices en las cuales la gran mayora de las entradas son cero.
En ingls se les conoce como sparse matrices, en algunos pases de habla hispana tambin se les
conoce como matrices ralas.
Sea A una matriz dispersa de tamao nn. Deinamos la notaci!n ( A), "ue indica el n#mero de
entradas no cero de A.
$or e%emplo
A=
(
a
&&
a
&'
a
&(
) ) ) )
a
'&
a
''
) a
'*
a
'+
) )
a
(&
) a
((
a
(*
) ) )
) a
*'
a
*(
a
**
) a
*,
)
) a
+'
) ) a
++
) a
+-
) ) ) a
,*
) a
,,
a
,-
) ) ) ) a
-+
a
-,
)
)
,
el n#mero de entradas de A es --=*., el n#mero de entradas distintas de cero es ( A)=''.
http://www.cimat.mx/~miguelvargas 2/!4
/on las matrices dispersas se pueden traba%ar 0cilmente matrices de millones de renglones por
millones de columnas.
1 2eces se re"uiere solo 2isualizar las entradas distintas de cero, para ello se usan im0genes como
las siguientes3
#a$"a"a %im&trica Tria$gular
4os puntos negros representan las entradas de la matriz "ue son distintas de cero.
http://www.cimat.mx/~miguelvargas !/!4
Matrices "ispersas c'm' gra('s
5n grao est0 ormado por un con%uto de 2rtices y un con%unto de aristas G=( V, E).
6 4os 2rtices est0n numerados, V es el con%unto de todos los 2rtices.
6 /ada arista conecta dos 2rtices. El con%unto de aristas E est0 ormado por pares no ordenados
de 2rtices. 4os graos en los cuales no importa el orden se llaman graos no dirigidos.
$or e%emplo3
1
2
!
4
)
*
+
En este caso, el con%unto de 2rtices es
V={&, ', (, *, +, ,, -},
el con%unto de aristas es
E={(&, ') , (&, () , (&, *) , (&, ,) , (', *) , ( (, *) , ((, +) , (*, -) , (+, -)}.
http://www.cimat.mx/~miguelvargas 4/!4
5na matriz dispersa con estructura simtrica se puede representar como un grao no dirigido.
En el grao no est0n representados los 2alores de la matriz, s!lo la estructura de las entradas
distintas de cero.
Sea A una matriz dispersa de tamao nn.
/ada 2rtice del grao de A representa un rengl!n 7columna8 de la matriz, V=
{
v
&,
v
',
, v
n
}
.
El n#mero de aristas es igual al n#mero de entradas no cero de la matriz ( A), as
E=
{
e
&,
e
',
, e
( A)
}
.
/ada entrada no cero de la matriz a
i j
) es representada con una arista e
k
=
(
v
i
, v
j
)
, con
k=&, ', , ( A).
E%emplo3
(
( ) . ) )
) * ) , &
. ) ' ) )
) , ) 9 +
) & ) + (
)
1
2
!
4
)
http://www.cimat.mx/~miguelvargas )/!4
Matrices "ispersas "e mallas "e eleme$t' (i$it'
En el mtodo de elemento inito, se traba%a de orma contraria, se parte de la malla 7grao8 y con la
matriz de conecti2idades se genera la matriz dispersa.
En las mallas de elemento inito tenemos un dominio discretizado en elementos, tri0ngulos o
cuadril0teros en 'D, tetraedros o he:aedros en (D.
1 2
! 4
)
*
+
(
a
&&
a
&'
a
&(
) ) ) )
a
'&
a
''
a
'(
a
'*
a
'+
) )
a
(&
a
('
a
((
a
(*
) ) )
) a
*'
a
*(
a
**
a
*+
a
*,
)
) a
+'
) a
+*
a
++
a
+,
a
+-
) ) ) a
,*
a
,+
a
,,
a
,-
) ) ) ) a
-+
a
-,
a
--
)
http://www.cimat.mx/~miguelvargas */!4
Dado "ue un nodo de la malla se conecta s!lo con pocos nodos, tendremos una matriz muy
dispersa. En general, el tamao del n#mero de entradas distintas de cero ser0 ;( n).
k
i j
(
a
i i
a
i j
)
a
j i
a
j j
)
) ) a
k k
)
En el e%emplo, a
i j
) dado "ue est0n conectados con la arista (i , j ). En cambio a
i k
=) puesto "ue
no e:iste una arista (i , k ). De igual orma a
k j
=) dado "ue no e:iste ( k , j ).
http://www.cimat.mx/~miguelvargas +/!4
4as mallas pueden llegar a ser muy comple%as. El siguiente es el e%emplo de una malla de elemento
inito en (D ormada por tetraedros.
http://www.cimat.mx/~miguelvargas ,/!4
$oder representar la estructura de matrices dispersas como graos nos permitir0 aplicar 2arios
conceptos de teora de graos "ue resultar0n en transormaciones a la matriz.
$or e%emplo3
6 <eordenar la matriz para reducir el n#mero de c0lculos.
6 $artir la matriz para en2iarla a distintas computadoras y paralelizar los c0lculos.
http://www.cimat.mx/~miguelvargas -/!4
Almace$amie$t' "e matrices "ispersas
4as matrices llenas de tamao nn tienen un costo de almacenamiento de ;(n
'
), las matrices
dispersas suelen tener un costo de almacenamiento de ;( n).
/omo e%emplo, la siguiente matriz A
++,++,
contine ().,&(, entradas, con ( A)=&9&), es
decir s!lo el ).+9= de las entradas son no cero.
http://www.cimat.mx/~miguelvargas 1/!4
$ara ahorrar tanto memoria como tiempo de procesamiento s!lo almacenaremos los elementos de
la matriz A "ue sean distintos de cero.
>ay 2arias estratgias de almacenamiento en memoria de matrices dispersas, dependiendo de la
orma en "ue se accesar0n las entradas.
.'r c''r"e$a"as
$ara una matriz dispersa A de tamao mn, las entradas dierentes de cero ser0n enumeradas con
k=&, ',, ( A).
4as entradas se alamacenan por medio de tres 2ectores V, I y J. Estos contendr0n el 2alor V
k
, el
n#mero de rengl!n I
k
y el n#mero de columna J
k
de la k?sima entrada no cero.
(
9 * ) ) ) )
) ) & ( ) )
' ) & ) - )
) . ( ) ) &
) ) ) ) ) +
)
9 *
1 2
& (
! 4
. (
2 !
&
*
+
*
V
1 1 2 2
' &
1 !
-
)
! ! ! 4 4 4 )
J
I
Entre m0s grande sea el tamao de la matriz m0s notorio ser0 el ahorro en memoria.
http://www.cimat.mx/~miguelvargas 11/!4
1dem0s de utilizar menos memoria, la otra gran dierencia con respecto a las matrices completas
es "ue en las matrices dispersas las entradas de la matriz deben ser buscadas.
(
9 * ) ) ) )
) ) & ( ) )
' ) & ) - )
) . ( ) ) &
) ) ) ) ) +
)
9 *
1 2
& (
! 4
. (
2 !
&
*
+
*
V
1 1 2 2
' &
1 !
-
)
! ! ! 4 4 4 )
J
I
$or e%emplo @cu0l es el 2alor de la entrada a
*,
A
@/u0l es el 2alor de la entrada a
++
A
@/u0l es la primer entrada distinta de cero de la columna ,A
@/u0ntas entradas distintas de cero tiene el rengl!n (A
El costo de b#s"ueda es muy ele2ado, ya "ue en el peor caso hay "ue buscar en todos las entradas.
http://www.cimat.mx/~miguelvargas 12/!4
Este mtodo no es adecuado si se necesitan accessar todos los elementos de un rengl!n o columna
de orma secuencial.
Se pueden ordenar los 2ectores 7por rengl!n o por columna8. 1l ordenar se puede utilizar una
b#s"ueda binaria para encontrar una entrada a
i j
, sto reduce el costo de la b#s"ueda a log
'
( A).
(
9 * ) ) ) )
) ) & ( ) )
' ) & ) - )
) . ( ) ) &
) ) ) ) ) +
)
9 *
1 2
& (
! 4
. (
2 !
&
*
+
*
V
1 1 2 2
' &
1 !
-
)
! ! ! 4 4 4 )
J
I
Acceso a: Costo mximo
Entrada a
i j
7sin ordenar8 ( A)
Entrada a
i j
7ordenando8 log
'
( A)
Este tipo de almacenamiento es adecuado cuando se lee de orma incremental las entradas la
matriz. Este ormato es muy utilizado para almacenar matrices dispersas en archi2os.
http://www.cimat.mx/~miguelvargas 1!/!4
C'mpresse" /'w %t'rage
El mtodo Compressed Row Storage 7compresi!n por renglones8 BSaad)( p(,'C, se guardan las
entradas no cero de cada rengl!n de A por separado.
9 * ) ) ) )
) ) & ( ) )
' ) & ) - )
) . ( ) ) &
) ) ) ) ) +
9 *
1 2
& (
! 4
' &
1 !
-
)
. (
2 !
&
*
+
*
V
(
={', &, -}
J
(
={&, (, +}
/on este mtodo, por cada rengl!n de la matriz se guardan dos arreglos para las entradas distintas
de cero de cada rengl!n. 5n 2ector J
i
conteniendo los ndices y otro V
i
los 2alores, con i=&, , m.
Este es"uema es adecuado cuando todos 7o casi todos8 los renglones tienen al menos una entrada
distinta de cero.
Este tipo de es"uema se puede crear utilizando un 2ector de 2ectores.
http://www.cimat.mx/~miguelvargas 14/!4
@/omo cambia el costo de b#s"ueda en relaci!n al almacenamiento por coordenadasA
9 * ) ) ) )
) ) & ( ) )
' ) & ) - )
) . ( ) ) &
) ) ) ) ) +
9 *
1 2
& (
! 4
' &
1 !
-
)
. (
2 !
&
*
+
*
V
(
={', &, -}
J
(
={&, (, +}
@/u0l es el 2alor de la entrada a
*,
A
@/u0l es el 2alor de la entrada a
++
A
@/u0l es la primer entrada distinta de cero de la columna ,A
@/u0ntas entradas distintas de cero tiene el rengl!n (A
http://www.cimat.mx/~miguelvargas 1)/!4
Sea
(
J
i
)
el n#mero de entradas no cero del rengl!n i de A.
4os c!stos de b#s"ueda de las entradas ahora son3
Acceso a: Costo mximo
Entrada a
i j
(
J
i
)
$rimer 2alor no cero de un rengl!n &
j?simo 2alor no cero de un rengl!n &
$rimer 2alor no cero de una columna
i =&
m
(
J
i
)
=( A)
i?simo 2alor no cero de una columna
i =&
m
(
J
i
)
=( A)
http://www.cimat.mx/~miguelvargas 1*/!4
$odemos reducir el costo de acceso ordenando por ndice las entradas de cada rengl!n.
1s, al momento de accesar podremos utilizar un patr!n b#s"ueda binaria.
Acceso a: Costo mximo
Entrada a
i j
log
'
(
(
J
i
))
$rimer 2alor no cero de un rengl!n &
j?simo 2alor no cero de un rengl!n &
$rimer 2alor no cero de una columna
i =&
m
log
'
(
(
J
i
))
i?simo 2alor no cero de una columna
i =&
m
log
'
(
(
J
i
))
http://www.cimat.mx/~miguelvargas 1+/!4
Multiplicaci0$ matri1 vect'r
<ealizar la multiplicaci!n matriz?2ector utilizando compresi!n por renglones resulta muy 0cil.
En la multiplicaci!n matriz?2ector c=Ab el !rden de b#s"ueda es ;(&), esto es por"ue no se hace
una b#s"ueda de las entradas del reng!n, se toman las entradas una tras otra.
Sea J
i
el con%unto de entradas no cero del rengl!n i de A.
(
c
&
c
'
c
(
c
*
c
+
c
,
)
=
(
9 * ) ) ) )
) ) & ( ) )
' ) & ) - )
) . ( ) ) &
) ) ) ) ) +
)
(
+
*
)
&
'
.
)
9 *
1 2
& (
! 4
' &
1 !
-
)
. (
2 !
&
*
+
*
+
*
)
'
&
.
c
i
=
k J
i
V
i
k
J
i
k c
i
=
i =&
n
a
i j
j
c
&
c
'
c
(
c
+
c
*
c
,
=
4a 2enta%a de utilizar compresi!n por renglones es "ue los datos de cada rengl!n de la matriz de
rigidez son accesados en secuencia uno tras otro, esto producir0 una 2enta%a de acceso al entrar el
blo"ue de memoria de cada rengl!n en el cac!e del /$5.
http://www.cimat.mx/~miguelvargas 1,/!4
C'mpresse" C'lum$ %t'rage
1n0logamente a la compresi!n por renglones, e:iste el mtodo Compressed Column Storage en el
cual se almacena por columna en 2ez de por rengl!n.
9 * ) ) ) )
) ) & ( ) )
' ) & ) - )
) . ( ) ) &
) ) ) ) ) +
9 '
1 !
* .
1 4
& &
2 !
(
4
(
2
-
!
V
(
={&, &, (}
I
(
={', (, *}
& +
4 )
$or cada columna de la matriz se guardan dos arreglos para las entradas distintas de cero. 5no I
j
conteniendo los ndices y otro V
j
los 2alores, con j=&,, n.
Este es"uema es adecuado cuando se "uiere buscar entradas por columna y no por rengl!n.
http://www.cimat.mx/~miguelvargas 1-/!4
Sea
(
I
j
)
es el n#mero de entradas no cero de la columna j de A. 4os c!stos de b#s"ueda de las
entradas ahora son3
Acceso a: Costo mximo
Entrada a
i j
(
I
j
)
$rimer 2alor no cero de un rengl!n
j=&
n
(
I
j
)
=( A)
j?simo 2alor no cero de un rengl!n
j=&
n
(
I
j
)
=( A)
$rimer 2alor no cero de una columna &
i?simo 2alor no cero de una columna &
http://www.cimat.mx/~miguelvargas 2/!4
Este es"uema es #til cuando se 2an a buscar entradas por columna y no por rengl!n. $or e%emplo,
al multiplicar dos matrices dispersas.
Sean A
mp
y B
pn
, la multiplicaci!n C=AB,
c
i j
=
k=)
p
a
i k
k j
es con2eniente almacenar A utilizando compresi!n por renglones y B con compresi!n por
columnas. El acceso de las entradas de ambas matrices dispersas ser0 con2eniente para el cache.
$or e%emplo3
(
c
&&
c
&'
c
&(
c
&*
c
'&
c
' '
c
'(
c
' *
c
(&
c
('
c
((
c
(*
c
*&
c
* '
c
*(
c
* *
c
+&
c
+'
c
+(
c
+*
)
=
(
9 * ) ) ) )
) ) & ( ) )
' ) & ) - )
) . ( ) ) &
) ) ) ) ) +
)
(
) & ) )
( ) * )
& ) ) )
) & ) &
' ) ) &
) ) - )
)
9 *
1 2
& (
! 4
' &
1 !
-
)
. (
2 !
&
*
+
*
( &
2 !
& &
1 4
* -
2 *
& &
4 )
'
)
c
&&
c
'&
c
(&
c
+&
c
*&
=
c
&'
c
''
c
('
c
+'
c
*'
c
&(
c
'(
c
((
c
+(
c
*(
c
&*
c
'*
c
(*
c
+*
c
**
http://www.cimat.mx/~miguelvargas 21/!4
Matrices "ispersas e$ Mat2a3/4ctave
Danto Mat4ab como ;cta2e tienen soporte para mane%ar matrices dispersas.
El ormato para deinir matrices dispersas es utilizando almacenamiento por coordenadas.
5n e%emplo sencillo3
I = [1, 1, 2, 3, 3, 3, 5, 5];
J = [1, 5, 3, 1, 4, 5, 1, 4];
V = [9, 2, 5, 6, 2, 6, 1, 8];
A = sparse(I, J, V);
A
spy(A);
nnz(A)
full(A)
sparse(I, J, V) crea una matriz dispersa, el I contiene los ndices de rengl!n, J los ndices de
columna y V los 2alores.
spy(A) despliega una igura mostrando las entradas no cero de la matriz A.
nnz(A) indica el n#mero de entradas distintas de cero en la matriz 1.
full(A) con2ierte la matriz dispersa en una matriz llena.
http://www.cimat.mx/~miguelvargas 22/!4
Almace$amie$t' c'$ ('rmat' MAT56ile versi'$ 4
Eamos a utilizar el ormato M1D?File 2ersi!n * de M1D41G para alamacenar las matrices
dispersas. 4os archi2os con ormato M1D?File 2ersi!n * sir2en para almacenar escalares, 2ectores,
matrices completas y matrices dispersas en ormato binario.
$or e%emplo3
I = [1, 1, 2, 3, 3, 3, 5, 5];
J = [1, 5, 3, 1, 4, 5, 1, 4];
V = [9, 2, 5, 6, 2, 6, 1, 8];
A = sparse(I, J, V);
x = [0, 1.1, 4, 20, 11, 0, 0 ,2];
Huardar en ormato M1D?File *3
save('-v4', 'test_file.!t', 'A', 'x');
4eer archi2o3
load('test_file.!t');
Este ormato unciona tanto con M1D41G como con ;cta2e.
http://www.cimat.mx/~miguelvargas 2!/!4
En el ormato M1D?File 2ersi!n * todos los elementos son almacenados como matrices. $or
e%emplo3
6 5n escalar es una matriz de tamao &:&.
6 5n 2ector columna es una matriz con I renglones y una columna.
/ada archi2o M1D?File 2ersi!n * puede contener 2arias matrices. Se guardan una detr0s de otra.
>ay ( ormatos de matrices3 completas, dispersas y te:to 7estas #ltimas no las 2amos a utilizar8.
4as matrices se guardan en ormato binario.
4a orma m0s simple de abrir un archi2o M1D?File 2ersi!n * 7con ormato binario8 es con3
FILE7 (ile8
(ile 9 fopen:;file_name.mat;, ;r3;<8
JrbJ signiica read binary.
http://www.cimat.mx/~miguelvargas 24/!4
=l e$ca3e1a"'
/ada matriz comienza con un header de 5 enteros de ('bits "ue contiene inormaci!n sobre los
atributos de la matriz. $odemos leer estos enteros as3
int hea"er>)?8
fread:hea"er, sizeof:int<, ), (ile<8
headerB)C 7int8, indica el ormato de la matriz y el tipo de datos para la matriz3
Matrix c'mpleta
1 Text'
2 Matri1 rala
+0 double
@1 (l'at
@2 i$t
@! sh'rt
@4 u$sig$e" sh'rt
@) u$sig$e" char
$odemos leer estos par0metros as3
int ('rmat 9 hea"er>? A 18
int tBpe 9 hea"er>? 5 ('rmat8
El signiicado de los siguientes cuatro enteros depende del tipo de matriz.
http://www.cimat.mx/~miguelvargas 2)/!4
Matrices c'mpletas
7int8 headerB&C, n#mero de renglones
7int8 headerB'C, n#mero de columnas
7int8 headerB(C, tipo de 2alores
/eales
1 C'mpleC's
7int8 headerB*C, longitud del nombre de la matriz K &. Iormalmente la longitud m0:ima es ,( K &.
7car!"8, arreglo de caracteres, nombre de la matriz K LM)N
7double!"8 1rreglo de 2alores, corresponde a las entradas reales de la matriz. El n#mero de 2alores
es renglonesOcolumnas. #os $alores est%n almacenados por columnas. El 2alor & corresponde a
la entrada 7&,&8, el 2alor ' a la entrada 7',&8 y as sucesi2amente.
7double!"8 S!lo si es el tipo de 2alores 7headerB(C8 indica comple%os. Ealores imaginarios de la
matriz. El n#mero de 2alores es renglonesOcolumnas. 4os 2alores est0n almacenados por
columnas, de igual orma "ue los reales.
http://www.cimat.mx/~miguelvargas 2*/!4
E%emplo de matriz completa
A=[0, 1.1, 2; 3, 4, 5; 6, ", 8]
A =
0.00000 1.10000 2.00000
3.00000 4.00000 5.00000
6.00000 7.00000 8.00000
save('-v4', 'f#ll.!t', 'A');
El archi2o contendr03
! !
2 *)
, *4 24 *4 1)4 1)!
1)! 1)! 1)! 1)! 241 *! 1* *4
2, *4 *4
2 *4 !2 *4
:int< hea"er>? 6'rmat' B el tip' "e "at's para la matri1 : 9 (ull matrix, @ 9 "'u3le<
:int< hea"er>1? DEmer' "e re$gl'$es :!<
:int< hea"er>2? DEmer' "e c'lum$as :!<
:int< hea"er>!? Tip' "e val'res : 9 real<
:int< hea"er>4? 2'$gitu" "el $'m3re "e la matri1 @ 1 :2<
:char>2?< Arregl' "e caracteres, $'m3re "e la matri1 @ FGH :IAGJ<
:double>-?< C'rresp'$"e a las e$tra"as reales "e la matri1 :"'u3les, , 3Btes ca"a val'r<
4os 2alores int&' y double est0n gurdados con ormato 4ittle?Endian.
http://www.cimat.mx/~miguelvargas 2+/!4
E%emplo de c!mo leer una matriz llena3
FILE7 (ile 9 fopen:argv>1?, ;r3;<8
int hea"er>)?8
fread:hea"er, sizeof:int<, ), (ile<8
int ('rmat 9 hea"er>? A 18
int tBpe 9 hea"er>? 5 ('rmat8
if :('rmat 99 < // Full matrix
K
int r'ws 9 hea"er>1?8
int c'ls 9 hea"er>2?8
int (iel" 9 hea"er>!?8
int $ameLsi1e 9 hea"er>4?8
char $ame>12,?8
fread:$ame, $ameLsi1e, 1, (ile<8
double7 real 9 new double>r'ws7c'ls?8
fread:real, sizeof:double<, r'ws7c'ls, (ile<8
double7 imag 9 DM228
if :(iel" 99 1< // Complex
K
ima 9 new double>r'ws7c'ls?8
fread:imag, sizeof:double<, r'ws7c'ls, (ile<8
N
// ...
delete >? imag8 delete >? real8
N
fclose:(ile<8
http://www.cimat.mx/~miguelvargas 2,/!4
Matrices "ispersas
7int8 headerB&C, n#mero de entradas no cero K &, ( A)+&
7int8 headerB'C, tipo de 2alores
! /eales
4 C'mpleC's
7int8 headerB(C, 2alor i%o en )
7int8 headerB*C, longitud del nombre de la matriz K &
7car!"8 1rreglo de caracteres, nombre de la matriz K LM)N
7double!"8 1rreglo de indices de rengl!n. El n#mero de ndices es ( A)
7double8 I#mero de renglones
7double!"8 1rreglo de indices de columna. El n#mero de ndices es ( A)
7double8 I#mero de columnas
7double!"8 Ealores. El n#mero de 2alores es ( A)
7double8 Ealor i%o en )
(ota importante3 El n#mero de renglones y de columnas est0n guardadas con double, no con int.
http://www.cimat.mx/~miguelvargas 2-/!4
s$! = sparse([1, 2, 1, 3], [1, 1, 2, 2], [%1, 2, 1.1, 3])
s$! =
Compressed Column Sparse (rows = 3, cols = 2, nnz = 4 67!"#
(1, 1# $% $1
(2, 1# $% 2
(1, 2# $% 1.1000
(3, 2# $% 3
save('-v4', 's$!&se.!t', 's$!');
2 ) !
4 11) 112 -+ 24 *!
*4 24 *!
, *4 , *4
24 *! 24 *!
*4 *4
*4 24 1-1
*4 1)4 1)! 1)! 1)! 1)! 1)! 241 *!
, *4
:int< hea"er>? 6'rmat' B tip' "e "at's para la matri1 :2 9 sparse matrix, @ 9 "'u3le<
:int< hea"er>1? DEmer' "e e$tra"as $' cer' @ 1 :) 9 4 @ 1<
:int< hea"er>2? Tip' "e val'res :! 9 real<
:int< hea"er>!? Oal'r (iC' e$ :<
:int< hea"er>4? 2'$gitu" "el $'m3re "e la matri1 @ 1 :4 9 ! @ 1<
:char>4?< Arregl' "e caracteres, $'m3re "e la matri1 @ FGH :IspaGJ<
:double>4?< Arregl' "e i$"ices "e re$gl0$ :4 "'u3les<
:double< DEmer' "e re$gl'$es :!<
:double>4?< Arregl' "e i$"ices "e c'lum$a :4 "'u3les<
:double< DEmer' "e c'lum$as
:double>4?< =$tra"as "e la matri1 :4 "'u3les<
:double< Oal'r (iC' e$
http://www.cimat.mx/~miguelvargas !/!4
E%emplo de c!mo escribir una matriz dispersa3
const char7 $ame 9 ;spa;8
int $ameLsi1e 9 strlen:$ame< @ 18
double r'ws 9 !8
double c'ls 9 28
double I>4? 9 K1, 2, 1, !N8
double P>4? 9 K1, 1, 2, 2N8
double O>4? 9 K51, 2, 1.1, !N8
FILE7 (ile 9 fopen:;sparse.mat;, ;w3;<8
int hea"er>)?8
hea"er>? 9 2 @ 8 // 2 = sparse matrix, +0 = double
hea"er>1? 9 4 @ 18 // Number of non-zero + 1
hea"er>2? 9 !8 // = real
hea"er>!? 9 8 // fixed !alue 0
hea"er>4? 9 $ameLsi1e8 // name len"t# + 1
fwrite:hea"er, sizeof:int<, ), (ile<8
fwrite:$ame, sizeof:char<, $ameLsi1e, (ile<8
fwrite:I, sizeof:double<, 4, (ile<8
fwrite:Qr'ws, sizeof:double<, 1, (ile<8
fwrite:P, sizeof:double<, 4, (ile<8
fwrite:Qc'ls, sizeof:double<, 1, (ile<8
fwrite:O, sizeof:double<, 4, (ile<8
double 1er' 9 8
fwrite:Q1er', sizeof:double<, 1, (ile<8
fclose:(ile<8
http://www.cimat.mx/~miguelvargas !1/!4
Iota importante3 En el ormato de matrices dispersas, las entradas deben estar ordenadas, primero
por el ndice de columna y segundo por el ndice de rengl!n.
$or e%emplo, la siguiente matriz rala3
(
9 * ) ) ) )
) ) & ( ) )
' ) & ) - )
) . ( ) ) &
) ) ) ) ) +
)
9 *
1 2
& (
! 4
. (
2 !
&
*
+
*
V
1 1 2 2
' &
1 !
-
)
! ! ! 4 4 4 )
J
I
$ara poder ser leida correctamente por Mat4ab hay "ue reordenar las entradas en base a los ndices
de columna y rengl!n antes de guardarla. De la siguiente orma3
(
9 * ) ) ) )
) ) & ( ) )
' ) & ) - )
) . ( ) ) &
) ) ) ) ) +
)
9 *
1 2
& (
! 4
. (
2 !
&
*
+
*
V
1 1 2 2
' &
1 !
-
)
! ! ! 4 4 4 )
J
I
;cta2e es menos riguroso con el orden de los ndices, pero por compatibilidad es me%or
ordenarlos.
http://www.cimat.mx/~miguelvargas !2/!4
R.regu$tasS
[email protected]
http://www.cimat.mx/~miguelvargas !!/!4
/e(ere$cias
B$iss9*C S. $issanetzPy. Sparse Matri: Dechnology. 1cademic $ress, &.9*.
BSaad)(C Q. Saad. Rterati2e Methods or Sparse 4inear Systems. SR1M, '))(.
http://www.cimat.mx/~miguelvargas !4/!4