22
Sparse Vector & Matrix Algebra Lecture #4 EEE 574 Dr. Dan Tylavsky

Sparse Vector & Matrix Algebra Lecture #4 EEE 574 Dr. Dan Tylavsky

  • View
    228

  • Download
    0

Embed Size (px)

Citation preview

Sparse Vector & Matrix Algebra

Lecture #4

EEE 574

Dr. Dan Tylavsky

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra Sparse Vector Algebra

– Integer Sets - Sets of integers may be thought of as a sparse storage technique for a vector of integers.

– Ex: List 1: {2,4,5,6}Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12

List(k): 0 1 0 1 1 1 0 0 0 0 0 0– Ex: List 1: {2,4,5,6} (Mutually exclusive lists.)

– List 2: {3,7,9}

– List 3: {1,10}

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12List(k): 3 1 2 1 1 1 2 0 2 3 0 0

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra– Merging Sparse Integer Sets

• Single Switch Technique/Single Use– Ex: Consider Merging

» List 1: {2,4,5,6} List 2: {1,2,7} List 3: {1,5}Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12

Switch(k): 0 0 0 0 0 0 0 0 0 0 0 0List(k)

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 0 1 0 1 1 1 0 0 0 0 0 0

List(k) 2 4 5 6

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 0 0 0 0 0 0

List(k) 2 4 5 6 1

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 0 0 0 0 0 0

List(k) 2 4 5 6 1

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0

List(k) 2 4 5 6 1 7

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0

List(k) 2 4 5 6 1 7

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0

List(k) 2 4 5 6 1 7

• N=Greatest Integer in any list

• M=Total # Elem. in all lists.

• = Unique Elem. in all lists.

• Write Operations– N Clear (Switch Vector)

– M Write “1” into Switch

– M Write into List

• Compare Operations– M Comparisons of Switch

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra– Merging Sparse Integer Sets

• Single Switch Technique/Single Use– Resultant list is unordered. List: {2,4,5,6,1,7}

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0

List(k) 2 4 5 6 1 7NewList(k)

• To order list, scan switch array in order (ascending/descending).

• Requires N Comparisons

• Sort Scheme Requires M(M-1)/2

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0

List(k) 2 4 5 6 1 7NewList(k) 1

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0

List(k) 2 4 5 6 1 7NewList(k) 1 2

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0

List(k) 2 4 5 6 1 7NewList(k) 1 2 4

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0

List(k) 2 4 5 6 1 7NewList(k) 1 2 4 5

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0

List(k) 2 4 5 6 1 7NewList(k) 1 2 4 5 6

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0

List(k) 2 4 5 6 1 7NewList(k) 1 2 4 5 6 7

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra

• To merge two new lists, no need to clear array. Simply use a different switch value. (Multiple Use Technique.)

• EX: Merge: List A {1,3,5}, List B {2,3,6}

• To clear array for next use, only clear location in NewList.

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0NxtList(k)

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 2 1 2 1 2 1 1 0 0 0 0 0NxtList(k) 1 3 5

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 2 2 2 1 2 1 1 0 0 0 0 0NxtList(k) 1 3 5 2

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 2 2 2 1 2 2 1 0 0 0 0 0NxtList(k) 1 3 5 2 6

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0

List(k) 2 4 5 6 1 7NewList(k) 1 2 4 5 6 7

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 1 1 0 1 1 1 1 0 0 0 0 0

List(k) 2 4 5 6 1 7NewList(k) 1 2 4 5 6 7

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 0 1 0 1 1 1 1 0 0 0 0 0

List(k) 0 4 5 6 1 7NewList(k) 1 2 4 5 6 7

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 0 0 0 1 1 1 1 0 0 0 0 0

List(k) 0 0 5 6 1 7NewList(k) 1 2 4 5 6 7

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 0 0 0 0 1 1 1 0 0 0 0 0

List(k) 0 0 0 6 1 7NewList(k) 1 2 4 5 6 7

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 0 0 0 0 0 1 1 0 0 0 0 0

