Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Acceso a matrices dispersas

Elementos distintos de cero

Hay varios comandos que proporcionan información de alto nivel sobre los elementos distintos de cero de una matriz dispersa:

  • Devuelve el número de elementos distintos de cero en una matriz dispersa.nnz

  • Devuelve un vector de columna que contiene todos los elementos distintos de cero de una matriz dispersa.nonzeros

  • Devuelve la cantidad de espacio de almacenamiento asignada para las entradas distinto de cero de una matriz dispersa.nzmax

Para probar algunos de estos, cargue la matriz dispersa suministrada, una de las colecciones Harwell-Boeing.west0479

load west0479 whos
  Name            Size             Bytes  Class     Attributes    west0479      479x479            34032  double    sparse   

Esta matriz modela una columna de destilación química de ocho etapas.

Prueba estos comandos.

nnz(west0479)
ans =          1887
format short e west0479
west0479 =    (25,1)      1.0000e+00   (31,1)     -3.7648e-02   (87,1)     -3.4424e-01   (26,2)      1.0000e+00   (31,2)     -2.4523e-02   (88,2)     -3.7371e-01   (27,3)      1.0000e+00   (31,3)     -3.6613e-02   (89,3)     -8.3694e-01   (28,4)      1.3000e+02      .      .      .
nonzeros(west0479)
ans =     1.0000e+00   -3.7648e-02   -3.4424e-01    1.0000e+00   -2.4523e-02   -3.7371e-01    1.0000e+00   -3.6613e-02   -8.3694e-01    1.3000e+02     .     .     .

Nota

Se usa para detener el anuncio en cualquier momento.Ctrl + Cnonzeros

Tenga en cuenta que inicialmente tiene el mismo valor que de forma predeterminada.nnznzmax Es decir, el número de elementos distintos de cero equivale al número de ubicaciones de almacenamiento asignadas para los nonceros. Sin embargo, no libera dinámicamente la memoria si usted cero los elementos adicionales de la matriz.MATLAB® Cambiar el valor de algunos elementos de matriz a cero cambia el valor de, pero no el de.nnznzmax

Sin embargo, puede agregar tantos elementos distintos de cero a la matriz como desee. No está restringido por el valor original de.nzmax

Índices y valores

Para cualquier matriz, completa o dispersa, la función devuelve los índices y valores de elementos distintos de cero.find Su sintaxis es

[i,j,s] = find(S);

Devuelve los índices de fila de valores distintos de cero en Vector, los índices de columna en Vector y los valores distintos de cero en el vector.findijs El ejemplo siguiente utiliza para ubicar los índices y valores de los nonceros en una matriz dispersa.find La función utiliza la salida, junto con el tamaño de la matriz, para recrear la matriz.sparsefind

S1 = west0479; [i,j,s] = find(S1); [m,n] = size(S1); S2 = sparse(i,j,s,m,n);

Indexación en operaciones de matriz dispersa

Dado que las matrices dispersas se almacenan en formato de columna dispersa comprimida, hay diferentes costos asociados con la indexación en una matriz dispersa que con la indexación en una matriz completa. Estos costos son insignificantes cuando se necesita cambiar sólo unos pocos elementos en una matriz dispersa, por lo que en esos casos es normal utilizar la indexación de matrices regulares para reasignar valores: para almacenar la nueva matriz con at, inserta una fila adicional en los valores distintos de cero Vect o los vectores de subíndice, luego desplaza todos los valores de la matriz después.

B = speye(4); [i,j,s] = find(B); [i,j,s]
ans =       1     1     1      2     2     1      3     3     1      4     4     1
B(3,1) = 42; [i,j,s] = find(B); [i,j,s]
ans =       1     1     1      3     1    42      2     2     1      3     3     1      4     4     1
42(3,1)MATLAB(3,1)

Si se utiliza la indexación lineal para acceder o asignar un elemento en una matriz dispersa grande, se producirá un error si el índice lineal supera, que es el límite superior actual para el número de elementos permitidos en una matriz.2^48-1

