sparse matrices

35
Sparse Matrices sparse … many elements are zero dense … few elements are zero

Upload: erek

Post on 12-Jan-2016

57 views

Category:

Documents


0 download

DESCRIPTION

Sparse Matrices. sparse … many elements are zero dense … few elements are zero. Example Of Sparse Matrices. diagonal tridiagonal lower triangular (?) These are structured sparse matrices. May be mapped into a 1D array so that a mapping function can be used to locate an element. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Sparse Matrices

Sparse Matrices

sparse … many elements are zero

dense … few elements are zero

Page 2: Sparse Matrices

Example Of Sparse Matricesdiagonal

tridiagonal

lower triangular (?)

These are structured sparse matrices.

May be mapped into a 1D array so that a mapping function can be used to locate an element.

Page 3: Sparse Matrices

Unstructured Sparse Matrices

Airline flight matrix. airports are numbered 1 through n flight(i,j) = list of nonstop flights from airport i to

airport j n = 1000 (say) n x n array of list references => 4 million bytes total number of flights = 20,000 (say) need at most 20,000 list references => at most

80,000 bytes

Page 4: Sparse Matrices

Unstructured Sparse Matrices

Web page matrix.web pages are numbered 1 through n

web(i,j) = number of links from page i to page j

Web analysis.authority page … page that has many links to it

hub page … links to many authority pages

Page 5: Sparse Matrices

Web Page Matrix n = 2 billion (and growing by 1 million a day) n x n array of ints => 16 * 1018 bytes (16 * 109

GB) each page links to 10 (say) other pages on

average on average there are 10 nonzero entries per

row space needed for nonzero elements is

approximately 20 billion x 4 bytes = 80 billion bytes (80 GB)

Page 6: Sparse Matrices

Representation Of Unstructured Sparse Matrices

Single linear list in row-major order.scan the nonzero elements of the sparse matrix in

row-major order

each nonzero element is represented by a triple

(row, column, value)

the list of triples may be an array list or a linked list (chain)

Page 7: Sparse Matrices

Single Linear List Example

0 0 3 0 4

0 0 5 7 0

0 0 0 0 0

0 2 6 0 0

list =

row 1 1 2 2 4 4

column 3 5 3 4 2 3

value 3 4 5 7 2 6

Page 8: Sparse Matrices

Array Linear List Representation

row 1 1 2 2 4 4

list = column 3 5 3 4 2 3

value 3 4 5 7 2 6

element 0 1 2 3 4 5

row 1 1 2 2 4 4

column 3 5 3 4 2 3

value 3 4 5 7 2 6

Page 9: Sparse Matrices

Chain Representation

Node structure.

row col

nextvalue

Page 10: Sparse Matrices

Single Chain

row 1 1 2 2 4 4

list = column 3 5 3 4 2 3

value 3 4 5 7 2 6

1 3

3

1 5

4

2

5

2

7

4

2

4

6

3 4 3null

firstNode

2

Page 11: Sparse Matrices

One Linear List Per Row

0 0 3 0 4

0 0 5 7 0

0 0 0 0 0

0 2 6 0 0

row1 = [(3, 3), (5,4)]

row2 = [(3,5), (4,7)]

row3 = []

row4 = [(2,2), (3,6)]

Page 12: Sparse Matrices

Array Of Row Chains

Node structure.

next

valuecol

Page 13: Sparse Matrices

Array Of Row Chains

0 0 3 0 4

0 0 5 7 0

0 0 0 0 0

0 2 6 0 0

row[]

33

null

45

53

null

74

22

null

63

null

Page 14: Sparse Matrices

Orthogonal List Representation

Both row and column lists.

Node structure.

row col

nextdown

value

