- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

After looking here, I can't understand the compressed row format.

Specifically, I don't understand *pointerE* (and OK with the rest): it should be the index in the *values*array that is the last non zero element in each row, if I look on the example they give for **zero based indexing**, the last non zero element of the first row is -3 and it is the third element in the values array **but in zero indexing** it should be element #2. The last non zero element of the second row is 5 which is the fifth element in values **but in zero indexing** it should be #4 so pointerE should be [2,4,7,10,12] but in the example it shows [3,5,8,11,13]

what am I missing here?

Once again I am using **zero based indexing** so where does this bias come from?

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

The 4 array compressed sparse row (CSR) format uses the following definitions (0 based indexing):

- pointerB
*= first element of row i in columns and values arrays* - pointerE
*=***one past the last element of row i**in columns and values arrays - columns
= column index value - values
= value of matrix

If you are using the most simple case of CSR (which is the 3 array CSR format) with contiguous memory storage of all elements then you can think of pointerE as pointerB+1 (That is, pointerE* = pointerB[i+1] ) using pointer arithmetic.*

This is typically sufficient for most cases, but there are times when you want to do more complicated operations like pass in a sub-matrix or do a permutation of a matrix rows, in which case using the two row pointers (beginning (B) and one past ending (E) ) makes this possible. Notice that the Intel Math Kernel Library does support the sub-matrix usage, but currently it does guarantee correctness if the pointer arrays are used to pass in a row permutation of the matrix.

For me it helps to think of the pointerB/E arrays as defining half open half closed intervals for the rows:

CSR 3 array:

row i is found on **[ pointerB , pointerB[i+1] )**

*in columns and values arrays*

CSR 4 array: (more general)

row i is found on** [ pointerB , pointerE )**

*in columns and values arrays*

As you note, it does get a little more complicated with one based indexing. If we use the variable ind=0 or 1 to denote the indexing, then the general form is as follows:

- pointerB
*-ind = first element of row i in columns and values arrays* - pointerE
*-ind =***one past the last element of row i**in columns and values arrays - columns
= ind-based column index value (columns *-ind is 0 based column index value)* - values
= value of matrix

so that

CSR 3 array:

row i is found on **[ pointerB -ind, pointerB[i+1]-ind )**

*in columns and values arrays (with columns stored in base ind fomat)*

CSR 4 array: (more general)

row i is found on **[ pointerB -ind, pointerE-ind )**

*(with columns stored in base ind fomat)*

*in columns and values arrays*Link Copied

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

The 4 array compressed sparse row (CSR) format uses the following definitions (0 based indexing):

- pointerB
*= first element of row i in columns and values arrays* - pointerE
*=***one past the last element of row i**in columns and values arrays - columns
= column index value - values
= value of matrix

If you are using the most simple case of CSR (which is the 3 array CSR format) with contiguous memory storage of all elements then you can think of pointerE as pointerB+1 (That is, pointerE* = pointerB[i+1] ) using pointer arithmetic.*

This is typically sufficient for most cases, but there are times when you want to do more complicated operations like pass in a sub-matrix or do a permutation of a matrix rows, in which case using the two row pointers (beginning (B) and one past ending (E) ) makes this possible. Notice that the Intel Math Kernel Library does support the sub-matrix usage, but currently it does guarantee correctness if the pointer arrays are used to pass in a row permutation of the matrix.

For me it helps to think of the pointerB/E arrays as defining half open half closed intervals for the rows:

CSR 3 array:

row i is found on **[ pointerB , pointerB[i+1] )**

*in columns and values arrays*

CSR 4 array: (more general)

row i is found on** [ pointerB , pointerE )**

*in columns and values arrays*

As you note, it does get a little more complicated with one based indexing. If we use the variable ind=0 or 1 to denote the indexing, then the general form is as follows:

- pointerB
*-ind = first element of row i in columns and values arrays* - pointerE
*-ind =***one past the last element of row i**in columns and values arrays - columns
= ind-based column index value (columns *-ind is 0 based column index value)* - values
= value of matrix

so that

CSR 3 array:

row i is found on **[ pointerB -ind, pointerB[i+1]-ind )**

*in columns and values arrays (with columns stored in base ind fomat)*

CSR 4 array: (more general)

row i is found on **[ pointerB -ind, pointerE-ind )**

*(with columns stored in base ind fomat)*

*in columns and values arrays*- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page