By
Amruta Purandare
University of Pittsburgh
Ted Pedersen
University of Minnesota, Duluth
Mahesh Joshi
University of Minnesota, Duluth
06/18/2006
Math:: SparseVector is a CPAN module that implements sparse vector operations using regular Perl hashes. It supports very commonly required methods such as setting a value in a vector, reading a value at a given index, obtaining all indices, addition and dot product of two sparse vectors, and vector normalization. The code is entirely borrowed from the existing Sparse::Vector v0.03 module on CPAN, and re-cast into a new namespace in order to introduce another module Math::SparseMatrix, which makes use of this module.
This module has been developed on Linux and Unix platforms, using Perl programming language. To use this module, you must have Perl (version 5.8 or better recommended) installed on your system. Perl is freely available at - http://www.perl.org. It is very likely that you will already have Perl installed if you are using a Unix/Linux based system.
To install this module type the following:
perl Makefile.PL
make
make test
make install
The exact location of where Math::SparseVector will be installed depends on your system configuration.
If you do not have authority to write into system directories, you can install Math::SparseVector in a local directory that you own and have permissions to read and write into as follows:
perl Makefile.PL PREFIX=/YOUR/DIR
make
make test
make install
This will install the module into
/YOUR/DIR/lib/perl5/site_perl/Math/SparseVector.pm
If you install Math::SparseVector in a local directory, you will have to explicitly set your PERL5LIB environment variable to include:
/YOUR/DIR/lib/perl5/site_perl
if this directory was not already included.
If you have any troubles during the installation, please contact the authors at
Step 1. Loading Math::SparseVector Module
To use this module, you must insert the following line in your Perl program before using any of the supported methods.
use Math::SparseVector;
Step 2. Creating a Math::SparseVector Object
The following line creates a new object of Math::SparseVector class referred with the name 'spvec'.
$spvec=Math::SparseVector->new;
The newly created 'spvec' vector will be initially empty.
Step 3. Using Methods
Now you can use any of the following methods on this 'spvec' Math::SparseVector object.
# equivalent to $spvec{12}=5;
# equivalent to $value=$spvec{12};
# equivalent to @keys=sort {$a <=> $b} keys %spvec;
# similar to # if(scalar(keys %spvec)==0) {print "vector is null.\n";}
Output will show a list of space separated 'index value' pairs for each non-zero 'value' in the vector. Example - $spvec->print;
# similar to # foreach $ind (sort {$a<=>$b} keys %spvec)
# { print "$ind " . $spvec{$ind} . " "; }
print "$string\n"; # the above will do exactly same as $spvec->print;
If v1 = (2, , , 5, 8, , , , 1) & v2 = ( , 1, , 3, , , 5, , 9) where blanks show the 0 values that are not stored in Math::SparseVector. After $v1->add($v2); v1 = (2, 1, , 8, 8, , 5, , 10) and v2 remains same
& v2 = ( , 1, , 1, , , 1, , 1) Then, after v1->binadd(v2), v1 will be (1, 1, , 1, 1, , 1, , 1).
If v1 = (1, , , 1, 1, , , , 1)
& v2 = ( , 1, , 3, , , 5, , 9)
v1->binadd(v2);
will set v1 to (1, 1, , 1, 1, , 1, , 1).
9. incr(i) - Increments the value at index i
Example - $spvec->incr(12);
# is similar to $spvec{12}++;
10. div(n) - Divides each vector entry by a given divisor n
Example - $spvec->div(4);
If spvec = (2, , , 5, 8, , , , 1)
Then, $spvec->div(4)
will set spvec to (0.5, , , 1.25, 2, , , , 0.25)
11. norm() - Returns the norm of a given vector
Example - $spvec_norm = $spvec->norm;
If spvec = (2, , , 5, 8, , , , 1)
$spvec->norm will return the value
= sqrt(2^2 + 5^2 + 8^2 + 1)
= sqrt(4 + 25 + 64 + 1)
= 9.69536
12. v1->dot(v2)
If v1 = (2, , , 5, 8, , , , 1)
& v2 = ( , 1, , 3, , , 5, , 9) v1->dot(v2) returns 53 + 19 = 15 + 9 = 24
13. free() - Deallocates all entries and makes the vector emptyExample - $spvec->free;
will set spvec to null vector ()
Copyright (c) 2006,
Amruta Purandare, University of Pittsburgh. amruta@cs.pitt.edu
Ted Pedersen, University of Minnesota, Duluth. tpederse@d.umn.edu
Mahesh Joshi, University of Minnesota, Duluth. joshi031@d.umn.edu
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to
The Free Software Foundation, Inc.,
59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.