S = spalloc(2^30,2^30,2); S(end) = 1
Maximum variable size allowed by the program is exceeded.

Para acceder a un elemento cuyo índice lineal es mayor que, utilice la indexación de matrices:intmax

S(2^30,2^30) = 1
S =           (1073741824,1073741824)              1

Mientras que el costo de la indexación en una matriz dispersa para cambiar un solo elemento es insignificante, se agrava en el contexto de un bucle y puede llegar a ser bastante lento para matrices grandes. Por esta razón, en los casos en los que es necesario cambiar muchos elementos de matriz dispersa, es mejor vectorizar la operación en lugar de utilizar un bucle. Por ejemplo, considere una matriz de identidad dispersa: cambiar los elementos de una toma de bucle es más lento que una operación vectorizada similar: puesto que almacena matrices dispersas en formato de columna dispersa comprimida, necesita desplazar varias entradas durante cada paso a través h el loop.

n = 10000; A = 4*speye(n);
A
tic A(1:n-1,n) = -1;  A(n,1:n-1) = -1;  toc
Elapsed time is 0.003344 seconds.
tic for k = 1:n-1   C(k,n) = -1;    C(n,k) = -1;  end toc
Elapsed time is 0.448069 seconds.
MATLABA

La asignación previa de la memoria para una matriz dispersa y, a continuación, rellenarla de forma similar a un elemento, produce una cantidad significativa de sobrecarga en la indexación en la matriz dispersa:

S1 = spalloc(1000,1000,100000); tic; for n = 1:100000     i = ceil(1000*rand(1,1));     j = ceil(1000*rand(1,1));     S1(i,j) = rand(1,1); end toc
Elapsed time is 2.577527 seconds.

La construcción de los vectores de índices y valores elimina la necesidad de indexar en el array disperso, y por lo tanto es significativamente más rápido:

i = ceil(1000*rand(100000,1)); j = ceil(1000*rand(100000,1)); v = zeros(size(i)); for n = 1:100000     v(n) = rand(1,1); end  tic; S2 = sparse(i,j,v,1000,1000); toc
Elapsed time is 0.017676 seconds.

Por esa razón, es mejor construir matrices dispersas a la vez usando una función de construcción, como las funciones o.sparsespdiags

Por ejemplo, supongamos que quiere la forma dispersa de la matriz de coordenadas:C

C=(4000104001004010101014114)

Construya la matriz de cinco columnas directamente con la función utilizando los pares de tripletes para los subgrupos de filas, los subvalores de columna y los values: el orden de los valores en la salida refleja el almacenamiento subyacente por columnas.sparse

i = [1 5 2 5 3 5 4 5 1 2 3 4 5]'; j = [1 1 2 2 3 3 4 4 5 5 5 5 5]'; s = [4 1 4 1 4 1 4 1 -1 -1 -1 -1 4]'; C = sparse(i,j,s)
C =     (1,1)        4    (5,1)        1    (2,2)        4    (5,2)        1    (3,3)        4    (5,3)        1    (4,4)        4    (5,4)        1    (1,5)       -1    (2,5)       -1    (3,5)       -1    (4,5)       -1    (5,5)        4
Para obtener más información sobre cómo almacena matrices dispersas, véase John R. Gilbert, Cleve moler y Robert Schreiber, (13:1, 333 – 356 (1992)).MATLABMatrices dispersas en Matlab: diseño e implementaciónSIAM Journal on Matrix análisis y aplicaciones

Visualizando matrices dispersas

A menudo es útil usar un formato gráfico para ver la distribución de los elementos distintos de cero dentro de una matriz dispersa. La función MATLAB genera una vista de plantilla de la estructura de dispersión, donde cada punto del gráfico representa la ubicación de un elemento de matriz distinto de cero.spy

Por ejemplo:

Cargue la matriz dispersa suministrada, una de las colecciones Harwell-Boeing.west0479

load west0479

Ver la estructura de la dispersión.

spy(west0479)

Consulte también

Temas relacionados