List(k) 0 0 0 0 1 7NewList(k) 1 2 4 5 6 7

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 0 0 0 0 0 0 1 0 0 0 0 0

List(k) 0 0 0 0 0 7NewList(k) 1 2 4 5 6 7

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12Switch(k): 0 0 0 0 0 0 0 0 0 0 0 0

List(k) 0 0 0 0 0 0NewList(k) 1 2 4 5 6 7

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra– Adding Sparse Vectors

• Expanded Accumulator– Ex: Add the following sparse vectors stored in unordered compact form:

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

• Step 1: Merge Row Indices – {1,3,5,9,4}

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra• Step 2: Zero Merged List Positions in real vector of length N. (Expanded

Accumulator) {1,3,5,9,4}

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

• Step 3: Write first vector into accumulator.

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

ExAcc(k): X X X X X X X X X

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

ExAcc(k): 0.0 X 0.0 0.0 0.0 X X X 0.0

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

ExAcc(k): 2.0 X 3.0 0.0 4.0 X X X 5.0

• Step 4: Add subsequent lists to accumulator.

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

ExAcc(k): 2.0 X 3.0 0.0 10.0 X X X 5.0

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

ExAcc(k): 2.0 X 3.0 7.0 10.0 X X X 5.0

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

ExAcc(k): 10.0 X 3.0 7.0 10.0 X X X 5.0

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

ExAcc(k): 10.0 X 12.0 7.0 10.0 X X X 5.0

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra• Step 5: Use merged integer list to retrieve only relevant data.

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

ExAcc(k): 10.0 X 12.0 7.0 10.0 X X X 5.0

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

ExAcc(k): 10.0 X 12.0 7.0 10.0 X X X 5.0

Rindx(k): 1 3 5 9 4A(k): 10.0 12.0 10.0 5.0 7.0

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra– Adding Sparse Vectors

• Expanded Pointer Array– Ex: Add the following sparse vectors stored in unordered compact form:

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

• Step 1: Merge Row Index: {1,3,5,9,4}

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Switch(k): 1 X 2 5 3 X X X 4

• Step 2: Store in expanded pointer array the position that each element of A will occupy.

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra• Step 3: Clear first M position of A array.

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Switch(k): 1 X 2 5 3 X X X 4

• Step 4: Use R1Indx and Switch to write A1 into A.

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Switch(k): 1 X 2 5 3 X X X 4A(k): 0.0 0.0 0.0 0.0 0.0 X X X X

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Switch(k): 1 X 2 5 3 X X X 4A(k): 2.0 0.0 0.0 0.0 0.0 X X X X

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Switch(k): 1 X 2 5 3 X X X 4A(k): 2.0 3.0 0 0.0 0.0 X X X X

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Switch(k): 1 X 2 5 3 X X X 4A(k): 2.0 3.0 4.0 5.0 0.0 X X X X

• Step 5: Clear Switch array using merged list if necessary, {1,3,5,9,4}.

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Switch(k): 1 X 2 5 3 X X X 4A(k): 2.0 3.0 4.0 5.0 0.0 X X X X

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Switch(k): 1 X 2 5 3 X X X 4A(k): 2.0 3.0 10.0 5.0 0.0 X X X X

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Switch(k): 1 X 2 5 3 X X X 4A(k): 2.0 3.0 10.0 5.0 0.0 X X X X

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Switch(k): 1 X 2 5 3 X X X 4A(k): 2.0 3.0 10.0 5.0 7.0 X X X X

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Switch(k): 1 X 2 5 3 X X X 4A(k): 2.0 3.0 10.0 5.0 7.0 X X X X

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Switch(k): 1 X 2 5 3 X X X 4A(k): 10.0 12.0 10.0 5.0 7.0 X X X X

• Step 5: Use R2Indx and Switch to add A2 to A.

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra– Inner Product Calculation of Unordered Sparse Vectors

• Inner product of col. Vectors: a,b:

n

1iii

n

2

1

n21T ba

b

b

b

aaaba

– Ex: Perform an inner product of the following sparse vectors stored in unordered compact form:

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

