现在的位置: 首页 > 综合 > 正文

How MATLAB Stores Sparse Matrices

2013年08月14日 ⁄ 综合 ⁄ 共 2482字 ⁄ 字号 评论关闭

    To understand why the above examples are so slow, you need to understand how MATLAB stores its sparse matrices. An n-by-n MATLAB sparse matrix is stored as three arrays; I'll call them pi, and x. These three arrays are not directly accessible from M, but they can be accessed by a mexFunction. The nonzero entries in column j are stored in i(p(j):p(j+1)-1) and x(p(j):p(j+1)-1), where x holds the numerical values and iholds the corresponding row indices. Below is a very small example. First, I create a full matrix and convert it into a sparse one. This is only so that you can easily see the matrix C and how it's stored in sparse form. You should never create a sparse matrix this way, except for tiny examples.

C =
   (1,1)       4.5000
   (2,1)       3.1000
   (4,1)       3.5000
   (2,2)       2.9000
   (3,2)       1.7000
   (4,2)       0.4000
   (1,3)       3.2000
   (3,3)       3.0000
   (2,4)       0.9000
   (4,4)       1.0000

    Notice that the nonzero entries in C are stored in column order, with sorted row indices. The internal pi, and xarrays can be reconstructed as follows. The find(C) statement returns a list of "triplets," where the kth triplet isi(k)j(k), and x(k). This specifies that C(i(k),j(k)) is equal to x(k). Next, find(diff(...)) constructs the column pointer array p (this only works if there are no all-zero columns in the matrix).

column 1:
    k      row index     value
    1.0000    1.0000    4.5000
    2.0000    2.0000    3.1000
    3.0000    4.0000    3.5000
column 2:
    k      row index     value
    4.0000    2.0000    2.9000
    5.0000    3.0000    1.7000
    6.0000    4.0000    0.4000
column 3:
    k      row index     value
    7.0000    1.0000    3.2000
    8.0000    3.0000    3.0000
column 4:
    k      row index     value
    9.0000    2.0000    0.9000
   10.0000    4.0000    1.0000

Now consider what happens when one entry is added to C:

column 1:
    k      row index     value
    1.0000    1.0000    4.5000
    2.0000    2.0000    3.1000
    3.0000    3.0000   42.0000
    4.0000    4.0000    3.5000
column 2:
    k      row index     value
    5.0000    2.0000    2.9000
    6.0000    3.0000    1.7000
    7.0000    4.0000    0.4000
column 3:
    k      row index     value
    8.0000    1.0000    3.2000
    9.0000    3.0000    3.0000
column 4:
    k      row index     value
   10.0000    2.0000    0.9000
   11.0000    4.0000    1.0000

    and you can see that nearly every entry in C has been moved down by one in the i and x arrays. In general, the single statement C(3,1)=42 takes time proportional to the number of entries in matrix. Thus, looping nnz(A)times over the statement A(i,j)=A(i,j)+... takes time proportional to nnz(A)^2.

 

 

http://blogs.mathworks.com/loren/2007/03/01/creating-sparse-finite-element-matrices-in-matlab/

抱歉!评论已关闭.