0

It is the first time I deal with column-compress storage (CCS) format to store matrices. After googling a bit, if I am right, in a matrix having n nonzero elements the CCS is as follows:

-we define a vector A_v of dimensions n x 1 storing the n non-zero elements 
 of the matrix

- we define a second vector A_ir of dimensions n x 1 storing the rows of the 
  non-zero elements of the matrix

-we finally define a third vector A_jc whose elements are the indices of the 
 elements of A_v which corresponds to the beginning of new column, plus a 
 final value which is by convention equal t0 n+1, and identifies the end of 
 the matrix (pointing theoretically to a virtual extra-column). 

So for instance, if

M = [1 0 4 0 0;
     0 3 5 2 0;
     2 0 0 4 6;
     0 0 7 0 8]

we get

A_v = [1 2 3 4 5 7 2 4 6 8];

A_ir = [1 3 2 1 2 4 2 3 3 4];

A_jc = [1 3 4 7 9 11];

my questions are

I) is what I wrote correct, or I misunderstood anything?

II) what if I want to represent a matri with some columns which are zeroes, e.g.,

   M2 = [0 1 0 0 4 0 0; 
         0 0 3 0 5 2 0;
         0 2 0 0 0 4 6;
         0 0 0 0 7 0 8]

wouldn't the representation of M2 in CCS be identical to the one of M?

Thanks for the help!

venom
  • 173
  • 1
  • 6

1 Answers1

0

I) is what I wrote correct, or I misunderstood anything?

You are perfectly correct. However, you have to take care that if you use a C or C++ library offsets and indices should start at 0. Here, I guess you read some Fortran doc for which indices are starting at 1. To be clear, here is below the C version, which simply translates the indices of your Fortran-style correct answer:

A_v  = unmodified

A_ir = [0 2 1 0 1 3 1 2 2 4] (in short [1 3 2 1 2 4 2 3 3 4] - 1)

A_jc = [0 2 3 6 8 10] (in short [1 3 4 7 9 11] - 1)

II) what if I want to represent a matri with some columns which are zeroes, e.g., M2 = [0 1 0 0 4 0 0; 0 0 3 0 5 2 0; 0 2 0 0 0 4 6; 0 0 0 0 7 0 8]

wouldn't the representation of M2 in CCS be identical to the one of M?

I you have an empty column, simply add a new entry in the offset table A_jc. As this column contains no element this new entry value is simply the value of the previous entry. For instance for M2 (with index starting at 0) you have:

A_v  = unmodified
A_ir = unmodified
A_jc = [0 0 2 3 6 8 10]   (to be compared to [0 2 3 6 8 10])

Hence the two representations are differents.


If you just start learning about sparse matrices there is an excelllent free book here: http://www-users.cs.umn.edu/~saad/IterMethBook_2ndEd.pdf

Picaud Vincent
  • 10,518
  • 5
  • 31
  • 70
  • 1
    Many thanks! Indeed, I implicitly referred to the matlab implementation. Thanks for your clarification on the extra-0 for the empty columns! – venom Nov 18 '17 at 21:59