• Step 1: Use an expanded pointer array to identify all non-zeros in A1.

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Pointer(k): 1 0 2 0 3 0 0 0 4

• Step 2: Using pointer array, compare A2 with A1 and accumulate all non-zero products.

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Pointer(k): 1 0 2 0 3 0 0 0 4Inner Prod: 24.0

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Pointer(k): 1 0 2 0 3 0 0 0 4Inner Prod: 24.0

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Pointer(k): 1 0 2 0 3 0 0 0 4Inner Prod: 24.0

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Pointer(k): 1 0 2 0 3 0 0 0 4Inner Prod: 40.0

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Pointer(k): 1 0 2 0 3 0 0 0 4Inner Prod: 40.0

Pos: 1 2 3 4 5 6 7 8 9 10 11 12R1Indx(k): 1 3 5 9 0 0 0 0 0 0 0 0

A1(k): 2.0 3.0 4.0 5.0

R2Indx(k): 5 4 1 3A2(k): 6.0 7.0 8.0 9.0

Pointer(k): 1 0 2 0 3 0 0 0 4Inner Prod: 67.0

• Position pointer array value at location k gives location of index k in array A1.

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra– Sparse Matrix Addition

• Assumption: Matrices stored in RR(C)U.• Procedure:

– Use multiple switch technique to symbolically add row by row. Symbolic result is data structure for numerical result.

– Using created data structure perform numerical result.

– (For something this simple, symbolic and numerical routines would be interwoven; however they will be kept separate in this example to emphasis the difference between symbolic and numerical operations.)

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix AlgebraInitialize: Switch=0,

End=0, IR=0

IR=IR+1

Merge RIndxA and RIndxB using multiple use switch technique with IR as switch value. Save merged indices as RIndxC.

Increment End on each entry into RIndxC.

Mark end of row of C data structure:ERP(IR)=End

IR=N?

Perform numerical segment.

No

Yes

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra• Symbolically add the following matrices stored in RR(C)U.

4.010.9.0

7.03.0

2.08.0

6.05.01.0

A

88.7.0

16.5.0

14.23.

11.7.02.0

B

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 4 2 1 3 4 1 3ERPB(K): 0 3 5 7 9

Switch(k): 0 0 0 0RCIndx(k):ERPC(K): 0

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 3 4 1 3ERPB(K): 0 3 5 7 9

Switch(k): 1 1 0 1RCIndx(k): 1 2 4ERPC(K): 0 3

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 3 4 1 3ERPB(K): 0 3 5 7 9

Switch(k): 1 1 1 1RCIndx(k): 1 2 4 3ERPC(K): 0 4

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 3 4 1 3ERPB(K): 0 3 5 7 9

Switch(k): 2 2 1 1RCIndx(k): 1 2 4 3 2 1ERPC(K): 0 4 6

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 1 3 3 4ERPB(K): 0 3 5 7 9

Switch(k): 2 2 3 3RCIndx(k): 1 2 4 3 2 1 3 4ERPC(K): 0 4 6 8

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 1 3 3 4ERPB(K): 0 3 5 7 9

Switch(k): 3 2 3 3RCIndx(k): 1 2 4 3 2 1 3 4 1ERPC(K): 0 4 6 9

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 1 3 3 4ERPB(K): 0 3 5 7 9

Switch(k): 4 2 4 4RCIndx(k): 1 2 4 3 2 1 3 4 1 1 3 4ERPC(K): 0 4 6 9 12

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix AlgebraInitialize: Switch=0, IR=0

Clear C(k) from 1 to N

IR=IR+1

Use Switch array to point to where each col. is stored in C(k).

Add A and B to appropriate locations in C from ERPA/B(IR-1)+1 to

ERPA(IR).

IR=N?

End

N

Y

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 1 3 3 4ERPB(K): 0 3 5 7 9

Switch(k): 0 0 0 0RCIndx(k): 1 2 4 3 2 1 3 4 1 1 3 4ERPC(K): 0 4 6 9 12

C(k):IR: 0

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 1 3 3 4ERPB(K): 0 3 5 7 9

