Vectors are instances of the class Vector. Class
Vector is a template class: Vector<T, Storage,
Allocator>. T is the type of the elements to be
stored (e.g. double). Storage defines how
the vector is stored.
Storage is equal to Vect_Full by default
for full vectors, you can set it to Vect_Sparse for sparse vectors.
Finally, Allocator defines the way memory is managed. It is close
to STL allocators. See the section "Allocators" for further details.
There is a default Allocator (see the section
"Allocators") and a default Storage
(Vect_Full). It means that these two template parameters
may be omitted. Then a vector of integers may be declared thanks to
the line:
Vector<int> V;
This defines a vector of size 0, that is to say an empty vector. To define a vector of length 5, one may write:
Vector<int> V(5);
Other declarations may be:
Vector<int, Vect_Full> V(10); Vector<int> U(V); // Copy constructor. Vector<int, Vect_Full, MallocAlloc<int> > V(10); Vector<int, Vect_Full, NewAlloc<int> > V(10);
Access to elements is achieved through the
operator(int), and indices start at 0:
Vector<int, Vect_Full> V(10); V(5) = -3; V(0) = 2 * V(5);
To display vectors, there are two convenient options:
V.Print(); std::cout << V << std::endl;
There are lots of methods that are described in the documentation. One may point out:
Fill fills with 0, 1, 2, 3, etc. or fills the vector
with a given value.GetLength or GetSize return the
length of the vector.Reallocate resizes the vector (warning, data may
be lost, depending on the allocator).Resize resizes the vector while keeping previous entries. PushBack inserts an element at the end of the vector. Read, ReadText, Write,
WriteText are useful methods for input/ouput
operations.test/program/vector_test.cpp.
There is a default Allocator (see the section
"Allocators"). It means that this template parameter
may be omitted. Then a sparse vector of doubles may be declared thanks to
the line:
Vector<double, Vect_Sparse> V;
This defines a null vector, that is to say that
V(i) will return 0 for all i.
To define a vector with 5 non-zero entries, one may write:
Vector<double, Vect_Sparse> V(5);
Other declarations may be:
Vector<double, Vect_Sparse> U(V); // Copy constructor. Vector<int, Vect_Sparse, MallocAlloc<int> > V(10); Vector<int, Vect_Sparse, NewAlloc<int> > V(10);
AddInteraction and AddInteractionRow.
These methods insert (or add) the elements at the correct position,
so that the row numbers are always sorted in ascending order.
You can use them as in the following example :
Vector<double, Vect_Sparse> V; cout << "Empty vector V = " << V << endl; // non-null value of 1.5 at row 2 V.AddInteraction(2, 1.5); V.AddInteraction(2, 0.8); // now V(2) should be equal to 1.5+0.8 = 2.3 cout << "After AddInteraction, V = " << V << endl; // AddInteractionRow for several rows to add IVect num(2); Vector<double> val(2); num(0) = 1; val(0) = -0.4; num(1) = 4; val(1) = 0.6; V.AddInteractionRow(num, val); cout << "After AddInteractionRow, V = " << endl << V << endl;
The output of this code would read :
Empty vector V = After AddInteraction, V = 3 2.3 AfterAddInteractionRow, V = 2 -0.4 3 2.3 5 0.6
You noticed that the row indices are displayed with indices beginning at 1 instead of 0, this is more convenient for debugging, or exporting datas into Matlab for example.
You can also use the
operator(int) to modify directly values.
Vector<double, Vect_Sparse> V; V(5) = -3; V(0) = 2 * V(5);
If the non-zero entry doesn't exist, it is created at the correction
position as for AddInteraction.
The methods Reallocate,
Index and Value can also be used, but they
need to be used carefully and often the method Assemble
has to be called in order to sort non-zero entries.
// 3 non-zero entries Vector<double, Vect_Sparse> V; // creation of 3 non-zero entries V.Reallocate(3); // initialization of non-zero entries with Index and Value V.Index(0) = 1; // row number of first entry V.Value(0) = 1.3; // value of first entry V.Index(1) = 3; V.Value(1) = -0.5; V.Index(2) = 2; V.Value(2) = 2.7; // Here the row numbers are not sorted // you need to call Assemble V.Assemble();In the same way, the method
SetData can be used in conjunction with
Assemble :
Vector<double, Vect_Sparse> V; IVect row(3); Vector<double> value(3); row(0) = 1; // row number of first entry value(0) = 1.3; // value of first entry row(1) = 3; value(1) = -0.5; row(2) = 2; value(2) = 2.7; // feeding V with row and value V.SetData(value, row); // Here the row numbers are not sorted // you need to call Assemble V.Assemble();You will notice that the method SetData empties vectors row and value.
There are lots of methods that are described in the documentation. One may point out:
Fill give to non-zero entries the value 0, 1, 2, 3, etc. or
a given value.GetLength or GetSize return the
number of non-zero entries.Read, ReadText, Write,
WriteText are useful methods for input/ouput
operations.test/program/sparse_vector_test.cpp.