Las siguientes funciones permiten crear matrices dispersas. Casi todas estas funciones tienen muchas posibles formas de ser utilizadas, con distintos argumentos y valores de retorno. Se recomienda ver el Help de MATLAB para tener una información más detallada.
Capítulo 4: Otros tipos de datos de MATLAB página 47
speye(m,n) Matriz identidad dispersa de tamaño m×n con unos en la diagonal sprand(m,n) Matriz aleatoria dispersa con distribución uniforme
sprandn(m,n) Matriz aleatoria dispersa con distribución normal sprandsym(n) Matriz aleatoria simétrica
spdiags(A) Matriz dispersa a partir de las diagonales de otra matriz
sparse(m,n) Crea una matriz dispersa de tamaño m×n con todos los elementos cero sparse(A) Crea una matriz dispersa a partir de una matriz llena
sparse(i,j,val,m,n) Construye una matriz dispersa a partir de: i vector de índices de fila, j vector de índices de columna, val vector de valores, m número de filas, n número de columnas, y un 6º argumento que permite definir el máximo nnz (por defecto en el tamaño de val) por si se quieren añadir después más elementos
full(S) Convierte una matriz dispersa en una matriz llena
find(S) Encuentra los índices de los elementos distintos de cero y los devuelve como si la matriz fuera un vector (por columnas).
[i,j,val]=find(S) Devuelve índices de fila, de columna y valores de los elementos, a partir de los cuáles se puede volver a crear la matriz
spy(S) Representa en una figura los elementos distintos de cero de la matriz nnz(S) Devuelve el número de elementos distintos de cero
nonzeros(S) Devuelve un vector lleno que contiene los elementos distintos de cero nzmax(S) Memoria reservada para elementos distintos de cero
spones(S) Reemplazar los elementos distintos de cero por unos spalloc(m,n,nzmax) Reserva espacio para una matriz dispersa m×n issparse(S) Devuelve true si el argumento es una matriz dispersa 4.5.2. OPERACIONES CON MATRICES DISPERSAS
Las matrices dispersas son más “delicadas” que las matrices llenas. En concreto, son muy sensibles a la ordenación de sus filas y columnas. El problema no es tanto la matriz dispersa en sí, como las matrices –también dispersas- que resultan de las factorizaciones LU o de Cholesky necesarias para resolver sistemas de ecuaciones, calcular valores y vectores propios, etc. En estas factorizaciones puede haber muchos elementos cero que dejan de serlo y esto es un grave problema para la eficiencia de los cálculos. Reordenando las filas y columnas de una matriz dispersa se puede minimizar el número de elementos que se hacen distintos de cero al factorizar (llenado o fill-in). MATLAB dispone de dos formas principales de reordenación: los métodos del mínimo grado (minimum degree) y de Cuthill-McKee inverso (reversed Cuthill-McKee). A continuación se describen las funciones más importantes de MATLAB en esta categoría.
spfun('fun', S) Aplica una función a los elementos distintos de cero de la matriz S
p=colmmd(S) Devuelve el vector de permutaciones de columnas calculado con el método del mínimo grado (minimum degree). Para matrices no simétricas esta permutación tiende a producir factorizaciones LU más dispersas. p=symmmd(S) Devuelve el vector de permutaciones de filas y columnas (symmetric
minimum degree permutation). Aplicando esta permutación a las filas y columnas se obtienen factorizaciones de Cholesky más dispersas.
p=symrcm(S) Obtiene un vector de permutaciones por el método de Cuthill-McKee inverso tal que, aplicado a filas y columnas de S, obtiene matrices con los
elementos agrupados alrededor de la diagonal principal (mínima anchura de banda). Se aplica a matrices simétricas y no simétricas.
p=colperm(S) Obtiene una permutación de columnas que ordena las columnas en orden de número de ceros no decreciente. A veces se utiliza para ordenar antes de aplicar la factorización LU. Si la matriz es simétrica la permutación se puede aplicar a filas y a columnas.
randperm(n) Calcula una permutación aleatoria de los n primeros números naturales 4.5.3. OPERACIONES DE ÁLGEBRA LINEAL CON MATRICES DISPERSAS
A continuación se describen muy brevemente las funciones de MATLAB que pueden utilizarse para operar con matrices dispersas. Algunas de estas funciones se llaman igual que las correspondientes funciones para matrices llenas, y otras son específicas de matrices dispersas. Casi todas estas funciones tienen varias formas de utilizarse. Para más detalles se sugiere recurrir al Help.
[L,U,P]=lu(S) Realiza la factorización LU
L=chol(S) Realiza la factorización de Cholesky [Q,R]=qr(S) Realiza la factorización QR
[L,U]=luinc(A,tol) Realiza una factorización LU incompleta
L=cholinc(S) Calcula una factorización de Cholesky incompleta (Ver la Ayuda) [V,D,FLAG] = eigs(S) Calcula algunos valores propios de una matriz cuadrada. Esta
función tiene muchas posibles formas: consultar la Ayuda
svds(S) Calcula algunos valores singulares de una matriz rectangular. Esta función tiene muchas posibles formas: consultar la Ayuda
normest(S,tol) Estimación de la norma sub-2 con una determinada tolerancia (por defecto 1e-06)
condest(S) Estimación de condición numérica sub-1 sprank(S) Calcula el rango de una matriz dispersa
symbfact(S) Symbolic factorization analysis. Devuelve información sobre los elementos que se harán distintos de cero en la factorización de Cholesky, sin llegar a realizar dicha factorización
Los sistemas de ecuaciones con matrices dispersas se pueden resolver con métodos directos, que son variantes de la eliminación gaussiana. El camino habitual de acceder a los métodos directos es a través de los operadores / y \, igual que para matrices llenas.
También se pueden utilizar métodos iterativos, que tienen la ventaja de no cambiar ningún elemento de la matriz. Se trata de obtener soluciones aproximadas después de un número finito de pasos.
Se llama factorizaciones “incompletas” a aquéllas que no calculan la factorización exacta sino una aproximada, despreciando los elementos que se hacen distintos de cero pero tienen un valor pequeño. Aunque la factorización es incompleta y sólo aproximada, se puede hacer en mucho menos tiempo y para ciertas finalidades es suficiente. Estas factorizaciones incompletas se utilizan por ejemplo como pre-condicionadores de algunos métodos iterativos.
Las siguientes funciones son muy especializadas y aquí sólo se van a citar sus nombres (en inglés, tal como los utiliza MATLAB). Para más información recurrir al Help y a la bibliografía especializada.
Capítulo 4: Otros tipos de datos de MATLAB página 49
pcg() Resuelve un sistema de ecuaciones lineales por el método del Gradiente Conjugado Pre-condicionado (Preconditioned Conjugate Gradients Method). La matriz debe ser simétrica y positivo-definida
bicg() BiConjugate Gradients Method. Similar al anterior para matrices cuadradas que no son simétricas y positivo-definidas
bicgstab() BiConjugate Gradients Stabilized Method. cgs() Conjugate Gradients Squared Method gmres() Generalized Minimum Residual Method qmr() Quasi-Minimal Residual Method
spparms() Establece los parámetros para las funciones que trabajan con matrices sparse (set parameters for sparse matrix routines)
spaugment() Form least squares augmented system 4.5.4. OPERACIONES CON MATRICES DISPERSAS
El criterio general para trabajar con matrices dispersas en MATLAB es que casi todas las operaciones matriciales estándar funcionan de la misma forma sobre matrices dispersas que sobre matrices llenas. De todas formas, existen algunos criterios particulares que conviene conocer y que se enuncian a continuación:
1. Las funciones que aceptan una matriz como argumento y devuelven un escalar o un vector siempre devuelven un vector lleno, aunque el argumento sea disperso
2. Las funciones que aceptan como argumentos escalares o vectores y devuelven matrices devuelven matrices llenas
3. Las funciones de un solo argumento que reciben una matriz y devuelven una matriz o vector conservan el carácter del argumento (disperso o lleno). Ej: chol(), diag(), max(), sum()
4. Las funciones binarias devuelven resultados dispersos si ambos argumentos son dispersos. Si un operando es lleno devuelven lleno, excepto si la operación conserva los elementos cero y distintos de cero (por ejemplo: .* y ./)
5. La concatenación de matrices con cat o corchetes [ ] produce resultados dispersos para operaciones mixtas
6. Sub-indexado de matrices; S(i,j) a la derecha de una asignación produce resultados dispersos, mientras que a la izquierda de una asignación (=) mantiene el tipo de almacenamiento de S.