Switch(k): 1 2 4 3RCIndx(k): 1 2 4 3 2 1 3 4 1 1 3 4ERPC(K): 0 4 6 9 12

C(k): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0IR: 1

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 1 3 3 4ERPB(K): 0 3 5 7 9

Switch(k): 1 2 4 3RCIndx(k): 1 2 4 3 2 1 3 4 1 1 3 4ERPC(K): 0 4 6 9 12

C(k): 1.0 5.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0IR: 1

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 1 3 3 4ERPB(K): 0 3 5 7 9

Switch(k): 1 2 4 3RCIndx(k): 1 2 4 3 2 1 3 4 1 1 3 4ERPC(K): 0 4 6 9 12

C(k): 3.0 12.0 6.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0IR: 1

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 1 3 3 4ERPB(K): 0 3 5 7 9

Switch(k): 6 5 4 3RCIndx(k): 1 2 4 3 2 1 3 4 1 1 3 4ERPC(K): 0 4 6 9 12

C(k): 3.0 12.0 6.0 11.0 2.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0IR: 2

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 1 3 3 4ERPB(K): 0 3 5 7 9

Switch(k): 6 5 4 3RCIndx(k): 1 2 4 3 2 1 3 4 1 1 3 4ERPC(K): 0 4 6 9 12

C(k): 3.0 12.0 6.0 11.0 2.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0IR: 2

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 1 3 3 4ERPB(K): 0 3 5 7 9

Switch(k): 6 5 4 3RCIndx(k): 1 2 4 3 2 1 3 4 1 1 3 4ERPC(K): 0 4 6 9 12

C(k): 3.0 12.0 6.0 11.0 25.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0IR: 2

Pos: 0 1 2 3 4 5 6 7 8 9 10 11 12A(k): 1.0 5.0 6.0 2.0 8.0 3.0 7.0 9.0 10.0 4.0

RAIndx(k): 1 2 4 2 1 3 4 1 3 4ERPA(K): 0 3 5 7 10

B(k): 2.0 7.0 11.0 23.0 14.0 5.0 16.0 7.0 88.0RBIndx(k): 1 2 3 2 1 1 3 3 4ERPB(K): 0 3 5 7 9

Switch(k): 10 5 11 12RCIndx(k): 1 2 4 3 2 1 3 4 1 1 3 4ERPC(K): 0 4 6 9 12

C(k): 3.0 12.0 6.0 11.0 25.0 22.0 19.0 7.0 5.0 9.0 17.0 92.0IR: 4

You can show that the arrays at completion have the form:

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra– Multiplying a Sparse Matrix by a Dense Vector.

• Ab=x– A is sparse.– b is dense.– x is dense.

• No need to perform symbolic manipulation.• Assume:

– A and b are store in RR(C)U, ordered compact form.

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix AlgebraInitialize: IR=0

Clear x(k) from 1 to N

IR=IR+1

Set pointer to begin/end or row: IBEG=ERPA(IR-1)+1, IEND=ERPA(IR).

Accumulate Inner Product and store in dense x using Inner Product Alg.*

IR=N?

End

N

Y

* You may wish to modify the inner product algorithm to take advantage of b being dense. There is no need to use a switch array since A indices can be used as pointers to locations in b.

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix Algebra– Multiplying a Sparse Matrix by a Sparse Vector.

• Ab=x– A is sparse.– b is sparse.– x is sparse?

• If x is stored as a sparse vector:– Perform symbolic manipulation.

• If x is stored as a dense vector:– No need to perform symbolic manipulation.

• Assume: – A and b are store in RR(C)U, CR(C)U

© Copyright 1999 Daniel Tylavsky

Sparse Vector & Matrix AlgebraInitialize: Switch=0, IR=0

Clear x(k)

IR=IR+1

Set pointer to begin/end or row: IBEG=ERPA(IR-1)+1, IEND=ERPA(IR).

Accumulate Inner Product and store in sparse x using Inner Product Alg.

IR=N?

End

N

Y

If x is sparse, perform symbolic program segment to get CRO/U.If x is dense, assume x is stored in ordered compact form.

The End