struct NodeS { int r; // row number int c; // column number struct NodeS *rptr; // row pointer struct NodeS *cptr; // column header int data; // actual data };typedef struct NodeS NodeS;

Page 15: Sparse Matrices

Row Lists

0 0 3 0 4

0 0 5 7 0

0 0 0 0 0

0 2 6 0 0null

1 3 3 1 5 4

2 3 5 2 4 7

4 2 2 4 3 6

n

n

n

Page 16: Sparse Matrices

Column Lists

0 0 3 0 4

0 0 5 7 0

0 0 0 0 0

0 2 6 0 0

1 3 3 1 5 4

2 3 5 2 4 7

4 2 2 4 3 6

n

nn

Page 17: Sparse Matrices

Orthogonal Lists

0 0 3 0 4

0 0 5 7 0

0 0 0 0 0

0 2 6 0 0null

row[]

1 3 3 1 5 4

2 3 5 2 4 7

4 2 2 4 3 6

n n

n

nnn

Page 18: Sparse Matrices

Variations

May use circular lists instead of chains.

Page 19: Sparse Matrices

Sparse matrices Represent each column of a sparse matrix as a circularly linked list with

a head node. A similar representation for each row of a sparse matrix. Each node has a tag field that is used to distinguish between head

nodes and entry nodes. Each head node has three additional fields: down, right, and next.

down field: links into a column list right field: links into a row list next field: links the head nodes together

The head node for row i is also the head node for column i, and the total number of head nodes is max {number of rows, number of columns}.

Page 20: Sparse Matrices

Each entry node has six fields: tag, row, col, down, right, value. down field: links to the next nonzero term in the same col

umn right field: links to the next nonzero term in the same row

A num_rows × num_cols matrix with num_terms nonzero terms needs max{num_rows, num_cols} + num_terms + 1 nodes.

Total storage will be less than num_rows × num_cols when num_terms is sufficiently small.

Page 21: Sparse Matrices

4 4

1 012

2 1-4

0 211

3 3-15

1 15

15000

0040

00512

01100

Page 22: Sparse Matrices

struct NodeS

{ int r; // row number

int c; // column number

struct NodeS *rptr; // row pointer

struct NodeS *cptr; // column header

int data; // actual data

};

typedef struct NodeS NodeS;

Page 23: Sparse Matrices

NodeS* create(NodeS *h)

{ NodeS *ptr, *ptr1, *ptr2, *node;

NodeS *row_ptr, *column_ptr, *row_header, *column_header;

int i,j,d;

int r, c;

printf("\nEnter the no. of rows ::");

scanf("%d", &r);

printf("Enter the no. of columns ::");

scanf("%d", &c);

// create the head node

h=(NodeS *)malloc(sizeof(NodeS));

h->r=r;

h->c=c;

h->rptr=h;

h->cptr=h;

h->data=0;

Page 24: Sparse Matrices

// create column headers

ptr=h;

for(i=1;i<=c;i++)

{ NodeS *node;

node=(NodeS *)malloc(sizeof(NodeS));

node->r=0;

node->c=i;

node->data=0;

node->rptr=h;

node->cptr=node;

ptr->rptr=node;

ptr=node;

}

Page 25: Sparse Matrices

// create row headers

ptr=h;

for(i=1;i<=r;i++)

{ NodeS *node;

node=(NodeS *)malloc(sizeof(NodeS));

node->r=i;

node->c=0;

node->data=0;

node->rptr=node;

node->cptr=h;

ptr->cptr=node;

ptr=node;

}

Page 26: Sparse Matrices

printf("\nNow enter the non zero elements one by one\n");

printf("\nEnter row number,column number, data\n");

printf("Enter (0 0 0) to stop ::");

scanf("%d%d%d",&i, &j, &d);

if(i>r || j>c ||i<1 ||j<1)

{ printf("Error in input");

exit(1);

}

Page 27: Sparse Matrices

while(i&&j&&d)

{ row_header=h->cptr;

column_header=h->rptr;

// find the correct row header and column header

while(row_header->r<i)

row_header=row_header->cptr;

while(column_header->c<j)

column_header=column_header->rptr;

Page 28: Sparse Matrices

// find the correct position to insert

row_ptr=row_header;

while((row_ptr->c)<j)

{ ptr1=row_ptr;

row_ptr=row_ptr->rptr;

if(row_ptr==row_header)

break;

}

Page 29: Sparse Matrices

column_ptr=column_header;

while(column_ptr->r<i)

{ ptr2=column_ptr;

column_ptr=column_ptr->cptr;

if(column_ptr==column_header)

break;

}

Page 30: Sparse Matrices

node=(NodeS *)malloc(sizeof(NodeS));

node->r=i;

node->c=j;

node->data=d;

ptr1->rptr=node;

ptr2->cptr=node;

node->rptr=row_ptr;

node->cptr=column_ptr;

Page 31: Sparse Matrices

printf("\nEnter row number,column number,data\n");

printf("Enter (0 0 0) to stop ::");

scanf("%d%d%d", &i, &j, &d);

if(i>r || j>c )

{ printf(" error input");

exit(1);

}

}

return h;

}

Page 32: Sparse Matrices

void display(NodeS*h)

{

NodeS *right;

right=h->cptr;

while(right!=h)

{

NodeS *r=right;

right=right->rptr;

while(right!=r)

{

printf("%d\t%d\t%d\n", right->r, right->c, right->data);

right=right->rptr;

}

right=right->cptr;

}

}

Page 33: Sparse Matrices

void add(NodeS*h1,NodeS*h2){ NodeS *r1, *r2, *p1, *p2; if(h1->r==h2->r && h1->c==h2->c) printf("The addition of the two given sparse

matrices is ::\n"); else { printf("addition is not possible"); exit(1); } r1=h1->cptr; r2=h2->cptr;

Page 34: Sparse Matrices

while(r1!=h1) { p1=r1; r1=r1->rptr;

p2=r2; r2=r2->rptr;

while(r1!= p1 && r2!=p2) { if(r1->c==r2->c) { printf("%d\t%d\t%d\n", r1->r, r1->c, (r1->data+r2->data)); r1=r1->rptr; r2=r2->rptr; } else if(r1->c>r2->c) { printf("%d\t%d\t%d\n", r2->r, r2->c, r2->data); r2=r2->rptr; } else { printf("%d\t%d\t%d\n", r1->r, r1->c, r1->data); r1=r1->rptr; } }

Page 35: Sparse Matrices

while(r1!=p1) { printf("%d\t%d\t%d\n", r1->r, r1->c, r1->data); r1=r1->rptr; } while(r2!=p2) { printf("%d\t%d\t%d\n", r2->r, r2->c, r2->data); r2=r2->rptr; } r1=r1->cptr; r2=r2->cptr; }}