Sparse Matrix-Vector product using evaluation

April 11 2006 by roman_pearce 1191
false
Maple

0


This tip comes care of Dr. Michael Monagan at Simon Fraser University. Represent your sparse matrix as a list of rows, and represent each row as a linear equation in an indexed name. For example:

A := [[1,0,3],[2,0,0],[0,4,5]];

S := [ 1*x[1] + 3*x[3], 2*x[1], 4*x[2]+5*x[3] ];

To compute the product of the matrix A with a Vector X, assign x[i] := V[i] and evaluate. This can be done inside of a procedure because x is a table.

V := [7,8,9]: for i to 3 do x[i] := V[i] end do: eval(S); # result

for i to 3 do x[i] := evaln(x[i]) end do: # unassign

Don't forget to unassign. Note that this method of assignment is slow when V is a big list. In short, we need to use "for i in V", which does one nice linear pass through V. This is what I do:

n := 0; count := proc() global n; n := n+1 end proc:

for i in V do x[count()] := i end do: eval(S);

for i to 3 do x[i] := evaln(x[i]) od:

In a real procedure, n would be lexically scoped and not a global variable. Instead of an explicit loop you can also use seq and assign.

n := 0; count := proc() global n; n := n+1 end proc:

seq(assign(x[count()],i), i=V);

eval(S);

seq(unassign('x[i]'), i=1..3);

Of course, where this trick really shines is in doing back substitution. You can easily substitute tens of thousands of variables into any number of equations, all in linear time.


Loading Comments

You must be logged into your MaplePrimes account in order to post a comment. If you don't have an account, you can create an account here.

     

Forgot Your Password? Create an Account