Squashed 'third_party/boostorg/ublas/' content from commit e8607b3

Change-Id: Ia06afd642157a24e17fa9ddea28fb8601810b78e
git-subtree-dir: third_party/boostorg/ublas
git-subtree-split: e8607b3eea238e590eca93bfe498c21f470155c1
diff --git a/doc/banded.html b/doc/banded.html
new file mode 100644
index 0000000..6ce82f2
--- /dev/null
+++ b/doc/banded.html
@@ -0,0 +1,580 @@
+<!DOCTYPE html PUBLIC "-//W3C/utf-8XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Banded Matrix</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Banded Matrix</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="banded_matrix"></a>Banded Matrix</h2>
+<h4>Description</h4>
+<p>The templated class <code>banded_matrix&lt;T, F, A&gt;</code> is
+the base container adaptor for banded matrices. For a <em>(m x
+n</em>)-dimensional banded matrix with <em>l</em> lower and
+<em>u</em> upper diagonals and <em>0 &lt;= i &lt; m</em>, <em>0
+&lt;= j &lt; n</em> holds <em>b</em><sub><em>i, j</em></sub> <em>=
+0</em>, if <em>i &gt; j + l</em> or <em>i &lt; j - u</em>. The
+storage of banded matrices is packed.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/banded.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    banded_matrix&lt;double&gt; m (3, 3, 1, 1);
+    for (signed i = 0; i &lt; signed (m.size1 ()); ++ i)
+        for (signed j = std::max (i - 1, 0); j &lt; std::min (i + 2, signed (m.size2 ())); ++ j)
+            m (i, j) = 3 * i + j;
+    std::cout &lt;&lt; m &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header banded.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the matrix.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>Functor describing the storage organization. <a href=
+"#banded_matrix_1">[1]</a></td>
+<td><code>row_major</code></td>
+</tr>
+<tr>
+<td><code>A</code></td>
+<td>The type of the adapted array. <a href=
+"#banded_matrix_2">[2]</a></td>
+<td><code>unbounded_array&lt;T&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"container_concept.html#matrix">Matrix</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_container&lt;banded_matrix&lt;T, F, A&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>banded_matrix ()</code></td>
+<td>Allocates an uninitialized <code>banded_matrix</code> that
+holds zero rows of zero elements.</td>
+</tr>
+<tr>
+<td><code>banded_matrix (size_type size1, size_type size2,
+size_type lower = 0, size_type upper = 0)</code></td>
+<td>Allocates an uninitialized <code>banded_matrix</code> that
+holds <code>(lower + 1 + upper)</code> diagonals around the main
+diagonal of a matrix with <code>size1</code> rows of
+<code>size2</code> elements.</td>
+</tr>
+<tr>
+<td><code>banded_matrix (const banded_matrix &amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_matrix (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size1, size_type size2, size_type
+lower = 0, size_type upper = 0, bool preserve = true)</code></td>
+<td>Reallocates a <code>banded_matrix</code> to hold <code>(lower +
+1 + upper)</code> diagonals around the main diagonal of a matrix
+with <code>size1</code> rows of <code>size2</code> elements. The
+existing elements of the <code>banded_matrix</code> are preseved
+when specified.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>size_type lower () const</code></td>
+<td>Returns the number of diagonals below the main diagonal.</td>
+</tr>
+<tr>
+<td><code>size_type upper () const</code></td>
+<td>Returns the number of diagonals above the main diagonal.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns a <code>const</code> reference of the <code>j</code>
+-th element in the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>banded_matrix &amp;operator = (const banded_matrix
+&amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>banded_matrix &amp;assign_temporary (banded_matrix
+&amp;m)</code></td>
+<td>Assigns a temporary. May change the banded matrix
+<code>m</code> .</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_matrix &amp;operator = (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_matrix &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the banded matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_matrix &amp;operator += (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the banded matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_matrix &amp;plus_assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Adds a matrix expression to the banded matrix. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_matrix &amp;operator -= (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the banded matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_matrix &amp;minus_assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Subtracts a matrix expression from the banded matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+banded_matrix &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the banded matrix
+with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+banded_matrix &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the banded matrix
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (banded_matrix &amp;m)</code></td>
+<td>Swaps the contents of the banded matrices.</td>
+</tr>
+<tr>
+<td><code>void insert (size_type i, size_type j, const_reference
+t)</code></td>
+<td>Inserts the value <code>t</code> at the <code>j</code>-th
+element of the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void erase (size_type i, size_type j)</code></td>
+<td>Erases the value at the <code>j</code>-th elemenst of the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td>Clears the matrix.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>banded_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>banded_matrix</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="banded_matrix_1" id="banded_matrix_1">[1]</a> Supported
+parameters for the storage organization are <code>row_major</code>
+and <code>column_major</code>.</p>
+<p><a name="banded_matrix_2" id="banded_matrix_2">[2]</a> Supported
+parameters for the adapted array are
+<code>unbounded_array&lt;T&gt;</code> ,
+<code>bounded_array&lt;T&gt;</code> and
+<code>std::vector&lt;T&gt;</code> .</p>
+<h2><a name="banded_adaptor"></a>Banded Adaptor</h2>
+<h4>Description</h4>
+<p>The templated class <code>banded_adaptor&lt;M&gt;</code> is a
+banded matrix adaptor for other matrices.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/banded.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    banded_adaptor&lt;matrix&lt;double&gt; &gt; ba (m, 1, 1);
+    for (signed i = 0; i &lt; signed (ba.size1 ()); ++ i)
+        for (signed j = std::max (i - 1, 0); j &lt; std::min (i + 2, signed (ba.size2 ())); ++ j)
+            ba (i, j) = 3 * i + j;
+    std::cout &lt;&lt; ba &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header banded.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>M</code></td>
+<td>The type of the adapted matrix.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;banded_adaptor&lt;M&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>banded_adaptor (matrix_type &amp;data, size_type lower =
+0, size_type upper = 0)</code></td>
+<td>Constructs a <code>banded_adaptor</code> that holds
+<code>(lower + 1 + upper)</code> diagonals around the main diagonal
+of a matrix.</td>
+</tr>
+<tr>
+<td><code>banded_adaptor (const banded_adaptor &amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_adaptor (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>size_type lower () const</code></td>
+<td>Returns the number of diagonals below the main diagonal.</td>
+</tr>
+<tr>
+<td><code>size_type upper () const</code></td>
+<td>Returns the number of diagonals above the main diagonal.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns a <code>const</code> reference of the <code>j</code>
+-th element in the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>banded_adaptor &amp;operator = (const banded_adaptor
+&amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>banded_adaptor &amp;assign_temporary (banded_adaptor
+&amp;m)</code></td>
+<td>Assigns a temporary. May change the banded adaptor
+<code>m</code> .</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_adaptor &amp;operator = (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_adaptor &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the banded adaptor. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_adaptor &amp;operator += (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the banded adaptor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_adaptor &amp;plus_assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Adds a matrix expression to the banded adaptor. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_adaptor &amp;operator -= (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the banded adaptor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+banded_adaptor &amp;minus_assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Subtracts a matrix expression from the banded adaptor. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+banded_adaptor &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the banded adaptor
+with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+banded_adaptor &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the banded adaptor
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (banded_adaptor &amp;m)</code></td>
+<td>Swaps the contents of the banded adaptors.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>banded_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>banded_adaptor</code>.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt</a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/blas.html b/doc/blas.html
new file mode 100644
index 0000000..07573e8
--- /dev/null
+++ b/doc/blas.html
@@ -0,0 +1,452 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <title>BLAS</title>
+  <meta name="GENERATOR" content="Quanta Plus" />
+  <meta name="AUTHOR" content="Gunter Winkler" />
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+  <link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+  <link rel="stylesheet" href="ublas.css" type="text/css" />
+  <script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+  <script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+</head>
+<body>
+
+
+<h1>Level 3 BLAS</h1>
+<div class="toc" id="toc"></div>
+<hr />
+<a name="_details"></a>
+
+<table summary="" border=0 cellpadding=0 cellspacing=0>
+<tr><td></td></tr>
+<tr><td colspan=2><br /><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align=right valign=top>template&lt;class M1, class T, class M2, class M3&gt; M1 &amp;&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="#ga0">boost::numeric::ublas::blas_3::tmm</a> (M1 &amp;m1, const T &amp;t, const M2 &amp;m2, const M3 &amp;m3)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">triangular matrix multiplication  <a href="#ga0"></a><br /><br /></td></tr>
+<tr><td class="memItemLeft" nowrap align=right valign=top>template&lt;class M1, class T, class M2, class C&gt; M1 &amp;&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="#ga1">boost::numeric::ublas::blas_3::tsm</a> (M1 &amp;m1, const T &amp;t, const M2 &amp;m2, C)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">triangular solve <em>m2</em> * <em>x</em> = <em>t</em> * <em>m1</em> in place, <em>m2</em> is a triangular matrix  <a href="#ga1"></a><br /><br /></td></tr>
+<tr><td class="memItemLeft" nowrap align=right valign=top>template&lt;class M1, class T1, class T2, class M2, class M3&gt; M1 &amp;&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="#ga2">boost::numeric::ublas::blas_3::gmm</a> (M1 &amp;m1, const T1 &amp;t1, const T2 &amp;t2, const M2 &amp;m2, const M3 &amp;m3)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">general matrix multiplication  <a href="#ga2"></a><br /><br /></td></tr>
+<tr><td class="memItemLeft" nowrap align=right valign=top>template&lt;class M1, class T1, class T2, class M2&gt; M1 &amp;&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="#ga3">boost::numeric::ublas::blas_3::srk</a> (M1 &amp;m1, const T1 &amp;t1, const T2 &amp;t2, const M2 &amp;m2)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">symmetric rank k update: <em>m1</em> = <em>t</em> * <em>m1</em> + <em>t2</em> * (<em>m2</em> * <em>m2<sup>T</sup></em>)  <a href="#ga3"></a><br /><br /></td></tr>
+<tr><td class="memItemLeft" nowrap align=right valign=top>template&lt;class M1, class T1, class T2, class M2&gt; M1 &amp;&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="#ga4">boost::numeric::ublas::blas_3::hrk</a> (M1 &amp;m1, const T1 &amp;t1, const T2 &amp;t2, const M2 &amp;m2)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">hermitian rank k update: <em>m1</em> = <em>t</em> * <em>m1</em> + <em>t2</em> * (<em>m2</em> * <em>m2<sup>H</sup></em>)  <a href="#ga4"></a><br /><br /></td></tr>
+<tr><td class="memItemLeft" nowrap align=right valign=top>template&lt;class M1, class T1, class T2, class M2, class M3&gt; M1 &amp;&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="#ga5">boost::numeric::ublas::blas_3::sr2k</a> (M1 &amp;m1, const T1 &amp;t1, const T2 &amp;t2, const M2 &amp;m2, const M3 &amp;m3)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">generalized symmetric rank k update: <em>m1</em> = <em>t1</em> * <em>m1</em> + <em>t2</em> * (<em>m2</em> * <em>m3<sup>T</sup></em>) + <em>t2</em> * (<em>m3</em> * <em>m2<sup>T</sup></em>)  <a href="#ga5"></a><br /><br /></td></tr>
+<tr><td class="memItemLeft" nowrap align=right valign=top>template&lt;class M1, class T1, class T2, class M2, class M3&gt; M1 &amp;&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="#ga6">boost::numeric::ublas::blas_3::hr2k</a> (M1 &amp;m1, const T1 &amp;t1, const T2 &amp;t2, const M2 &amp;m2, const M3 &amp;m3)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">generalized hermitian rank k update: <em>m1</em> = <em>t1</em> * <em>m1</em> + <em>t2</em> * (<em>m2</em> * <em>m3<sup>H</sup></em>) + (<em>m3</em> * (<em>t2</em> * <em>m2</em>)<sup>H</sup>)  <a href="#ga6"></a><br /><br /></td></tr>
+<tr><td class="memItemLeft" nowrap align=right valign=top>template&lt;class M, class E1, class E2&gt; BOOST_UBLAS_INLINE M &amp;&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="products.html#ga7">boost::numeric::ublas::axpy_prod</a> (const matrix_expression&lt; E1 &gt; &amp;e1, const matrix_expression&lt; E2 &gt; &amp;e2, M &amp;m, bool init=true)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">computes <code>M += A X</code> or <code>M = A X</code> in an optimized fashion.  <a href="products.html#ga7"></a><br /><br /></td></tr>
+<tr><td class="memItemLeft" nowrap align=right valign=top>template&lt;class M, class E1, class E2&gt; BOOST_UBLAS_INLINE M &amp;&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="products.html#ga8">boost::numeric::ublas::opb_prod</a> (const matrix_expression&lt; E1 &gt; &amp;e1, const matrix_expression&lt; E2 &gt; &amp;e2, M &amp;m, bool init=true)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">computes <code>M += A X</code> or <code>M = A X</code> in an optimized fashion.  <a href="products.html#ga8"></a><br /><br /></td></tr>
+</table>
+
+<hr />
+
+<h2>Function Documentation</h2>
+
+<a class="anchor" name="ga0" doxytag="boost::numeric::ublas::blas_3::tmm" ></a>
+<table summary="" class="mdTable" width="100%" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table summary="" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"> M1&amp; tmm           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">M1 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const T &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const M2 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const M3 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m3</em></td>
+        </tr>
+        <tr>
+          <td></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table summary="" cellspacing=5 cellpadding=0 border=0>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+<p>triangular matrix multiplication </p>
+    </td>
+  </tr>
+</table>
+<a class="anchor" name="ga1" doxytag="boost::numeric::ublas::blas_3::tsm" ></a>
+<table summary="" class="mdTable" width="100%" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table summary="" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"> M1&amp; tsm           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">M1 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const T &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>t</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const M2 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>C&nbsp;</td>
+          <td class="mdname" nowrap></td>
+        </tr>
+        <tr>
+          <td></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table summary="" cellspacing=5 cellpadding=0 border=0>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+triangular solve <em>m2</em> * <em>x</em> = <em>t</em> * <em>m1</em> in place, <em>m2</em> is a triangular matrix 
+</p>
+    </td>
+  </tr>
+</table>
+<a class="anchor" name="ga2" doxytag="boost::numeric::ublas::blas_3::gmm" ></a>
+<table summary="" class="mdTable" width="100%" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table summary="" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"> M1&amp; gmm           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">M1 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const T1 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>t1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const T2 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>t2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const M2 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const M3 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m3</em></td>
+        </tr>
+        <tr>
+          <td></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table summary="" cellspacing=5 cellpadding=0 border=0>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+general matrix multiplication 
+</p>
+    </td>
+  </tr>
+</table>
+<a class="anchor" name="ga3" doxytag="boost::numeric::ublas::blas_3::srk" ></a>
+<table summary="" class="mdTable" width="100%" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table summary="" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"> M1&amp; srk           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">M1 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const T1 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>t1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const T2 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>t2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const M2 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m2</em></td>
+        </tr>
+        <tr>
+          <td></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table summary="" cellspacing=5 cellpadding=0 border=0>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+symmetric rank k update: <em>m1</em> = <em>t</em> * <em>m1</em> + <em>t2</em> * (<em>m2</em> * <em>m2<sup>T</sup></em>) 
+</p>
+<dl compact><dt><b>Todo:</b></dt><dd>use opb_prod() </dd></dl>
+    </td>
+  </tr>
+</table>
+<a class="anchor" name="ga4" doxytag="boost::numeric::ublas::blas_3::hrk" ></a>
+<table summary="" class="mdTable" width="100%" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table summary="" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"> M1&amp; hrk           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">M1 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const T1 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>t1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const T2 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>t2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const M2 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m2</em></td>
+        </tr>
+        <tr>
+          <td></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table summary="" cellspacing=5 cellpadding=0 border=0>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+hermitian rank k update: <em>m1</em> = <em>t</em> * <em>m1</em> + <em>t2</em> * (<em>m2</em> * <em>m2<sup>H</sup></em>) 
+</p>
+<dl compact><dt><b>Todo:</b></dt><dd>use opb_prod()</dd></dl>
+    </td>
+  </tr>
+</table>
+<a class="anchor" name="ga5" doxytag="boost::numeric::ublas::blas_3::sr2k" ></a>
+<table summary="" class="mdTable" width="100%" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table summary="" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"> M1&amp; sr2k           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">M1 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const T1 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>t1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const T2 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>t2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const M2 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const M3 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m3</em></td>
+        </tr>
+        <tr>
+          <td></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table summary="" cellspacing=5 cellpadding=0 border=0>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+generalized symmetric rank k update: <em>m1</em> = <em>t1</em> * <em>m1</em> + <em>t2</em> * (<em>m2</em> * <em>m3<sup>T</sup></em>) + <em>t2</em> * (<em>m3</em> * <em>m2<sup>T</sup></em>) 
+</p>
+<dl compact><dt><b>Todo:</b></dt><dd>use opb_prod()</dd></dl>
+    </td>
+  </tr>
+</table>
+<a class="anchor" name="ga6" doxytag="boost::numeric::ublas::blas_3::hr2k" ></a>
+<table summary="" class="mdTable" width="100%" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table summary="" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"> M1&amp; hr2k           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">M1 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const T1 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>t1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const T2 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>t2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const M2 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const M3 &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m3</em></td>
+        </tr>
+        <tr>
+          <td></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table summary="" cellspacing=5 cellpadding=0 border=0>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+generalized hermitian rank k update: <em>m1</em> = <em>t1</em> * <em>m1</em> + <em>t2</em> * (<em>m2</em> * <em>m3<sup>H</sup></em>) + (<em>m3</em> * (<em>t2</em> * <em>m2</em>)<sup>H</sup>) 
+</p>
+<dl compact><dt><b>Todo:</b></dt><dd>use opb_prod()</dd></dl>
+    </td>
+  </tr>
+</table>
+
+
+
+<hr />
+<p>Copyright (&copy;) 2000-2004 Michael Stevens, Mathias Koch, 
+Joerg Walter, Gunter Winkler<br />
+Use, modification and distribution are subject to the
+Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt
+or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+http://www.boost.org/LICENSE_1_0.txt</a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/bounded_array.html b/doc/bounded_array.html
new file mode 100644
index 0000000..fea0d7b
--- /dev/null
+++ b/doc/bounded_array.html
@@ -0,0 +1,219 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Bounded Array;</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Bounded Array Storage</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="bounded_array"></a>Bounded Array</h2>
+<h4>Description</h4>
+<p>The templated class <code>bounded_array&lt;T, N, ALLOC&gt;</code> implements a bounded storage array. The bounded array is similar to a C++ array type in that its maximum size is bounded by N and is allocated on the stack instead of the heap. Similarly a <code>bounded_array</code> requires no secondary storage and ALLOC is only used to specify <code>size_type</code> and <code>difference_type</code>.
+</p>
+<p>When resized <code>bounded_array</code> never reallocated the storage. It is therefore always efficient to resize a <code>bounded_array</code> but the size bound N must not be exceeded.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/storage.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    bounded_array&lt;double, 3&gt; a (3);
+    for (unsigned i = 0; i &lt; a.size (); ++ i) {
+        a [i] = i;
+        std::cout &lt;&lt; a [i] &lt;&lt; std::endl;
+    }
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header storage.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the array.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>N</code></td>
+<td>The allocation size of the array.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>ALLOC</code></td>
+<td>An STL Allocator</td>
+<td>std::allocator</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="storage_concept.html">Storage</a></p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of Storage.</p>
+<h4>Public base classes</h4>
+<p>None.</p>
+<h4>Members</h4>
+<ul>
+<li>The description does not describe what the member actually does, this can be looked up
+in the corresponding concept documentation, but instead contains a remark on the implementation of the
+member inside this model of the concept.</li>
+<li>Typography:
+<ul>
+<li>Members that are not part of the implemented concepts are <font color="blue">in blue</font>.</li>
+</ul>
+</li>
+</ul>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Where defined</th>
+<th>Description</th>
+</tr>
+<tr><td><code>value_type</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td></tr>
+<tr><td><code>pointer</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>value_type*</code></td></tr>
+<tr><td><code>const_pointer</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>const value_type*</code></td></tr>
+<tr><td><code>reference</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>value_type&amp;</code></td></tr>
+<tr><td><code>const_reference</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>const value_type&amp;</code></td></tr>
+<tr><td><code>size_type</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>Alloc::size_type</code></td></tr>
+<tr><td><code>difference_type</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>Alloc::difference_type</code></td></tr>
+<tr><td><code>iterator</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>pointer</code></td></tr>
+<tr><td><code>const_iterator</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>const_pointer</code></td></tr>
+<tr><td><code>revere_iterator</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>std::reverse_iterator&lt;iterator&gt;</code></td></tr>
+<tr><td><code>const_revere_iterator</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>std::reverse_iterator&lt;const_iterator&gt;</code></td></tr>
+<tr>
+<td><code>bounded_array ()</code></td>
+<td><a href="storage_concept.html">Storage</a></td>
+<td>Creates an <code>unbounded_array</code> that holds <strong>zero</strong> elements.</td> 
+</tr>
+<tr>
+<td><code>bounded_array (size_type size)</code></td>
+<td><a href="storage_concept.html">Storage</a></td>
+<td>Creates a uninitialized <code>bounded_array</code> that holds <code>size</code> elements. All the elements are default constructed.</td>
+</tr>
+<tr>
+<td><code>bounded_array (size_type size, const T&amp; init)</code></td>
+<td><a href="storage_concept.html">Storage</a></td>
+<td>Creates an initialized <code>bounded_array</code> that holds <code>size</code> elements. All the elements are constructed from the <code>init</code> value.</td>
+</tr>
+<tr>
+<td><code>bounded_array (const bounded_array &amp;c)</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>~bounded_array ()</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Deallocates the <code>bounded_array</code> itself.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size)</code></td>
+<td><a href="storage_concept.html">Storage</a>
+<td>Reallocates a <code>bounded_array</code> to hold <code>size</code> elements.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size, const T&amp; t)</code></td>
+<td><a href="storage_concept.html">Storage</a>
+<td>Reallocates a <code>bounded_array</code> to hold <code>size</code> elements.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns the size of the <code>bounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i) const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns a <code>const</code> reference of the <code>i</code> -th element.</td>
+</tr>
+<tr>
+<td><code>reference operator [] (size_type i)</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>bounded_array &amp;operator = (const bounded_array &amp;a)</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><font color="blue"><code>bounded_array &amp;assign_temporary (bounded_array &amp;a)</code></font></td>
+<td></td>
+<td>Assigns a temporary. May change the array <code>a</code>.</td>
+</tr>
+<tr>
+<td><code>void swap (bounded_array &amp;a)</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Swaps the contents of the arrays.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning of the <code>bounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of the <code>bounded_array</code>.</td> 
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of the <code>bounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns a <code>iterator</code> pointing to the end of the <code>bounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/ReversibleContainer.html">Reversible Container</a></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the beginning of the reversed <code>bounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/ReversibleContainer.html">Reversible Container</a></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the end of the reversed <code>bounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td><a href="http://www.sgi.com/tech/stl/ReversibleContainer.html">Reversible Container</a></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the beginning of the reversed <code>bounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td><a href="http://www.sgi.com/tech/stl/ReversibleContainer.html">Reversible Container</a></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of the reversed <code>bounded_array</code>.</td>
+</tr>
+</tbody>
+</table>
+   <hr />
+   <p>
+      Copyright (&copy;) 2000-2004 Michael Stevens, Mathias Koch,
+      Joerg Walter, Gunter Winkler<br />
+      Use, modification and distribution are subject to the
+      Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt
+      or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+         http://www.boost.org/LICENSE_1_0.txt
+      </a>).
+   </p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/container_concept.html b/doc/container_concept.html
new file mode 100644
index 0000000..6c8346f
--- /dev/null
+++ b/doc/container_concept.html
@@ -0,0 +1,424 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Container Concepts</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Container Concepts</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="vector"></a>Vector</h2>
+<h4>Description</h4>
+<p>A Vector describes common aspects of dense, packed and sparse
+vectors.</p>
+<h4>Refinement of</h4>
+<p><a href="http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</a>,
+<a href="expression_concept.html#vector_expression">Vector Expression</a>
+<a href="#vector_expression_note">[1]</a>.</p>
+<h4>Associated types</h4>
+<p>In addition to the types defined by <a href="expression_concept.html#vector_expression">Vector Expression</a></p>
+<table border="1" summary="types">
+<tbody>
+<tr>
+<td>Public base</td>
+<td>vector_container&lt;V&gt;</td>
+<td>V must be derived from this public base type.</td>
+</tr>
+<tr>
+<td>Storage array</td>
+<td>V::array_type</td>
+<td>
+Dense Vector ONLY. The type of underlying storage array used to store the elements. The array_type must model the
+<a href="storage_concept.html"><b>Storage</b></a> concept.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notation</h4>
+<table border="0" summary="notation">
+<tbody>
+<tr>
+<td><code>V</code></td>
+<td>A type that is a model of Vector</td>
+</tr>
+<tr>
+<td><code>v</code></td>
+<td>Objects of type <code>V</code></td>
+</tr>
+<tr>
+<td><code>n, i</code></td>
+<td>Objects of a type convertible to <code>size_type</code></td>
+</tr>
+<tr>
+<td><code>t</code></td>
+<td>Object of a type convertible to <code>value_type</code></td>
+</tr>
+<tr>
+<td><code>p</code></td>
+<td>Object of a type convertible to <code>bool</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Definitions</h4>
+<h4>Valid expressions</h4>
+<p>In addition to the expressions defined in <a href="http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</a>,
+<a href="expression_concept.html#vector_expression">Vector Expression</a> the following expressions must be valid.</p>
+<table border="1" summary="expressions">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Type requirements</th>
+<th>Return type</th>
+</tr>
+<tr>
+<td>Sizing constructor</td>
+<td><code>V v (n)</code></td>
+<td>&nbsp;</td>
+<td><code>V</code></td>
+</tr>
+<tr>
+<td>Insert</td>
+<td><code>v.insert_element (i, t)</code></td>
+<td><code>v</code> is mutable.</td>
+<td><code>void</code></td>
+</tr>
+<tr>
+<td>Erase</td>
+<td><code>v.erase_element (i)</code></td>
+<td><code>v</code> is mutable.</td>
+<td><code>void</code></td>
+</tr>
+<tr>
+<td>Clear</td>
+<td><code>v.clear ()</code></td>
+<td><code>v</code> is mutable.</td>
+<td><code>void</code></td>
+</tr>
+<tr>
+<td>Resize</td>
+<td><code>v.resize (n)</code><br />
+<code>v.resize (n, p)</code></td>
+<td><code>v</code> is mutable.</td>
+<td><code>void</code></td>
+</tr>
+<tr>
+<td>Storage</td>
+<td><code>v.data()</code></td>
+<td><code>v</code> is mutable and Dense.</td>
+<td><code>array_type&amp;</code> if <code>v</code> is mutable, <code>const array_type&amp;</code> otherwise</td>
+</tr>
+</tbody>
+</table>
+<h4>Expression semantics</h4>
+<p>Semantics of an expression is defined only where it differs
+from, or is not defined in <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</p>
+<table border="1" summary="semantics">
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Precondition</th>
+<th>Semantics</th>
+<th>Postcondition</th>
+</tr>
+<tr>
+<td>Sizing constructor</td>
+<td><code>V v (n)</code></td>
+<td><code>n &gt;= 0</code></td>
+<td>Allocates a vector of<code>n</code> elements.</td>
+<td><code>v.size () == n</code>.</td>
+</tr>
+<tr>
+<td>Element access <a href="#element_access_note">[2]</a></td>
+<td><code>v[n]</code></td>
+<td><code>0&lt;n&gt;v.size()</code></td>
+<td>returns the n-th element in v</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Insert</td>
+<td><code>v.insert_element (i, t)</code></td>
+<td><code>0 &lt;= i &lt; v.size ()</code>.</td>
+<td>Inserts an element at <code>v (i)</code> with value <code>t</code>.
+The storage requirement of the Vector may be increased.</td>
+<td><code>v (i)</code> is equal to <code>t</code>.</td>
+</tr>
+<tr>
+<td>Erase</td>
+<td><code>v.erase_element (i)</code></td>
+<td><code>0 &lt;= i &lt; v.size ()</code></td>
+<td>Destroys the element as <code>v (i)</code> and replaces it with the default
+<code>value_type ()</code>.
+The storage requirement of the Vector may be decreased.</td>
+<td><code>v (i)</code> is equal to <code>value_type ()</code>.</td>
+</tr>
+<tr>
+<td>Clear</td>
+<td><code>v.clear ()</code></td>
+<td>&nbsp;</td>
+<td>Equivalent to<br />
+<code>for (i = 0; i &lt; v.size (); ++ i)</code><br />
+&nbsp; <code>v.erase_element (i);</code></td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Resize</td>
+<td><code>v.resize (n)
+<br />v.resize (n, p)</code></td>
+<td>&nbsp;</td>
+<td>Reallocates the vector so that it can hold <code>n</code>
+elements.<br />
+Erases or appends elements in order to bring the vector to the prescribed size. Appended elements copies of <code>value_type()</code>.
+<br />
+When <code>p == false</code> then existing elements are not preserved and elements will not appended as normal. Instead the vector is in the same state as that after an equivalent sizing constructor.</td>
+<td><code>v.size () == n</code>.</td>
+</tr>
+<tr>
+<td>Storage</td>
+<td><code>v.data()</code></td>
+<td></td>
+<td>Returns a reference to the underlying dense storage.</td>
+<td>&nbsp;</td>
+</tr>
+</table>
+<h4>Complexity guarantees</h4>
+<p>The run-time complexity of the sizing constructor is linear in
+the vector's size.</p>
+<p>The run-time complexity of insert_element and erase_element is specific for the
+Vector model and it depends on increases/decreases in storage requirements.</p>
+<p>The run-time complexity of resize is linear in the vector's
+size.</p>
+<h4>Invariants</h4>
+<h4>Models</h4>
+<ul>
+<li><code>vector</code>, <code>bounded_vector</code>, <code>c_vector</code></li>
+<li><code>unit_vector</code>, <code>zero_vector</code>, <code>scalar_vector</code></li>
+<li><code>mapped_vector;</code>, <code>compressed_vector</code>, <code>coordinate_vector</code></li>
+</ul>
+<h4>Notes</h4>
+<p><a name="vector_expression_note">[1]</a>
+As a user you need not care about <tt>Vector</tt> being a refinement of the VectorExpression. Being a refinement of the VectorExpression is only important for the template-expression engine but not the user.</p>
+<p><a name="element_access_note">[2]</a>
+The <code>operator[]</code> is added purely for convenience 
+and compatibility with the <code>std::vector</code>. In uBLAS however, 
+generally <code>operator()</code> is used for indexing because this can be
+used for both vectors and matrices.</p>
+<h2><a name="matrix"></a>Matrix</h2>
+<h4>Description</h4>
+<p>A Matrix describes common aspects of dense, packed and sparse
+matrices.</p>
+<h4>Refinement of</h4>
+<p><a href="http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</a>,
+<a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+<a href="#matrix_expression_note">[1]</a>
+.</p>
+<h4>Associated types</h4>
+<p>In addition to the types defined by <a href="expression_concept.html#matrix_expression">Matrix Expression</a></p>
+<table border="1" summary="types">
+<tbody>
+<tr>
+<td>Public base</td>
+<td>matrix_container&lt;M&gt;</td>
+<td>M must be derived from this public base type.</td>
+</tr>
+<tr>
+<td>Storage array</td>
+<td>M::array_type</td>
+<td>Dense Matrix ONLY. The type of underlying storage array used to store the elements. The array_type must model
+the <a href="storage_concept.html"><b>Storage</b></a> concept.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notation</h4>
+<table border="0" summary="notation">
+<tbody>
+<tr>
+<td><code>M</code></td>
+<td>A type that is a model of Matrix</td>
+</tr>
+<tr>
+<td><code>m</code></td>
+<td>Objects of type <code>M</code></td>
+</tr>
+<tr>
+<td><code>n1, n2, i, j</code></td>
+<td>Objects of a type convertible to <code>size_type</code></td>
+</tr>
+<tr>
+<td><code>t</code></td>
+<td>Object of a type convertible to <code>value_type</code></td>
+</tr>
+<tr>
+<td><code>p</code></td>
+<td>Object of a type convertible to <code>bool</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Definitions</h4>
+<h4>Valid expressions</h4>
+<p>In addition to the expressions defined in <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> the
+following expressions must be valid.</p>
+<table border="1" summary="expressions">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Type requirements</th>
+<th>Return type</th>
+</tr>
+<tr>
+<td>Sizing constructor</td>
+<td><code>M m (n1, n2)</code></td>
+<td>&nbsp;</td>
+<td><code>M</code></td>
+</tr>
+<tr>
+<td>Insert</td>
+<td><code>m.insert_element (i, j, t)</code></td>
+<td><code>m</code> is mutable.</td>
+<td><code>void</code></td>
+</tr>
+<tr>
+<td>Erase</td>
+<td><code>m.erase_element (i, j)</code></td>
+<td><code>m</code> is mutable.</td>
+<td><code>void</code></td>
+</tr>
+<tr>
+<td>Clear</td>
+<td><code>m.clear ()</code></td>
+<td><code>m</code> is mutable.</td>
+<td><code>void</code></td>
+</tr>
+<tr>
+<td>Resize</td>
+<td><code>m.resize (n1, n2)</code><br />
+<code>m.resize (n1, n2, p)</code></td>
+<td><code>m</code> is mutable.</td>
+<td><code>void</code></td>
+</tr>
+<tr>
+<td>Storage</td>
+<td><code>m.data()</code></td>
+<td><code>m</code> is mutable and Dense.</td>
+<td><code>array_type&amp;</code> if <code>m</code> is mutable, <code>const array_type&amp;</code> otherwise</td>
+</tr>
+</tbody>
+</table>
+<h4>Expression semantics</h4>
+<p>Semantics of an expression is defined only where it differs
+from, or is not defined in <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<table border="1" summary="semantics">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Precondition</th>
+<th>Semantics</th>
+<th>Postcondition</th>
+</tr>
+<tr>
+<td>Sizing constructor</td>
+<td><code>M m (n1, n2)</code></td>
+<td><code>n1 &gt;= 0</code> and <code>n2 &gt;= 0</code></td>
+<td>Allocates a matrix of <code>n1</code> rows and <code>n2</code>
+columns.</td>
+<td><code>m.size1 () == n1</code> and <code>m.size2 () ==
+n2</code>.</td>
+</tr>
+<tr>
+<td>Insert</td>
+<td><code>m.insert_element (i, j, t)</code></td>
+<td><code>0 &lt;= i &lt; m.size1 ()</code>,<br />
+<code>0 &lt;= j &lt; m.size2 ()</code>.</td>
+<td>Inserts an element at <code>m (i, j)</code> with value <code>t</code>.
+The storage requirement of the Matrix may be increased.</td>
+<td><code>m (i, j)</code> is equal to <code>t</code>.</td>
+</tr>
+<tr>
+<td>Erase</td>
+<td><code>m.erase_element (i, j)</code></td>
+<td><code>0 &lt;= i &lt; m.size1 ()</code>and <code><br />
+0 &lt;= j &lt; m.size2</code></td>
+<td>Destroys the element as <code>m (i, j)</code> and replaces it with the default
+<code>value_type ()</code>.
+The storage requirement of the Matrix may be decreased.</td>
+<td><code>m (i, j)</code> is equal to <code>value_type ()</code>.</td>
+</tr>
+<tr>
+<td>Clear</td>
+<td><code>m.clear ()</code></td>
+<td>&nbsp;</td>
+<td>Equivalent to<br />
+<code>for (i = 0; i &lt; m.size1 (); ++ i)</code><br />
+&nbsp; <code>for (j = 0; j &lt; m.size2 (); ++ j)</code><br />
+&nbsp; &nbsp; <code>m.erase_element (i, j);</code></td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Resize</td>
+<td><code>m.resize (n1, n2)
+<br />
+m.resize (n1, n2, p)
+</code></td>
+<td>&nbsp;</td>
+<td>Reallocate the matrix so that it can hold <code>n1</code> rows
+and <code>n2</code> columns.<br />
+Erases or appends elements in order to bring the matrix to the
+prescribed size. Appended elements are <code>value_type()</code>
+copies.<br />
+When <code>p == false</code> then existing elements are not preserved and elements will not appended as normal. Instead the matrix is in the same state as that after an equivalent sizing constructor.</td>
+<td><code>m.size1 () == n1</code> and <code>m.size2 () == n2</code>.</td>
+</tr>
+<tr>
+<td>Storage</td>
+<td><code>m.data()</code></td>
+<td></td>
+<td>Returns a reference to the underlying dense storage.</td>
+<td>&nbsp;</td>
+</tbody>
+</table>
+<h4>Complexity guarantees</h4>
+<p>The run-time complexity of the sizing constructor is quadratic
+in the matrix's size.</p>
+<p>The run-time complexity of insert_element and erase_element is specific for the
+Matrix model and it depends on increases/decreases in storage requirements.</p>
+<p>The run-time complexity of resize is quadratic in the matrix's
+size.</p>
+<h4>Invariants</h4>
+<h4>Models</h4>
+<ul>
+<li><code>matrix</code>, <code>bounded_matrix</code>, <code>c_matrix</code></li>
+<li><code>identity_matrix</code> , <code>zero_matrix</code> , <code>scalar_matrix</code></li>
+<li><code>triangular_matrix</code> , <code>symmetric_matrix</code> , <code>banded_matrix</code></li>
+<li><code>mapped_matrix</code> , <code>compressed_matrix</code> , <code>coordinate_matrix</code></li>
+</ul>
+<h4>Notes</h4>
+<p><a name="matrix_expression_note">[1]</a>
+As a user you need not care about <tt>Matrix</tt> being a refinement of the MatrixExpression. Being a refinement of the MatrixExpression is only important for the template-expression engine but not the user.</p>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/expression_concept.html b/doc/expression_concept.html
new file mode 100644
index 0000000..ffbfd14
--- /dev/null
+++ b/doc/expression_concept.html
@@ -0,0 +1,1074 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Expression Concepts</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Expression Concepts</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="scalar_expression"></a>Scalar Expression</h2>
+<h4>Description</h4>
+<p>A Scalar Expression is an expression convertible to a scalar
+type.</p>
+<h4>Refinement of</h4>
+<p>Default Constructible.</p>
+<h4>Associated types</h4>
+<table border="1" summary="associated types">
+<tbody>
+<tr>
+<td>Public base</td>
+<td>scaler_expression&lt;S&gt;</td>
+<td>S must be derived from this public base type.</td>
+</tr>
+<tr>
+<td>Value type</td>
+<td><code>value_type</code></td>
+<td>The type of the scalar expression.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notation</h4>
+<table border="0" summary="notation">
+<tbody>
+<tr>
+<td><code>S</code></td>
+<td>A type that is a model of Scalar Expression</td>
+</tr>
+</tbody>
+</table>
+<h4>Definitions</h4>
+<h4>Valid expressions</h4>
+<p>In addition to the expressions defined in Default Constructible
+the following expressions must be valid.</p>
+<table border="1" summary="expressions">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Type requirements</th>
+<th>Return type</th>
+</tr>
+<tr>
+<td>Evaluation</td>
+<td><code>operator value_type () const</code></td>
+<td>&nbsp;</td>
+<td><code>value_type</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Expression semantics</h4>
+<p>Semantics of an expression is defined only where it differs
+from, or is not defined in Default Constructible.</p>
+<table border="1" summary="semantics">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Precondition</th>
+<th>Semantics</th>
+<th>Postcondition</th>
+</tr>
+<tr>
+<td>Evaluation</td>
+<td><code>operator value_type () const</code></td>
+<td>&nbsp;</td>
+<td>&nbsp; Evaluates the scalar expression.</td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Complexity guarantees</h4>
+<p>The run-time complexity of the evaluation is specific for the
+evaluated scalar expression.</p>
+<h4>Invariants</h4>
+<h4>Models</h4>
+<ul>
+<li><code>vector_scalar_unary</code></li>
+<li><code>vector_scalar_binary</code></li>
+</ul>
+<h2><a name="vector_expression"></a>Vector Expression</h2>
+<h4>Description</h4>
+<p>A Vector Expression is an expression evaluatable to a vector.
+Vector Expression provides an <a href=
+"iterator_concept.html#indexed_bidirectional_iterator">Indexed Bidirectional
+Iterator</a> or an <a href=
+"iterator_concept.html#indexed_random_access_iterator">Indexed Random Access
+Iterator</a> .</p>
+<h4>Refinement of</h4>
+<p>Default Constructible.</p>
+<h4>Associated types</h4>
+<table border="1" summary="associated types">
+<tbody>
+<tr>
+<td>Public base</td>
+<td>vector_expression&lt;V&gt;</td>
+<td>V must be derived from this public base type.</td>
+</tr>
+<tr>
+<td>Value type</td>
+<td><code>value_type</code></td>
+<td>
+The element type of the vector expression.
+</td>
+</tr>
+<tr>
+<td>Reference type</td>
+<td><code>reference</code></td>
+<td>
+The return type when accessing an element of a vector expression.
+<br />
+Convertable to a<code>value_type</code>.
+</td>
+</tr>
+<tr>
+<td>Const reference type</td>
+<td><code>const_reference</code></td>
+<td>
+The return type when accessing an element of a constant vector expression.
+<br />
+Convertable to a<code>value_type</code>.
+</td>
+</tr>
+<tr>
+<td>Size type</td>
+<td><code>size_type</code></td>
+<td>
+The index type of the vector expression. Am unsigned integral type used to represent size and index values.
+<br />
+Can represent any nonnegative value of <code>difference_type</code>.
+</td>
+</tr>
+<tr>
+<td>Distance type</td>
+<td><code>difference_type</code></td>
+<td>
+A signed integral type used to represent the distance between two of the vector expression&#039;s iterators.
+</td>
+</tr>
+<tr>
+<td>Const iterator type</td>
+<td><code>const_iterator</code></td>
+<td>A type of iterator that may be used to examine a vector
+expression's elements.</td>
+</tr>
+<tr>
+<td>Iterator type</td>
+<td><code>iterator</code></td>
+<td>A type of iterator that may be used to modify a vector
+expression's elements.</td>
+</tr>
+<tr>
+<td>Const reverse iterator type</td>
+<td><code>const_reverse_iterator</code></td>
+<td>A Reverse Iterator adaptor whose base iterator type is the
+vector expression's const iterator type.</td>
+</tr>
+<tr>
+<td>Reverse iterator type</td>
+<td><code>reverse_iterator</code></td>
+<td>A Reverse Iterator adaptor whose base iterator type is the
+vector expression's iterator type.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notation</h4>
+<table border="0" summary="notation">
+<tbody>
+<tr>
+<td><code>V</code></td>
+<td>A type that is a model of Vector Expression</td>
+</tr>
+<tr>
+<td><code>v, v1, v2</code></td>
+<td>Object of type <code>V</code></td>
+</tr>
+<tr>
+<td><code>i</code></td>
+<td>Object of a type convertible to <code>size_type</code></td>
+</tr>
+<tr>
+<td><code>t</code></td>
+<td>Object of a type convertible to <code>value_type</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Definitions</h4>
+<h4>Valid expressions</h4>
+<p>In addition to the expressions defined in Default Constructible
+the following expressions must be valid.</p>
+<table border="1" summary="expressions">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Type requirements</th>
+<th>Return type</th>
+</tr>
+<tr>
+<td rowspan="2">Beginning of range</td>
+<td><code>v.begin ()</code></td>
+<td>&nbsp;</td>
+<td><code>const_iterator</code></td>
+</tr>
+<tr>
+<td><code>v.begin ()</code></td>
+<td><code>v</code> is mutable.</td>
+<td><code>iterator</code></td>
+</tr>
+<tr>
+<td rowspan="2">End of range</td>
+<td><code>v.end ()</code></td>
+<td>&nbsp;</td>
+<td><code>const_iterator</code></td>
+</tr>
+<tr>
+<td><code>v.end ()</code></td>
+<td><code>v</code> is mutable.</td>
+<td><code>iterator</code></td>
+</tr>
+<tr>
+<td>Size</td>
+<td><code>v.size ()</code></td>
+<td>&nbsp;</td>
+<td><code>size_type</code></td>
+</tr>
+<tr>
+<td>Swap</td>
+<td><code>v1.swap (v2)</code></td>
+<td><code>v1</code> and <code>v2</code> are mutable.</td>
+<td><code>void</code></td>
+</tr>
+<tr>
+<td rowspan="2">Beginning of reverse range</td>
+<td><code>v.rbegin ()</code></td>
+<td>&nbsp;</td>
+<td><code>const_reverse_iterator</code></td>
+</tr>
+<tr>
+<td><code>v.rbegin ()</code></td>
+<td><code>v</code> is mutable.</td>
+<td><code>reverse_iterator</code></td>
+</tr>
+<tr>
+<td rowspan="2">End of reverse range</td>
+<td><code>v.rend ()</code></td>
+<td>&nbsp;</td>
+<td><code>const_reverse_iterator</code></td>
+</tr>
+<tr>
+<td><code>v.rend ()</code></td>
+<td><code>v</code> is mutable.</td>
+<td><code>reverse_iterator</code></td>
+</tr>
+<tr>
+<td>Element access</td>
+<td><code>v (i)</code></td>
+<td><code>i</code> is convertible to <code>size_type</code>.</td>
+<td>Convertible to <code>value_type</code>.</td>
+</tr>
+<tr>
+<td rowspan="2">Assignment</td>
+<td><code>v2 = v1</code></td>
+<td><code>v2</code> is mutable and <code>v1</code> is convertible
+to <code>V</code>.</td>
+<td><code>V &amp;</code></td>
+</tr>
+<tr>
+<td><code>v2.assign (v1)</code></td>
+<td><code>v2</code> is mutable and <code>v1</code> is convertible
+to <code>V</code>.</td>
+<td><code>V &amp;</code></td>
+</tr>
+<tr>
+<td rowspan="5">Computed assignment</td>
+<td><code>v2 += v1</code></td>
+<td><code>v2</code> is mutable and <code>v1</code> is convertible
+to <code>V</code>.</td>
+<td><code>V &amp;</code></td>
+</tr>
+<tr>
+<td><code>v2.plus_assign (v1)</code></td>
+<td><code>v2</code> is mutable and <code>v1</code> is convertible
+to <code>V</code>.</td>
+<td><code>V &amp;</code></td>
+</tr>
+<tr>
+<td><code>v2 -= v1</code></td>
+<td><code>v2</code> is mutable and <code>v1</code> is convertible
+to <code>V</code>.</td>
+<td><code>V &amp;</code></td>
+</tr>
+<tr>
+<td><code>v2.minus_assign (v1)</code></td>
+<td><code>v2</code> is mutable and <code>v1</code> is convertible
+to <code>V</code>.</td>
+<td><code>V &amp;</code></td>
+</tr>
+<tr>
+<td><code>v *= t</code></td>
+<td><code>v</code> is mutable and <code>t</code> is convertible to
+<code>value_type</code>.</td>
+<td><code>V &amp;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Expression semantics</h4>
+<p>Semantics of an expression is defined only where it differs
+from, or is not defined in Default Constructible.</p>
+<table border="1" summary="semantics">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Precondition</th>
+<th>Semantics</th>
+<th>Postcondition</th>
+</tr>
+<tr>
+<td>Beginning of range</td>
+<td><code>v.begin ()</code></td>
+<td>&nbsp;</td>
+<td>Returns an iterator pointing to the first element in the vector
+expression.</td>
+<td><code>v.begin ()</code> is either dereferenceable or
+past-the-end. It is past-the-end if and only if <code>v.size () ==
+0</code>.</td>
+</tr>
+<tr>
+<td>End of range</td>
+<td><code>v.end ()</code></td>
+<td>&nbsp;</td>
+<td>Returns an iterator pointing one past the last element in the
+vector expression.</td>
+<td><code>v.end ()</code> is past-the-end.</td>
+</tr>
+<tr>
+<td>Size</td>
+<td><code>v.size ()</code></td>
+<td>&nbsp;</td>
+<td>Returns the size of the vector expression, that is, its number
+of elements.</td>
+<td><code>v.size () &gt;= 0</code></td>
+</tr>
+<tr>
+<td>Swap</td>
+<td><code>v1.swap (v2)</code></td>
+<td>&nbsp;</td>
+<td>Equivalent to <code>swap (v1, v2)</code>.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Beginning of reverse range</td>
+<td><code>v.rbegin ()</code></td>
+<td>&nbsp;</td>
+<td>Equivalent to <code>reverse_iterator (v.end ())</code>.</td>
+<td><code>v.rbegin ()</code> is either dereferenceable or
+past-the-end. It is past-the-end if and only if <code>v.size () ==
+0</code>.</td>
+</tr>
+<tr>
+<td>End of reverse range</td>
+<td><code>v.rend ()</code></td>
+<td>&nbsp;</td>
+<td>Equivalent to <code>reverse_iterator (v.begin ())</code>.</td>
+<td><code>v.rend ()</code> is past-the-end.</td>
+</tr>
+<tr>
+<td>Element access</td>
+<td><code>v (i)</code></td>
+<td><code>0 &lt;= i &lt; v.size ()</code></td>
+<td>Returns the <code>i</code>-th element of the vector
+expression.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td rowspan="2">Assignment</td>
+<td><code>v2 = v1</code></td>
+<td><code>v1.size () == v2.size ()</code></td>
+<td>Assigns every element of the evaluated vector expression
+<code>v1</code> to the corresponding element of <code>v2</code>
+.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td><code>v2.assign (v1)</code></td>
+<td><code>v1.size () == v2.size ()</code></td>
+<td>Assigns every element of <code>v1</code> to the corresponding
+element of <code>v2</code>.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td rowspan="5">Computed assignment</td>
+<td><code>v2 += v1</code></td>
+<td><code>v1.size () == v2.size ()</code></td>
+<td>Adds every element of the evaluated vector expression
+<code>v1</code> to the corresponding element of
+<code>v2</code>.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td><code>v2.plus_assign (v1)</code></td>
+<td><code>v1.size () == v2.size ()</code></td>
+<td>Adds every element of <code>v1</code> to the corresponding
+element of <code>v2</code>.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td><code>v2 -= v1</code></td>
+<td><code>v1.size () == v2.size ()</code></td>
+<td>Subtracts every element of the evaluated vector expression
+<code>v1</code> from the corresponding element of <code>v2</code>
+.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td><code>v2.minus_assign (v1)</code></td>
+<td><code>v1.size () == v2.size ()</code></td>
+<td>Subtracts every element of <code>v1</code> from the
+corresponding element of <code>v2</code>.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td><code>v *= t</code></td>
+<td>&nbsp;</td>
+<td>Multiplies every element of <code>v</code> with <code>t</code>
+.</td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Complexity guarantees</h4>
+<p>The run-time complexity of <code>begin ()</code> and <code>end
+()</code> is specific for the evaluated vector expression,
+typically amortized constant time.</p>
+<p>The run-time complexity of <code>size ()</code> is constant
+time.</p>
+<p>The run-time complexity of <code>swap ()</code> is specific for
+the evaluated vector expression, typically constant time.</p>
+<p>The run-time complexity of <code>rbegin ()</code> and <code>rend
+()</code> is specific for the evaluated vector expression,
+typically amortized constant time.</p>
+<p>The run-time complexity of the element access is specific for
+the evaluated vector expression, typically amortized constant time
+for the dense and logarithmic for the sparse case.</p>
+<p>The run-time complexity of the arithmetic operations is specific
+for the evaluated vector expressions, typically linear in the size
+of the expressions.</p>
+<h4>Invariants</h4>
+<table border="1" summary="invariants">
+<tbody>
+<tr>
+<td>Valid range</td>
+<td>For any vector expression <code>v</code>, <code>[v.begin (),
+v.end ())</code> is a valid range.</td>
+</tr>
+<tr>
+<td>Completeness</td>
+<td>An algorithm that iterates through the range <code>[v.begin (),
+v.end ())</code> will pass through every element of <code>v</code>
+.</td>
+</tr>
+<tr>
+<td>Valid reverse range</td>
+<td><code>[v.rbegin (), v.rend ())</code> is a valid range.</td>
+</tr>
+<tr>
+<td>Equivalence of ranges</td>
+<td>The distance from <code>v.begin ()</code> to <code>v.end
+()</code> is the same as the distance from <code>v.rbegin ()</code>
+to <code>v.rend ()</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Models</h4>
+<ul>
+<li><code>vector_range;</code></li>
+<li><code>vector_slice</code></li>
+<li><code>matrix_row</code></li>
+<li><code>matrix_column</code></li>
+<li><code>matrix_vector_range</code></li>
+<li><code>matrix_vector_slice</code></li>
+<li><code>vector_unary</code></li>
+<li><code>vector_binary</code></li>
+<li><code>vector_binary_scalar1</code></li>
+<li><code>vector_binary_scalar2</code></li>
+<li><code>matrix_vector_unary1</code></li>
+<li><code>matrix_vector_unary2</code></li>
+<li><code>matrix_vector_binary1</code></li>
+<li><code>matrix_vector_binary2</code></li>
+</ul>
+
+<h2><a name="matrix_expression"></a>Matrix Expression</h2>
+<h4>Description</h4>
+<p>A Matrix Expression is an expression evaluatable to a matrix.
+Matrix Expression provides an <a href=
+"iterator_concept.html#indexed_bidirectional_cr_iterator">Indexed
+Bidirectional Column/Row Iterator</a> or an <a href=
+"iterator_concept.html#indexed_random_access_cr_iterator">Indexed Random
+Access Column/Row Iterator</a> .</p>
+<h4>Refinement of</h4>
+<p>Default Constructible.</p>
+
+<h4>Associated types</h4>
+<h5>immutable types</h5>
+<table border="1" summary="associated immutable types" title="">
+<tbody>
+<tr>
+<td>Public base</td>
+<td><code>matrix_expression&lt;M&gt;</code></td>
+<td>M must be derived from this public base type.</td>
+</tr>
+<tr>
+<td>Value type</td>
+<td><code>value_type</code></td>
+<td>
+The element type of the matrix expression.
+</td>
+</tr>
+<tr>
+<td>Const reference type</td>
+<td><code>const_reference</code></td>
+<td>
+The return type when accessing an element of a constant matrix expression.
+<br />
+Convertable to a <code>value_type</code>.
+</td>
+</tr>
+<tr>
+<td>Size type</td>
+<td><code>size_type</code></td>
+<td>
+The index type of the matrix expression. Am unsigned integral type used to represent size and index values.
+<br />
+Can represent any nonnegative value of <code>difference_type</code>.
+</td>
+</tr>
+<tr>
+<td>Distance type</td>
+<td><code>difference_type</code></td>
+<td>
+A signed integral type used to represent the distance between two of the matrix expression&#039;s iterators.
+</td>
+</tr>
+<tr>
+<td rowspan="2">Const iterator types</td>
+<td><code>const_iterator1</code></td>
+<td>A type of column iterator that may be used to examine a matrix
+expression's elements.</td>
+</tr>
+<tr>
+<td><code>const_iterator2</code></td>
+<td>A type of row iterator that may be used to examine a matrix
+expression's elements.</td>
+</tr>
+<tr>
+<td rowspan="2">Const reverse iterator types</td>
+<td><code>const_reverse_iterator1</code></td>
+<td>A Reverse Iterator adaptor whose base iterator type is the
+matrix expression's const column iterator type.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2</code></td>
+<td>A Reverse Iterator adaptor whose base iterator type is the
+matrix expression's const row iterator type.</td>
+</tr>
+</tbody>
+</table>
+ 
+<h5>mutable types</h5>
+<table border="1" summary="associated mutable types">
+<tbody>
+<tr>
+<td>Reference type</td>
+<td><code>reference</code></td>
+<td>
+The return type when accessing an element of a matrix expression.
+<br />
+Convertable to a <code>value_type</code>.
+</td>
+</tr>
+<tr>
+<td rowspan="2">Iterator types</td>
+<td><code>iterator1</code></td>
+<td>A type of column iterator that may be used to modify a matrix
+expression's elements.</td>
+</tr>
+<tr>
+<td><code>iterator2</code></td>
+<td>A type of row iterator that may be used to modify a matrix
+expression's elements.</td>
+</tr>
+<tr>
+<td rowspan="2">Reverse iterator types</td>
+<td><code>reverse_iterator1</code></td>
+<td>A Reverse Iterator adaptor whose base iterator type is the
+matrix expression's column iterator type.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2</code></td>
+<td>A Reverse Iterator adaptor whose base iterator type is the
+matrix expression's row iterator type.</td>
+</tr>
+</tbody>
+</table>
+
+
+<h4>Notation</h4>
+<table border="0" summary="notation">
+<tbody>
+<tr>
+<td><code>M</code></td>
+<td>A type that is a model of Matrix Expression</td>
+</tr>
+<tr>
+<td><code>m, m1, m2</code></td>
+<td>Object of type <code>M</code></td>
+</tr>
+<tr>
+<td><code>i, j</code></td>
+<td>Objects of a type convertible to <code>size_type</code></td>
+</tr>
+<tr>
+<td><code>t</code></td>
+<td>Object of a type convertible to <code>value_type</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Definitions</h4>
+<h4>Valid expressions</h4>
+<p>In addition to the expressions defined in Default Constructible
+the following expressions must be valid.</p>
+
+<h5>immutable expressions</h5>
+<table border="1" summary="expressions">
+<thead>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Type requirements</th>
+<th>Return type</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td rowspan="2">Size</td>
+<td><code>m.size1 ()</code></td>
+<td>&nbsp;</td>
+<td><code>size_type</code></td>
+</tr>
+<tr>
+<td><code>m.size2 ()</code></td>
+<td>&nbsp;</td>
+<td><code>size_type</code></td>
+</tr>
+</tbody>
+</table>
+
+<h5>possibly mutable expressions</h5>
+<table border="1" summary="expressions">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Type requirements</th>
+<th>Return type</th>
+</tr>
+<tr>
+<td rowspan="4">Beginning of range</td>
+<td><code>m.begin1 ()</code></td>
+<td>&nbsp;</td>
+<td><code>const_iterator1</code></td>
+</tr>
+<tr>
+<td><code>m.begin2 ()</code></td>
+<td>&nbsp;</td>
+<td><code>const_iterator2</code></td>
+</tr>
+<tr>
+<td><code>m.begin1 ()</code></td>
+<td><code>m</code> is mutable.&nbsp;</td>
+<td><code>iterator1</code></td>
+</tr>
+<tr>
+<td><code>m.begin2 ()</code></td>
+<td><code>m</code> is mutable.</td>
+<td><code>iterator2</code></td>
+</tr>
+<tr>
+<td rowspan="4">End of range</td>
+<td><code>m.end1 ()</code></td>
+<td>&nbsp;</td>
+<td><code>const_iterator1</code></td>
+</tr>
+<tr>
+<td><code>m.end2 ()</code></td>
+<td>&nbsp;</td>
+<td><code>const_iterator2</code></td>
+</tr>
+<tr>
+<td><code>m.end1 ()</code></td>
+<td><code>m</code> is mutable.&nbsp;</td>
+<td><code>iterator1</code></td>
+</tr>
+<tr>
+<td><code>m.end2 ()</code></td>
+<td><code>m</code> is mutable.</td>
+<td><code>iterator2</code></td>
+</tr>
+<tr>
+<td>Swap</td>
+<td><code>m1.swap (m2)</code></td>
+<td><code>m1</code> and <code>m2</code> are mutable.&nbsp;</td>
+<td><code>void</code></td>
+</tr>
+<tr>
+<td rowspan="4">Beginning of reverse range</td>
+<td><code>m.rbegin1 ()</code></td>
+<td>&nbsp;</td>
+<td><code>const_reverse_iterator1</code></td>
+</tr>
+<tr>
+<td><code>m.rbegin2 ()</code></td>
+<td>&nbsp;</td>
+<td><code>const_reverse_iterator2</code></td>
+</tr>
+<tr>
+<td><code>m.rbegin1 ()</code></td>
+<td><code>m</code> is mutable.&nbsp;</td>
+<td><code>reverse_iterator1</code></td>
+</tr>
+<tr>
+<td><code>m.rbegin2 ()</code></td>
+<td><code>m</code> is mutable.</td>
+<td><code>reverse_iterator2</code></td>
+</tr>
+<tr>
+<td rowspan="4">End of reverse range</td>
+<td><code>m.rend1 ()</code></td>
+<td>&nbsp;</td>
+<td><code>const_reverse_iterator1</code></td>
+</tr>
+<tr>
+<td><code>m.rend2 ()</code></td>
+<td>&nbsp;</td>
+<td><code>const_reverse_iterator2</code></td>
+</tr>
+<tr>
+<td><code>m.rend1 ()</code></td>
+<td><code>m</code> is mutable.</td>
+<td><code>reverse_iterator1</code></td>
+</tr>
+<tr>
+<td><code>m.rend2 ()</code></td>
+<td><code>m</code> is mutable.</td>
+<td><code>reverse_iterator2</code></td>
+</tr>
+<tr>
+<td>Element access</td>
+<td><code>m (i, j)</code></td>
+<td><code>i</code> and <code>j</code> are convertible to
+<code>size_type</code> .</td>
+<td>Convertible to <code>value_type</code>.</td>
+</tr>
+<tr>
+<td rowspan="2">Assignment</td>
+<td><code>m2 = m1</code></td>
+<td><code>m2</code> is mutable and <code>m1</code> is convertible
+to <code>M</code>.</td>
+<td><code>M &amp;</code></td>
+</tr>
+<tr>
+<td><code>m2.assign (m1)</code></td>
+<td><code>m2</code> is mutable and <code>m1</code> is convertible
+to <code>M</code>.</td>
+<td><code>M &amp;</code></td>
+</tr>
+<tr>
+<td rowspan="5">Computed assignment</td>
+<td><code>m2 += m1</code></td>
+<td><code>m2</code> is mutable and <code>m1</code> is convertible
+to <code>M</code>.</td>
+<td><code>M &amp;</code></td>
+</tr>
+<tr>
+<td><code>m2.plus_assign (m1)</code></td>
+<td><code>m2</code> is mutable and <code>m1</code> is convertible
+to <code>M</code>.</td>
+<td><code>M &amp;</code></td>
+</tr>
+<tr>
+<td><code>m2 -= m1</code></td>
+<td><code>m2</code> is mutable and <code>m1</code> is convertible
+to <code>M</code>.</td>
+<td><code>M &amp;</code></td>
+</tr>
+<tr>
+<td><code>m2.minus_assign (m1)</code></td>
+<td><code>m2</code> is mutable and <code>m1</code> is convertible
+to <code>M</code>.</td>
+<td><code>M &amp;</code></td>
+</tr>
+<tr>
+<td><code>m *= t</code></td>
+<td><code>m</code> is mutable and <code>t</code> is convertible to
+<code>value_type</code>.</td>
+<td><code>M &amp;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Expression semantics</h4>
+<p>Semantics of an expression is defined only where it differs
+from, or is not defined in Default Constructible.</p>
+<table border="1" summary="semantics">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Precondition</th>
+<th>Semantics</th>
+<th>Postcondition</th>
+</tr>
+<tr>
+<td rowspan="2">Beginning of range</td>
+<td><code>m.begin1 ()</code></td>
+<td>&nbsp;</td>
+<td>Returns an iterator pointing to the first element in the first
+column of a matrix expression.</td>
+<td><code>m.begin1 ()</code> is either dereferenceable or
+past-the-end. It is past-the-end if and only if <code>m.size1 () ==
+0</code>.</td>
+</tr>
+<tr>
+<td><code>m.begin2 ()</code></td>
+<td>&nbsp;</td>
+<td>Returns an iterator pointing to the first element in the first
+row of a matrix expression.</td>
+<td><code>m.begin2 ()</code> is either dereferenceable or
+past-the-end. It is past-the-end if and only if <code>m.size2 () ==
+0</code>.</td>
+</tr>
+<tr>
+<td rowspan="2">End of range</td>
+<td><code>m.end1 ()</code></td>
+<td>&nbsp;</td>
+<td>Returns an iterator pointing one past the last element in the
+matrix expression.</td>
+<td><code>m.end1 ()</code> is past-the-end.</td>
+</tr>
+<tr>
+<td><code>m.end2 ()</code></td>
+<td>&nbsp;</td>
+<td>Returns an iterator pointing one past the last element in the
+matrix expression.</td>
+<td><code>m.end2 ()</code> is past-the-end.</td>
+</tr>
+<tr>
+<td rowspan="2">Size</td>
+<td><code>m.size1 ()</code></td>
+<td>&nbsp;</td>
+<td>Returns the number of rows of the matrix expression.</td>
+<td><code>m.size1 () &gt;= 0</code></td>
+</tr>
+<tr>
+<td><code>m.size2 ()</code></td>
+<td>&nbsp;</td>
+<td>Returns the number of columns of the matrix expression.</td>
+<td><code>m.size2 () &gt;= 0</code></td>
+</tr>
+<tr>
+<td>Swap</td>
+<td><code>m1.swap (m2)</code></td>
+<td>&nbsp;</td>
+<td>Equivalent to <code>swap (m1, m2)</code>.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td rowspan="2">Beginning of reverse range</td>
+<td><code>m.rbegin1 ()</code></td>
+<td>&nbsp;</td>
+<td>Equivalent to <code>reverse_iterator1 (m.end1 ())</code>.</td>
+<td><code>m.rbegin1 ()</code> is either dereferenceable or
+past-the-end. It is past-the-end if and only if <code>m.size1 () ==
+0</code>.</td>
+</tr>
+<tr>
+<td><code>m.rbegin2 ()</code></td>
+<td>&nbsp;</td>
+<td>Equivalent to <code>reverse_iterator2 (m.end2 ())</code>.</td>
+<td><code>m.rbegin2 ()</code> is either dereferenceable or
+past-the-end. It is past-the-end if and only if <code>m.size2 () ==
+0</code>.</td>
+</tr>
+<tr>
+<td rowspan="2">End of reverse range</td>
+<td><code>m.rend1 ()</code></td>
+<td>&nbsp;</td>
+<td>Equivalent to <code>reverse_iterator1 (m.begin1
+())</code>.</td>
+<td><code>m.rend1 ()</code> is past-the-end.</td>
+</tr>
+<tr>
+<td><code>m.rend2 ()</code></td>
+<td>&nbsp;</td>
+<td>Equivalent to <code>reverse_iterator2 (m.begin2
+())</code>.</td>
+<td><code>m.rend2 ()</code> is past-the-end.</td>
+</tr>
+<tr>
+<td>Element access</td>
+<td><code>m (i, j)</code></td>
+<td><code>0 &lt;= i &lt; m.size1 ()</code> and <code>0 &lt;= j &lt;
+m.size2 ()</code></td>
+<td>Returns the <code>j</code>-th element of the <code>i</code>-th
+row of the matrix expression.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td rowspan="2">Assignment</td>
+<td><code>m2 = m1</code></td>
+<td><code>m1.size1 () == m2.size1 ()</code> and <code><br />
+m1.size2 () == m2.size2 ()</code></td>
+<td>Assigns every element of the evaluated matrix expression
+<code>m1</code> to the corresponding element of <code>m2</code>
+.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td><code>m2.assign (m1)</code></td>
+<td><code>m1.size1 () == m2.size1 ()</code> and <code><br />
+m1.size2 () == m2.size2 ()</code></td>
+<td>Assigns every element of <code>m1</code> to the corresponding
+element of <code>m2</code>.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td rowspan="5">Computed assignment</td>
+<td><code>m2 += m1</code></td>
+<td><code>m1.size1 () == m2.size1 ()</code> and <code><br />
+m1.size2 () == m2.size2 ()</code></td>
+<td>Adds every element of the evaluated matrix expression
+<code>m1</code> to the corresponding element of
+<code>m2</code>.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td><code>m2.plus_assign (m1)</code></td>
+<td><code>m1.size1 () == m2.size1 ()</code> and <code><br />
+m1.size2 () == m2.size2 ()</code></td>
+<td>Adds every element of <code>m1</code> to the corresponding
+element of <code>m2</code>.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td><code>m2 -= m1</code></td>
+<td><code>m1.size1 () == m2.size1 ()</code> and <code><br />
+m1.size2 () == m2.size2 ()</code></td>
+<td>Subtracts every element of the evaluated matrix expression
+<code>m1</code> from the corresponding element of <code>m2</code>
+.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td><code>m2.minus_assign (m1)</code></td>
+<td><code>m1.size1 () == m2.size1 ()</code> and <code><br />
+m1.size2 () == m2.size2 ()</code></td>
+<td>Subtracts every element of <code>m1</code> from the
+corresponding element of <code>m2</code>.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td><code>m *= t</code></td>
+<td>&nbsp;</td>
+<td>Multiplies every element of <code>m</code> with <code>t</code>
+.</td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Complexity guarantees</h4>
+<p>The run-time complexity of <code>begin1 ()</code>, <code>begin2
+()</code> , <code>end1 ()</code> and <code>end2 ()</code> is
+specific for the evaluated matrix expression.</p>
+<p>The run-time complexity of <code>size1 ()</code> and <code>size2
+()</code> is constant time.</p>
+<p>The run-time complexity of <code>swap ()</code> is specific for
+the evaluated matrix expression, typically constant time.</p>
+<p>The run-time complexity of <code>rbegin1 ()</code>,
+<code>rbegin2 ()</code> , <code>rend1 ()</code> and <code>rend2
+()</code> is specific for the evaluated matrix expression.</p>
+<p>The run-time complexity of the element access is specific for
+the evaluated matrix expression, typically amortized constant time
+for the dense and logarithmic for the sparse case.</p>
+<p>The run-time complexity of the arithmetic operations is specific
+for the evaluated matrix expressions, typically quadratic in the
+size of the proxies.</p>
+<h4>Invariants</h4>
+<table border="1" summary="invariants">
+<tbody>
+<tr>
+<td>Valid range</td>
+<td>For any matrix expression <code>m</code>, <code>[m.begin1 (),
+m.end1 ())</code> and <code>[m.begin2 (), m.end2 ())</code> are
+valid ranges.</td>
+</tr>
+<tr>
+<td>Completeness</td>
+<td>An algorithm that iterates through the range <code>[m.begin1
+(), m.end1 ())</code> will pass through every row of <code>m</code>
+, an algorithm that iterates through the range <code>[m.begin2 (),
+m.end2 ())</code> will pass through every column of <code>m</code>
+.</td>
+</tr>
+<tr>
+<td>Valid reverse range</td>
+<td><code>[m.rbegin1 (), m.rend1 ())</code> and <code>[m.rbegin2
+(), m.rend2 ())</code> are valid ranges.</td>
+</tr>
+<tr>
+<td>Equivalence of ranges</td>
+<td>The distance from <code>m.begin1 ()</code> to <code>m.end1
+()</code> is the same as the distance from <code>m.rbegin1
+()</code> to <code>m.rend1 ()</code> and the distance from
+<code>m.begin2 ()</code> to <code>m.end2 ()</code> is the same as
+the distance from <code>m.rbegin2 ()</code> to <code>m.rend2
+()</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Models</h4>
+<ul>
+<li><code>matrix_range</code></li>
+<li><code>matrix_slice;</code></li>
+<li><code>triangular_adaptor</code></li>
+<li><code>symmetric_adaptor</code></li>
+<li><code>banded_adaptor</code></li>
+<li><code>vector_matrix_binary</code></li>
+<li><code>matrix_unary1</code></li>
+<li><code>matrix_unary2</code></li>
+<li><code>matrix_binary</code></li>
+<li><code>matrix_binary_scalar1</code></li>
+<li><code>matrix_binary_scalar2</code></li>
+<li><code>matrix_matrix_binary</code></li>
+</ul>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/hermitian.html b/doc/hermitian.html
new file mode 100644
index 0000000..f6a4f62
--- /dev/null
+++ b/doc/hermitian.html
@@ -0,0 +1,597 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Hermitian Matrix</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Hermitian Matrix</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="hermitian_matrix"></a>Hermitian Matrix</h2>
+<h4>Description</h4>
+<p>The templated class <code>hermitian_matrix&lt;T, F1, F2,
+A&gt;</code> is the base container adaptor for hermitian matrices.
+For a <em>(n x n</em> )-dimensional hermitian matrix and <em>0
+&lt;= i &lt; n</em>, <em>0 &lt;= j &lt; n</em> holds
+<em>h</em><sub><em>i, j</em></sub> <em>= h</em><sub><em>j,
+i</em></sub><sup><em>-</em></sup>. The storage of hermitian
+matrices is packed.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/hermitian.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    hermitian_matrix&lt;std::complex&lt;double&gt;, lower&gt; ml (3, 3);
+    for (unsigned i = 0; i &lt; ml.size1 (); ++ i) {
+        for (unsigned j = 0; j &lt; i; ++ j)
+            ml (i, j) = std::complex&lt;double&gt; (3 * i + j, 3 * i + j);
+        ml (i, i) = std::complex&lt;double&gt; (4 * i, 0);
+    }
+    std::cout &lt;&lt; ml &lt;&lt; std::endl;
+    hermitian_matrix&lt;std::complex&lt;double&gt;, upper&gt; mu (3, 3);
+    for (unsigned i = 0; i &lt; mu.size1 (); ++ i) {
+        mu (i, i) = std::complex&lt;double&gt; (4 * i, 0);
+        for (unsigned j = i + 1; j &lt; mu.size2 (); ++ j)
+            mu (i, j) = std::complex&lt;double&gt; (3 * i + j, 3 * i + j);
+    }
+    std::cout &lt;&lt; mu &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header hermitian.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the matrix.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F1</code></td>
+<td>Functor describing the type of the hermitian matrix. <a href=
+"#hermitian_matrix_1">[1]</a></td>
+<td><code>lower</code></td>
+</tr>
+<tr>
+<td><code>F2</code></td>
+<td>Functor describing the storage organization. <a href=
+"#hermitian_matrix_2">[2]</a></td>
+<td><code>row_major</code></td>
+</tr>
+<tr>
+<td><code>A</code></td>
+<td>The type of the adapted array. <a href=
+"#hermitian_matrix_3">[3]</a></td>
+<td><code>unbounded_array&lt;T&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"container_concept.html#matrix">Matrix</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_container&lt;hermitian_matrix&lt;T, F1, F2, A&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>hermitian_matrix ()</code></td>
+<td>Allocates an uninitialized <code>hermitian_matrix</code> that
+holds zero rows of zero elements.</td>
+</tr>
+<tr>
+<td><code>hermitian_matrix (size_type size)</code></td>
+<td>Allocates an uninitialized <code>hermitian_matrix</code> that
+holds <code>size</code> rows of <code>size</code> elements.</td>
+</tr>
+<tr>
+<td><code>hermitian_matrix (const hermitian_matrix
+&amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_matrix (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size, bool preserve =
+true)</code></td>
+<td>Reallocates a <code>hermitian_matrix</code> to hold
+<code>size</code> rows of <code>size</code> elements. The existing
+elements of the <code>hermitian_matrix</code> are preseved when
+specified.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns a <code>const</code> reference of the <code>j</code>
+-th element in the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>hermitian_matrix &amp;operator = (const hermitian_matrix
+&amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>hermitian_matrix &amp;assign_temporary (hermitian_matrix
+&amp;m)</code></td>
+<td>Assigns a temporary. May change the hermitian matrix
+<code>m</code> .</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_matrix &amp;operator = (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_matrix &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the hermitian matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_matrix &amp;operator += (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the hermitian matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_matrix &amp;plus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Adds a matrix expression to the hermitian matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_matrix &amp;operator -= (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the hermitian matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_matrix &amp;minus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Subtracts a matrix expression from the hermitian matrix. Left
+and right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+hermitian_matrix &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the hermitian matrix
+with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+hermitian_matrix &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the hermitian matrix
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (hermitian_matrix &amp;m)</code></td>
+<td>Swaps the contents of the hermitian matrices.</td>
+</tr>
+<tr>
+<td><code>void insert (size_type i, size_type j, const_reference
+t)</code></td>
+<td>Inserts the value <code>t</code> at the <code>j</code>-th
+element of the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void erase (size_type i, size_type j)</code></td>
+<td>Erases the value at the <code>j</code>-th elemenst of the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td>Clears the matrix.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>hermitian_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>hermitian_matrix</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="hermitian_matrix_1" id="hermitian_matrix_1">[1]</a>
+Supported parameters for the type of the hermitian matrix are
+<code>lower</code> and <code>upper</code>.</p>
+<p><a name="hermitian_matrix_2" id="hermitian_matrix_2">[2]</a>
+Supported parameters for the storage organization are
+<code>row_major</code> and <code>column_major</code>.</p>
+<p><a name="hermitian_matrix_3" id="hermitian_matrix_3">[3]</a>
+Supported parameters for the adapted array are
+<code>unbounded_array&lt;T&gt;</code> ,
+<code>bounded_array&lt;T&gt;</code> and
+<code>std::vector&lt;T&gt;</code> .</p>
+<h2><a name="hermitian_adaptor"></a>Hermitian Adaptor</h2>
+<h4>Description</h4>
+<p>The templated class <code>hermitian_adaptor&lt;M, F&gt;</code>
+is a hermitian matrix adaptor for other matrices.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/hermitian.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;std::complex&lt;double&gt; &gt; m (3, 3);
+    hermitian_adaptor&lt;matrix&lt;std::complex&lt;double&gt; &gt;, lower&gt; hal (m);
+    for (unsigned i = 0; i &lt; hal.size1 (); ++ i) {
+        for (unsigned j = 0; j &lt; i; ++ j)
+            hal (i, j) = std::complex&lt;double&gt; (3 * i + j, 3 * i + j);
+        hal (i, i) = std::complex&lt;double&gt; (4 * i, 0);
+    }
+    std::cout &lt;&lt; hal &lt;&lt; std::endl;
+    hermitian_adaptor&lt;matrix&lt;std::complex&lt;double&gt; &gt;, upper&gt; hau (m);
+    for (unsigned i = 0; i &lt; hau.size1 (); ++ i) {
+        hau (i, i) = std::complex&lt;double&gt; (4 * i, 0);
+        for (unsigned j = i + 1; j &lt; hau.size2 (); ++ j)
+            hau (i, j) = std::complex&lt;double&gt; (3 * i + j, 3 * i + j);
+    }
+    std::cout &lt;&lt; hau &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header hermitian.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>M</code></td>
+<td>The type of the adapted matrix.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>Functor describing the type of the hermitian adaptor. <a href=
+"#hermitian_adaptor_1">[1]</a></td>
+<td><code>lower</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;hermitian_adaptor&lt;M, F&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>hermitian_adaptor (matrix_type &amp;data)</code></td>
+<td>Constructs a <code>hermitian_adaptor</code> of a matrix.</td>
+</tr>
+<tr>
+<td><code>hermitian_adaptor (const hermitian_adaptor
+&amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_adaptor (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns a <code>const</code> reference of the <code>j</code>
+-th element in the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>hermitian_adaptor &amp;operator = (const
+hermitian_adaptor &amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>hermitian_adaptor &amp;assign_temporary
+(hermitian_adaptor &amp;m)</code></td>
+<td>Assigns a temporary. May change the hermitian adaptor
+<code>m</code>.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_adaptor &amp;operator = (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_adaptor &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the hermitian adaptor. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_adaptor &amp;operator += (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the hermitian adaptor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_adaptor &amp;plus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Adds a matrix expression to the hermitian adaptor. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_adaptor &amp;operator -= (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the hermitian adaptor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+hermitian_adaptor &amp;minus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Subtracts a matrix expression from the hermitian adaptor. Left
+and right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+hermitian_adaptor &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the hermitian
+adaptor with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+hermitian_adaptor &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the hermitian adaptor
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (hermitian_adaptor &amp;m)</code></td>
+<td>Swaps the contents of the hermitian adaptors.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>hermitian_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>hermitian_adaptor</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="hermitian_adaptor_1" id="hermitian_adaptor_1">[1]</a>
+Supported parameters for the type of the hermitian adaptor are
+<code>lower</code> and <code>upper</code>.</p>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/index.html b/doc/index.html
new file mode 100644
index 0000000..6a3a15d
--- /dev/null
+++ b/doc/index.html
@@ -0,0 +1,391 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Boost Basic Linear Algebra</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" alt="logo"/>Basic Linear Algebra Library</h1>
+<div class="toc" id="toc"></div>
+
+<p>uBLAS is a C++ template class library that provides <a href="http://www.netlib.org/blas">BLAS</a> level 1, 2, 3
+functionality for dense, packed and sparse matrices. The design and implementation unify mathematical notation via
+operator overloading and efficient code generation via expression templates.</p>
+
+<h2>Functionality</h2>
+
+<p>uBLAS provides templated C++ classes for dense, unit and sparse vectors, dense, identity, triangular, banded,
+symmetric, hermitian and sparse matrices. Views into vectors and matrices can be constructed via ranges, slices, 
+adaptor classes and indirect arrays. The library covers the usual basic linear algebra operations on vectors and matrices: reductions like
+different norms, addition and subtraction of vectors and matrices and multiplication with a scalar, inner and outer
+products of vectors, matrix vector and matrix matrix products and triangular solver. The glue between containers, views
+and expression templated operations is a mostly <a href="http://www.sgi.com/tech/stl">STL</a> conforming iterator interface.</p>
+
+<h2>Documentation</h2>
+
+<ul>
+<li><big><a href="overview.html">Overview</a></big>
+<ul>
+<li><a href="overview.html#rationale">Rationale</a>
+</li>
+
+<li><a href="overview.html#functionality">Functionality</a>
+</li>
+
+<li><a href="types_overview.html">Overview of Matrix- and Vector-Types</a>
+</li>
+
+<li><a href="operations_overview.html">Overview of Matrix and Vector Operations</a>
+</li>
+
+<li><a href="#further_information">Effective uBLAS and further information</a>
+</li>
+
+<li><a href="options.html">Macros and Preprocessor Options</a>
+</li>
+</ul>
+</li>
+
+<li><a href="vector.html">Vector</a>
+<ul>
+<li><a href="vector.html#vector">Vector</a>
+</li>
+
+<li><a href="vector.html#unit_vector">Unit Vector</a>
+</li>
+
+<li><a href="vector.html#zero_vector">Zero Vector</a>
+</li>
+
+<li><a href="vector.html#scalar_vector">Scalar Vector</a>
+</li>
+</ul>
+</li>
+
+<li><a href="vector_sparse.html">Sparse Vector</a>
+<ul>
+<li><a href="vector_sparse.html#mapped_vector">Mapped Vector</a>
+</li>
+
+<li><a href="vector_sparse.html#compressed_vector">Compressed Vector</a>
+</li>
+
+<li><a href="vector_sparse.html#coordinate_vector">Coordinate Vector</a>
+</li>
+</ul>
+</li>
+
+<li><a href="vector_proxy.html">Vector Proxies</a>
+<ul>
+<li><a href="vector_proxy.html#vector_range">Vector Range</a>
+</li>
+
+<li><a href="vector_proxy.html#vector_slice">Vector Slice</a>
+</li>
+</ul>
+</li>
+
+<li><a href="vector_expression.html">Vector Expressions</a>
+<ul>
+<li><a href="vector_expression.html#vector_expression">Vector Expression</a>
+</li>
+
+<li><a href="vector_expression.html#vector_references">Vector References</a>
+</li>
+
+<li><a href="vector_expression.html#vector_operations">Vector Operations</a>
+</li>
+
+<li><a href="vector_expression.html#vector_reductions">Vector Reductions</a>
+</li>
+</ul>
+</li>
+
+<li><a href="matrix.html">Matrix</a>
+<ul>
+<li><a href="matrix.html#matrix">Matrix</a>
+</li>
+
+<li><a href="matrix.html#identity_matrix">Identity Matrix</a>
+</li>
+
+<li><a href="matrix.html#zero_matrix">Zero Matrix</a>
+</li>
+
+<li><a href="matrix.html#scalar_matrix">Scalar Matrix</a>
+</li>
+</ul>
+</li>
+
+<li><a href="triangular.html">Triangular Matrix</a>
+<ul>
+<li><a href="triangular.html#triangular_matrix">Triangular Matrix</a>
+</li>
+
+<li><a href="triangular.html#triangular_adaptor">Triangular Adaptor</a>
+</li>
+</ul>
+</li>
+
+<li><a href="symmetric.html">Symmetric Matrix</a>
+<ul>
+<li><a href="symmetric.html#symmetric_matrix">Symmetric Matrix</a>
+</li>
+
+<li><a href="symmetric.html#symmetric_adaptor">Symmetric Adaptor</a>
+</li>
+</ul>
+</li>
+
+<li><a href="hermitian.html">Hermitian Matrix</a>
+<ul>
+<li><a href="hermitian.html#hermitian_matrix">Hermitian Matrix</a>
+</li>
+
+<li><a href="hermitian.html#hermitian_adaptor">Hermitian Adaptor</a>
+</li>
+</ul>
+</li>
+
+<li><a href="banded.html">Banded Matrix</a>
+<ul>
+<li><a href="banded.html#banded_matrix">Banded Matrix</a>
+</li>
+
+<li><a href="banded.html#banded_adaptor">Banded Adaptor</a>
+</li>
+</ul>
+</li>
+
+<li><a href="matrix_sparse.html">Sparse Matrix</a>
+<ul>
+<li><a href="matrix_sparse.html#mapped_matrix">Mapped Matrix</a>
+</li>
+
+<li><a href="matrix_sparse.html#compressed_matrix">Compressed Matrix</a>
+</li>
+
+<li><a href="matrix_sparse.html#coordinate_matrix">Coordinate Matrix</a>
+</li>
+</ul>
+</li>
+
+<li><a href="matrix_proxy.html">Matrix Proxies</a>
+<ul>
+<li><a href="matrix_proxy.html#matrix_row">Matrix Row</a>
+</li>
+
+<li><a href="matrix_proxy.html#matrix_column">Matrix Column</a>
+</li>
+
+<li><a href="matrix_proxy.html#vector_range">Vector Range</a>
+</li>
+
+<li><a href="matrix_proxy.html#vector_slice">Vector Slice</a>
+</li>
+
+<li><a href="matrix_proxy.html#matrix_range">Matrix Range</a>
+</li>
+
+<li><a href="matrix_proxy.html#matrix_slice">Matrix Slice</a>
+</li>
+</ul>
+</li>
+
+<li><a href="matrix_expression.html">Matrix Expressions</a>
+<ul>
+<li><a href="matrix_expression.html#matrix_expression">Matrix Expression</a>
+</li>
+
+<li><a href="matrix_expression.html#matrix_references">Matrix References</a>
+</li>
+
+<li><a href="matrix_expression.html#matrix_operations">Matrix Operations</a>
+</li>
+
+<li><a href="matrix_expression.html#matrix_vector_operations">Matrix Vector Operations</a>
+</li>
+
+<li><a href="matrix_expression.html#matrix_matrix_operations">Matrix Matrix Operations</a>
+</li>
+</ul>
+</li>
+
+<li>Storage and special containers
+
+<ul>
+<li><a href="unbounded_array.html">Unbounded Array</a>
+</li>
+
+<li><a href="bounded_array.html">Bounded Array</a>
+</li>
+
+<li><a href="range.html#range">Range</a>
+</li>
+
+<li><a href="range.html#slice">Slice</a>
+</li>
+</ul></li>
+
+<li><a href="storage_sparse.html">Sparse Storage</a>
+<ul>
+<li><a href="storage_sparse.html#map_std">Default Standard Map</a>
+</li>
+
+<li><a href="storage_sparse.html#map_array">Map Array</a>
+</li>
+</ul>
+</li>
+
+<li>Operations &amp; Functions
+
+<ul>
+<li><a href="products.html">Special Products</a>
+</li>
+
+<li><a href="blas.html">BLAS</a>
+</li>
+</ul></li>
+
+<li>uBLAS Concept definitions
+
+<ul>
+<li><a href="container_concept.html">Container Concepts</a>
+<ul>
+<li><a href="container_concept.html#vector">Vector</a>
+</li>
+
+<li><a href="container_concept.html#matrix">Matrix</a>
+</li>
+</ul>
+</li>
+
+<li><a href="expression_concept.html">Expression Concepts</a>
+<ul>
+<li><a href="expression_concept.html#scalar_expression">Scalar Expression</a>
+</li>
+
+<li><a href="expression_concept.html#vector_expression">Vector Expression</a>
+</li>
+
+<li><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+</li>
+</ul>
+</li>
+
+<li><a href="storage_concept.html">Storage Concept</a>
+</li>
+
+<li><a href="iterator_concept.html">Iterator Concepts</a>
+<ul>
+<li><a href="iterator_concept.html#indexed_bidirectional_iterator">Indexed Bidirectional Iterator</a>
+</li>
+
+<li><a href="iterator_concept.html#indexed_random_access_iterator">Indexed Random Access Iterator</a>
+</li>
+
+<li><a href="iterator_concept.html#indexed_bidirectional_cr_iterator">Indexed Bidirectional Column/Row Iterator</a>
+</li>
+
+<li><a href="iterator_concept.html#indexed_random_access_cr_iterator">Indexed Random Access Column/Row Iterator</a>
+</li>
+</ul>
+</li>
+</ul></li>
+</ul>
+
+<a name="further_information" id="further_information"></a>
+<h2>Known limitations:</h2>
+
+<ul type="disc">
+<li>The implementation assumes a linear memory address model.</li>
+
+<li>Tuning was focussed on dense matrices.</li>
+</ul>
+
+<h2>Further Information</h2>
+
+<h3>Project Location and Download</h3>
+
+<p>The latest stable release of uBLAS is part of the <a href="http://www.boost.org">Boost</a> libraries.</p>
+
+<h3>Documentation and Discussion</h3>
+
+<p>Visit the <a href="http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?Effective_UBLAS">Effective
+uBLAS</a> wiki for up to date information and contributions.</p>
+
+<p>There is also an active uBLAS <a href="http://lists.boost.org/">mailing list</a> where uBLAS specific user and
+development questions are answered.</p>
+
+<h3>uBLAS and Boost Project</h3>
+
+<p>There is also an active uBLAS <a href="http://lists.boost.org/">mailing list</a> where uBLAS specific from the
+latest uBLAS project code. You can <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/boost">view</a> the Boost
+CVS archive directly. You will find the library <a href=
+"http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/boost/boost/boost/numeric/ublas/">here</a>. Documentation and test
+programs reside <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/boost/boost/libs/numeric/ublas/">here</a>.</p>
+
+<h2>Authors and Credits</h2>
+
+<p>uBLAS initially was written by Joerg Walter and Mathias Koch. We would like to thank all, which supported and
+contributed to the development of this library: David Abrahams, Ed Brey, Fernando Cacciola, Juan Jose Gomez Cadenas,
+Beman Dawes, Matt Davies, Bob Fletcher, Kresimir Fresl, Joachim Kessel, Patrick Kowalzick, Toon Knapen, Hendrik Kueck,
+John Maddock, Jens Maurer, Alexei Novakov, Gary Powell, Joachim Pyras, Peter Schmitteckert, Jeremy Siek, Markus Steffl,
+Michael Stevens, Benedikt Weber, Martin Weiser, Gunter Winkler, Marc Zimmermann, Marco Guazzone, Nasos Iliopoulus, the members of <a href="http://www.boost.org">Boost</a> and all others contributors around the world. I promise I will try to add their names to this list.</p>
+<p>
+This library is currently maintained by <a="mailto:david.bellot@gmail.com">David Bellot</a>.
+<h2>Frequently Asked Questions</h2>
+
+<p>Q: Should I use uBLAS for new projects?<br/>
+A: At the time of writing (09/2012) there are a lot of good matrix libraries available, e.g., 
+<a href="http://www.simunova.com" target="_blank">MTL4</a>,
+<a href="http://arma.sourceforge.net" target="_blank">armadillo</a>,
+<a href="http://eigen.tuxfamily.org" target="_blank">eigen</a>. uBLAS offers a stable, well tested set of vector and 
+matrix classes, the typical operations for linear algebra and solvers for triangular systems of equations. uBLAS offers 
+dense, structured and sparse matrices - all using similar interfaces. And finally uBLAS offers good (but not outstanding) 
+performance. On the other side, the last major improvement of uBLAS was in 2008 and no significant change was committed 
+since 2009. So one should ask himself some questions to aid the decision: <i>Availability?</i> uBLAS is part of boost 
+and thus available in many environments. <i>Easy to use?</i> uBLAS is easy to use for simple things, but needs decent
+C++ knowledge when you leave the path. <i>Performance?</i> There are faster alternatives. <i>Cutting edge?</i> uBLAS 
+is more than 10 years old and missed all new stuff from C++11. </p>
+
+<p>Q: I'm running the uBLAS dense vector and matrix benchmarks. Why do I see a significant performance difference
+between the native C and library implementations?<br />
+A: uBLAS distinguishes debug mode (size and type conformance checks enabled, expression templates disabled) and release
+mode (size and type conformance checks disabled, expression templates enabled). Please check, if the preprocessor
+symbol <code>NDEBUG</code> of <code>cassert</code> is defined. <code>NDEBUG</code> enables release mode, which in turn
+uses expression templates. You can optionally define <code>BOOST_UBLAS_NDEBUG</code> to disable all bounds, structure
+and similar checks of uBLAS.</p>
+
+<p>Q: I've written some uBLAS tests, which try to incorrectly assign different matrix types or overrun vector and
+matrix dimensions. Why don't I get a compile time or runtime diagnostic?<br />
+A: uBLAS distinguishes debug mode (size and type conformance checks enabled, expression templates disabled) and release
+mode (size and type conformance checks disabled, expression templates enabled). Please check, if the preprocessor
+symbol <code>NDEBUG</code> of <code>cassert</code> is defined. <code>NDEBUG</code> disables debug mode, which is needed
+to get size and type conformance checks.</p>
+
+<p>Q: I've written some uBLAS benchmarks to measure the performance of matrix chain multiplications like <code>prod (A,
+prod (B, C))</code> and see a significant performance penalty due to the use of expression templates. How can I disable
+expression templates?<br />
+A: You do not need to disable expression templates. Please try reintroducing temporaries using either <code>prod
+(A,</code> <code><em>matrix_type</em></code> <code>(prod (B, C)))</code> or <code>prod (A,
+prod&lt;</code><code><em>matrix_type</em></code> <code>&gt; (B, C))</code>.</p>
+
+<hr />
+
+<p>Copyright (&copy;) 2000-2011 Joerg Walter, Mathias Koch, Gunter Winkler, David Bellot<br />
+Use, modification and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file
+LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>
+).</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/iterator_concept.html b/doc/iterator_concept.html
new file mode 100644
index 0000000..c9e4c99
--- /dev/null
+++ b/doc/iterator_concept.html
@@ -0,0 +1,1168 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Iterator Concepts</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Iterator Concepts</h1>
+<div class="toc" id="toc"></div>
+<p>An Iterator is a restricted pointer-like object pointing into a
+vector or matrix container.</p>
+<h2><a name="indexed_bidirectional_iterator" 
+></a>Indexed Bidirectional Iterator</h2>
+<h4>Description</h4>
+<p>An Indexed Bidirectional Iterator is an iterator of a container
+that can be dereferenced, incremented, decremented and carries
+index information.</p>
+<h4>Refinement of</h4>
+<p>Assignable, Equality Comparable, Default Constructible.</p>
+<h4>Associated types</h4>
+<table border="1" summary="associated types">
+<tbody>
+<tr>
+<td>Value type</td>
+<td>The type of the value obtained by dereferencing a Indexed
+Bidirectional Iterator</td>
+</tr>
+<tr>
+<td>Container type</td>
+<td>The type of the container a Indexed Bidirectional Iterator
+points into.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notation</h4>
+<table border="0" summary="notation">
+<tbody>
+<tr>
+<td><code>I</code></td>
+<td>A type that is a model of Indexed Bidirectional Iterator</td>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The value type of <code>I</code></td>
+</tr>
+<tr>
+<td><code>C</code></td>
+<td>The container type of <code>I</code></td>
+</tr>
+<tr>
+<td><code>it</code>, <code>itt, it1</code>, <code>it2</code></td>
+<td>Objects of type <code>I</code></td>
+</tr>
+<tr>
+<td><code>t</code></td>
+<td>Object of type <code>T</code></td>
+</tr>
+<tr>
+<td><code>c</code></td>
+<td>Object of type <code>C</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Definitions</h4>
+<p>A Indexed Bidirectional Iterator may be <i>mutable</i>, meaning
+that the values referred to by objects of that type may be
+modified, or <i>constant</i> , meaning that they may not. If an
+iterator type is mutable, this implies that its value type is a
+model of Assignable; the converse, though, is not necessarily
+true.</p>
+<p>A Indexed Bidirectional Iterator may have a <i>singular</i>
+value, meaning that the results of most operations, including
+comparison for equality, are undefined. The only operation that is
+guaranteed to be supported is assigning a nonsingular iterator to a
+singular iterator.</p>
+<p>A Indexed Bidirectional Iterator may have a
+<i>dereferenceable</i> value, meaning that dereferencing it yields
+a well-defined value. Dereferenceable iterators are always
+nonsingular, but the converse is not true.</p>
+<p>An Indexed Bidirectional Iterator is <i>past-the-end</i> if it
+points beyond the last element of a container. Past-the-end values
+are nonsingular and nondereferenceable.</p>
+<h4>Valid expressions</h4>
+<p>In addition to the expressions defined for Assignable, Equality
+Comparable and Default Constructible, the following expressions
+must be valid.</p>
+<table border="1" summary="expressions">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Type requirements</th>
+<th>Return type</th>
+</tr>
+<tr>
+<td>Default constructor</td>
+<td><code>I it</code></td>
+<td>&nbsp;</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Dereference</td>
+<td><code>*it</code></td>
+<td>&nbsp;</td>
+<td>Convertible to <code>T</code>.</td>
+</tr>
+<tr>
+<td>Dereference assignment</td>
+<td><code>*it = t</code></td>
+<td><code>I</code> is mutable.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Member access</td>
+<td><code>it-&gt;m</code></td>
+<td><code>T</code> is a type for which <code>t.m</code> is
+defined.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Preincrement</td>
+<td><code>++ it</code></td>
+<td>&nbsp;</td>
+<td><code>I &amp;</code></td>
+</tr>
+<tr>
+<td>Postincrement</td>
+<td><code>it ++</code></td>
+<td>&nbsp;</td>
+<td><code>I</code></td>
+</tr>
+<tr>
+<td>Predecrement</td>
+<td><code>-- it</code></td>
+<td>&nbsp;</td>
+<td><code>I &amp;</code></td>
+</tr>
+<tr>
+<td>Postdecrement</td>
+<td><code>it --</code></td>
+<td>&nbsp;</td>
+<td><code>I</code></td>
+</tr>
+<tr>
+<td>Index</td>
+<td><code>it.index ()</code></td>
+<td>&nbsp;</td>
+<td><code>C::size_type</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Expression Semantics</h4>
+<p>Semantics of an expression is defined only where it differs
+from, or is not defined in, Assignable, Equality Comparable and
+Default Constructible.</p>
+<table border="1" summary="semantics">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Precondition</th>
+<th>Semantics</th>
+<th>Postcondition</th>
+</tr>
+<tr>
+<td>Default constructor</td>
+<td><code>I it</code></td>
+<td>&nbsp;</td>
+<td>&nbsp;</td>
+<td><code>it</code> is singular.</td>
+</tr>
+<tr>
+<td>Dereference</td>
+<td><code>*it</code></td>
+<td><code>it</code> is dereferenceable.</td>
+<td>&nbsp;</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Dereference assignment</td>
+<td><code>*it = t</code></td>
+<td>Same as for <code>*it</code>.</td>
+<td>&nbsp;</td>
+<td><code>*it</code> is a copy of t.</td>
+</tr>
+<tr>
+<td>Member access</td>
+<td><code>it-&gt;m</code></td>
+<td><code>it</code> is dereferenceable.</td>
+<td>Equivalent to <code>(*it).m</code></td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Preincrement</td>
+<td><code>++ it</code></td>
+<td><code>it</code> is dereferenceable.</td>
+<td><code>it</code> is modified to point to the next element.</td>
+<td><code>it</code> is dereferenceable or past-the-end.
+<code><br />
+&amp;it == &amp;++ it</code>.<br />
+If <code>it1 == it2</code>,<br />
+then <code>++ it1 == ++ it2</code>.</td>
+</tr>
+<tr>
+<td>Postincrement</td>
+<td><code>it ++</code></td>
+<td>Same as for <code>++ it</code>.</td>
+<td>Equivalent to<br />
+<code>{<br />
+&nbsp;I itt = it;<br />
+&nbsp;++ it;<br />
+&nbsp;return itt;<br />
+}</code></td>
+<td><code>it</code> is dereferenceable or past-the-end.</td>
+</tr>
+<tr>
+<td>Predecrement</td>
+<td><code>-- it</code></td>
+<td><code>it</code> is dereferenceable or past-the-end.<br />
+There exists a dereferenceable iterator <code>itt</code> such that
+<code>it == ++ itt</code>.</td>
+<td><code>it</code> is modified to point to the previous
+element.</td>
+<td><code>it</code> is dereferenceable.<br />
+<code>&amp;it = &amp;-- it</code>.<br />
+If <code>it1 == it2</code>,<br />
+then <code>-- it1 == -- it2</code>.<br />
+If <code>it2</code> is dereferenceable and <code>it1 ==
+++it2</code>,<br />
+then <code>--it1 == it2</code>.</td>
+</tr>
+<tr>
+<td>Postdecrement</td>
+<td><code>it --</code></td>
+<td>Same as for -- <code>it</code>.</td>
+<td>Equivalent to<br />
+<code>{<br />
+&nbsp;I itt = it;<br />
+&nbsp;-- it;<br />
+&nbsp;return itt;<br />
+}</code></td>
+<td><code>it</code> is dereferenceable.&nbsp;</td>
+</tr>
+<tr>
+<td>Index</td>
+<td><code>it.index ()</code></td>
+<td><code>it</code> is dereferenceable.</td>
+<td><code>it.index () &gt;= 0</code><br />
+and<br />
+<code>it.index () &lt; it ().size ()</code></td>
+<td>If <code>it1 == it2</code>,<br />
+then <code>it1.index () == it2.index ()</code>.<br />
+If <code>it1 == it2</code>,<br />
+then <code>it1.index () &lt; (++ it2).index
+()</code>.<br />
+If <code>it1 == it2</code>,<br />
+then <code>it1.index () &gt; (-- it2).index
+()</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Complexity guarantees</h4>
+<p>The complexity of operations on indexed bidirectional iterators
+is guaranteed to be amortized constant time.</p>
+<h4>Invariants</h4>
+<table border="1" summary="invariants">
+<tbody>
+<tr>
+<td>Identity</td>
+<td><code>it1 == it2</code> if and only if <code>&amp;*it1 ==
+&amp;*it2</code>.</td>
+</tr>
+<tr>
+<td>Symmetry of increment and decrement</td>
+<td>If <code>it</code> is dereferenceable, then <code>++ it;
+--it;</code> is a null operation. Similarly, <code>-- it; ++
+it;</code> is a null operation.</td>
+</tr>
+<tr>
+<td>Relation between iterator index and container element
+operator</td>
+<td>If <code>it</code> is dereferenceable, <code>*it == it ()
+(it.index ())</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Models</h4>
+<ul>
+<li><code>sparse_vector::iterator</code></li>
+</ul>
+<h2><a name="indexed_random_access_iterator"
+></a>Indexed Random Access Iterator</h2>
+<h4>Description</h4>
+<p>An Indexed Random Access Iterator is an iterator of a container
+that can be dereferenced, moved forward, moved backward and carries
+index information.</p>
+<h4>Refinement of</h4>
+<p>LessThanComparable, <a href=
+"#indexed_bidirectional_iterator">Indexed Bidirectional
+Iterator</a> .</p>
+<h4>Associated types</h4>
+<table border="1" summary="associated types">
+<tbody>
+<tr>
+<td>Value type</td>
+<td>The type of the value obtained by dereferencing a Indexed
+Random Access Iterator</td>
+</tr>
+<tr>
+<td>Container type</td>
+<td>The type of the container a Indexed Random Access Iterator
+points into.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notation</h4>
+<table border="0" summary="notation">
+<tbody>
+<tr>
+<td><code>I</code></td>
+<td>A type that is a model of Indexed Random Access Iterator</td>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The value type of <code>I</code></td>
+</tr>
+<tr>
+<td><code>C</code></td>
+<td>The container type of <code>I</code></td>
+</tr>
+<tr>
+<td><code>it</code>, <code>itt, it1</code>, <code>it2</code></td>
+<td>Objects of type <code>I</code></td>
+</tr>
+<tr>
+<td><code>t</code></td>
+<td>Object of type <code>T</code></td>
+</tr>
+<tr>
+<td><code>n</code></td>
+<td>Object of type <code>C::difference_type</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Definitions</h4>
+<p>An Indexed Random Access Iterator <code>it1</code> is
+<i>reachable</i> from an Indexed Random Access Iterator
+<code>it2</code> if, after applying <code>operator ++</code> to
+<code>it2</code> a finite number of times, <code>it1 ==
+it2</code>.</p>
+<h4>Valid expressions</h4>
+<p>In addition to the expressions defined for <a href=
+"#indexed_bidirectional_iterator">Indexed Bidirectional
+Iterator</a> , the following expressions must be valid.</p>
+<table border="1" summary="expressions">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Type requirements</th>
+<th>Return type</th>
+</tr>
+<tr>
+<td>Forward motion</td>
+<td><code>it += n</code></td>
+<td>&nbsp;</td>
+<td><code>I &amp;</code></td>
+</tr>
+<tr>
+<td>Iterator addition</td>
+<td><code>it + n</code></td>
+<td>&nbsp;</td>
+<td><code>I</code></td>
+</tr>
+<tr>
+<td>Backward motion</td>
+<td><code>i -= n</code></td>
+<td>&nbsp;</td>
+<td><code>I &amp;</code></td>
+</tr>
+<tr>
+<td>Iterator subtraction</td>
+<td><code>it - n</code></td>
+<td>&nbsp;</td>
+<td><code>I</code>&nbsp;</td>
+</tr>
+<tr>
+<td>Difference</td>
+<td><code>it1 - it2</code></td>
+<td>&nbsp;</td>
+<td><code>C::difference_type</code></td>
+</tr>
+<tr>
+<td>Element operator</td>
+<td><code>it [n]</code></td>
+<td>&nbsp;</td>
+<td>Convertible to <code>T</code>.</td>
+</tr>
+<tr>
+<td>Element assignment</td>
+<td><code>it [n] = t</code></td>
+<td><code>I</code> is mutable</td>
+<td>Convertible to <code>T</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Expression Semantics</h4>
+<p>Semantics of an expression is defined only where it differs
+from, or is not defined in, <a href=
+"#indexed_bidirectional_iterator">Indexed Bidirectional
+Iterator</a> .</p>
+<table border="1" summary="semantics">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Precondition</th>
+<th>Semantics</th>
+<th>Postcondition</th>
+</tr>
+<tr>
+<td>Forward motion</td>
+<td><code>it += n</code></td>
+<td>Including <code>it</code> itself, there must be <code>n</code>
+dereferenceable or past-the-end iterators following or preceding
+<code>it</code>, depending on whether <code>n</code> is positive or
+negative.</td>
+<td>If <code>n &gt; 0</code>, equivalent to executing <code>++
+it</code> <code>n</code> times. If <code>n &lt; 0</code>,
+equivalent to executing <code>-- it</code> <code>n</code> times. If
+<code>n == 0</code>, this is a null operation.</td>
+<td><code>it</code> is dereferenceable or past-the-end.</td>
+</tr>
+<tr>
+<td>Iterator addition</td>
+<td><code>it + n</code></td>
+<td>Same as for <code>i += n</code>.</td>
+<td>Equivalent to<br />
+<code>{<br />
+&nbsp;I itt = it;<br />
+&nbsp;return itt += n;<br />
+}</code></td>
+<td>Result is dereferenceable or past-the-end.</td>
+</tr>
+<tr>
+<td>Backward motion</td>
+<td><code>it -= n</code></td>
+<td>Including <code>it</code> itself, there must be <code>n</code>
+dereferenceable or past-the-end iterators preceding or following
+<code>it</code>, depending on whether <code>n</code> is positive or
+negative.</td>
+<td>Equivalent to <code>it += (-n)</code>.</td>
+<td><code>it</code> is dereferenceable or past-the-end.</td>
+</tr>
+<tr>
+<td>Iterator subtraction</td>
+<td><code>it - n</code></td>
+<td>Same as for <code>i -= n</code>.</td>
+<td>Equivalent to<br />
+<code>{<br />
+&nbsp;I itt = it;<br />
+&nbsp;return itt -= n;<br />
+}</code></td>
+<td>Result is dereferenceable or past-the-end.</td>
+</tr>
+<tr>
+<td>Difference</td>
+<td><code>it1 - it2</code></td>
+<td>Either <code>it1</code> is reachable from <code>it2</code> or
+<code>it2</code> is reachable from <code>it1</code>, or both.</td>
+<td>Returns a number <code>n</code> such that <code>it1 == it2 +
+n</code></td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Element operator</td>
+<td><code>it [n]</code></td>
+<td><code>it + n</code> exists and is dereferenceable.</td>
+<td>Equivalent to <code>*(it + n)</code></td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Element assignment</td>
+<td><code>i[n] = t</code></td>
+<td>Same as for <code>it [n]</code>.</td>
+<td>Equivalent to <code>*(it + n) = t</code></td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Complexity guarantees</h4>
+<p>The complexity of operations on indexed random access iterators
+is guaranteed to be amortized constant time.</p>
+<h4>Invariants</h4>
+<table border="1" summary="invariants">
+<tbody>
+<tr>
+<td>Symmetry of addition and subtraction</td>
+<td>If <code>it + n</code> is well-defined, then <code>it += n; it
+-= n;</code> and <code>(it + n) - n</code> are null operations.
+Similarly, if <code>it - n</code> is well-defined, then <code>it -=
+n; it += n;</code> and <code>(it - n) + n</code> are null
+operations.</td>
+</tr>
+<tr>
+<td>Relation between distance and addition</td>
+<td>If <code>it1 - it2</code> is well-defined, then <code>it1 ==
+it2 + (it1 - it2)</code>.</td>
+</tr>
+<tr>
+<td>Reachability and distance</td>
+<td>If <code>it1</code> is reachable from <code>it2</code>, then
+<code>it1 - it2 &gt;= 0</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Models</h4>
+<ul>
+<li><code>vector::iterator</code></li>
+</ul>
+<h2><a name="indexed_bidirectional_cr_iterator"
+></a>Indexed Bidirectional Column/Row Iterator</h2>
+<h4>Description</h4>
+<p>An Indexed Bidirectional Column/Row Iterator is an iterator of a
+container that can be dereferenced, incremented, decremented and
+carries index information.</p>
+<h4>Refinement of</h4>
+<p>Assignable, Equality Comparable, Default Constructible.</p>
+<h4>Associated types</h4>
+<table border="1" summary="associated types">
+<tbody>
+<tr>
+<td>Value type</td>
+<td>The type of the value obtained by dereferencing a Indexed
+Bidirectional Column/Row Iterator</td>
+</tr>
+<tr>
+<td>Container type</td>
+<td>The type of the container a Indexed Bidirectional Column/Row
+Iterator points into.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notation</h4>
+<table border="0" summary="notation">
+<tbody>
+<tr>
+<td><code>I1</code></td>
+<td>A type that is a model of Indexed Bidirectional Column/Row
+Iterator</td>
+</tr>
+<tr>
+<td><code>I2</code></td>
+<td>A type that is a model of Indexed Bidirectional Row/Column
+Iterator</td>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The value type of <code>I1</code> and <code>I2</code></td>
+</tr>
+<tr>
+<td><code>C</code></td>
+<td>The container type of <code>I1</code> and <code>I2</code></td>
+</tr>
+<tr>
+<td><code>it1</code>, <code>it1t, it11</code>,
+<code>it12</code></td>
+<td>Objects of type <code>I1</code></td>
+</tr>
+<tr>
+<td><code>it2</code>, <code>it2t</code></td>
+<td>Objects of type <code>I2</code></td>
+</tr>
+<tr>
+<td><code>t</code></td>
+<td>Object of type <code>T</code></td>
+</tr>
+<tr>
+<td><code>c</code></td>
+<td>Object of type <code>C</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Definitions</h4>
+<h4>Valid expressions</h4>
+<p>In addition to the expressions defined for Assignable, Equality
+Comparable and Default Constructible, the following expressions
+must be valid.</p>
+<table border="1" summary="expressions">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Type requirements</th>
+<th>Return type</th>
+</tr>
+<tr>
+<td>Default constructor</td>
+<td><code>I1 it</code></td>
+<td>&nbsp;</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Dereference</td>
+<td><code>*it</code></td>
+<td>&nbsp;</td>
+<td>Convertible to <code>T</code>.</td>
+</tr>
+<tr>
+<td>Dereference assignment</td>
+<td><code>*it = t</code></td>
+<td><code>I1</code> is mutable.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Member access</td>
+<td><code>it-&gt;m</code></td>
+<td><code>T</code> is a type for which <code>t.m</code> is
+defined.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Preincrement</td>
+<td><code>++ it</code></td>
+<td>&nbsp;</td>
+<td><code>I1 &amp;</code></td>
+</tr>
+<tr>
+<td>Postincrement</td>
+<td><code>it ++</code></td>
+<td>&nbsp;</td>
+<td><code>I1</code></td>
+</tr>
+<tr>
+<td>Predecrement</td>
+<td><code>-- it</code></td>
+<td>&nbsp;</td>
+<td><code>I1 &amp;</code></td>
+</tr>
+<tr>
+<td>Postdecrement</td>
+<td><code>it --</code></td>
+<td>&nbsp;</td>
+<td><code>I1</code></td>
+</tr>
+<tr>
+<td>Row Index</td>
+<td><code>it.index1 ()</code></td>
+<td>&nbsp;</td>
+<td><code>C::size_type</code></td>
+</tr>
+<tr>
+<td>Column Index</td>
+<td><code>it.index2 ()</code></td>
+<td>&nbsp;</td>
+<td><code>C::size_type</code></td>
+</tr>
+<tr>
+<td>Row/Column Begin</td>
+<td><code>it.begin ()</code></td>
+<td>&nbsp;</td>
+<td><code>I2</code></td>
+</tr>
+<tr>
+<td>Row/Column End</td>
+<td><code>it.end ()</code></td>
+<td>&nbsp;</td>
+<td><code>I2</code></td>
+</tr>
+<tr>
+<td>Reverse Row/Column Begin</td>
+<td><code>it.rbegin ()</code></td>
+<td>&nbsp;</td>
+<td><code>reverse_iterator&lt;I2&gt;</code></td>
+</tr>
+<tr>
+<td>Reverse Row/Column End</td>
+<td><code>it.rend ()</code></td>
+<td>&nbsp;</td>
+<td><code>reverse_iterator&lt;I2&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Expression Semantics</h4>
+<p>Semantics of an expression is defined only where it differs
+from, or is not defined in, Assignable, Equality Comparable and
+Default Constructible.</p>
+<table border="1" summary="semantics">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Precondition</th>
+<th>Semantics</th>
+<th>Postcondition</th>
+</tr>
+<tr>
+<td>Default constructor</td>
+<td><code>I1 it</code></td>
+<td>&nbsp;</td>
+<td>&nbsp;</td>
+<td><code>it</code> is singular.</td>
+</tr>
+<tr>
+<td>Dereference</td>
+<td><code>*it</code></td>
+<td><code>it</code> is dereferenceable.</td>
+<td>&nbsp;</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Dereference assignment</td>
+<td><code>*it = t</code></td>
+<td>Same as for <code>*it</code>.</td>
+<td>&nbsp;</td>
+<td><code>*it</code> is a copy of t.</td>
+</tr>
+<tr>
+<td>Member access</td>
+<td><code>it-&gt;m</code></td>
+<td><code>it</code> is dereferenceable.</td>
+<td>Equivalent to <code>(*it).m</code></td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Preincrement</td>
+<td><code>++ it</code></td>
+<td><code>it</code> is dereferenceable.</td>
+<td><code>it</code> is modified to point to the next element of
+the column/row, i.e. for column iterators holds<br />
+<code>it.index1 () &lt; (++ it).index1 ()</code> and<br />
+<code>it.index2 () == (++ it).index2 ()</code>,<br />
+for row iterators holds<br />
+<code>it.index1 () == (++ it).index1 ()</code> and<br />
+<code>it.index2 () &lt; (++ it).index2 ()</code>.<br /></td>
+<td><code>it</code> is dereferenceable or past-the-end.
+<code><br />
+&amp;it == &amp;++ it</code>.<br />
+If <code>it1 == it2</code>,<br />
+then <code>++ it1 == ++ it2</code>.</td>
+</tr>
+<tr>
+<td>Postincrement</td>
+<td><code>it ++</code></td>
+<td>Same as for <code>++ it</code>.</td>
+<td>Equivalent to<br />
+<code>{<br />
+&nbsp;I1 itt = it;<br />
+&nbsp;++ it;<br />
+&nbsp;return itt;<br />
+}</code></td>
+<td><code>it</code> is dereferenceable or past-the-end.</td>
+</tr>
+<tr>
+<td>Predecrement</td>
+<td><code>-- it</code></td>
+<td><code>it</code> is dereferenceable or past-the-end.<br />
+There exists a dereferenceable iterator <code>itt</code> such that
+<code>it == ++ itt</code>.</td>
+<td><code>it</code> is modified to point to the previous&nbsp;
+element of the column/row, i.e. for column iterators holds<br />
+<code>it.index1 () &gt; (-- it).index1 ()</code> and<br />
+<code>it.index2 () == (-- it).index2 ()</code>,<br />
+for row iterators holds<br />
+<code>it.index1 () == (-- it).index1 ()</code> and<br />
+<code>it.index2 () &gt; (-- it).index2 ()</code>.</td>
+<td><code>it</code> is dereferenceable.<br />
+<code>&amp;it = &amp;-- it</code>.<br />
+If <code>it1 == it2</code>,<br />
+then <code>-- it1 == -- it2</code>.</td>
+</tr>
+<tr>
+<td>Postdecrement</td>
+<td><code>it --</code></td>
+<td>Same as for -- <code>it</code>.</td>
+<td>Equivalent to<br />
+<code>{<br />
+&nbsp;I1 itt = it;<br />
+&nbsp;-- it;<br />
+&nbsp;return itt;<br />
+}</code></td>
+<td><code>it</code> is dereferenceable.&nbsp;</td>
+</tr>
+<tr>
+<td>Row Index</td>
+<td><code>it.index1 ()</code></td>
+<td>If <code>it</code> is a Row iterator then <code>it</code> must be dereferenceable.</td>
+<td><code>it.index1 () &gt;= 0</code> and<br />
+<code>it.index1 () &lt; it () .size1 ()</code></td>
+<td>If <code>it1 == it2</code>,<br />
+then <code>it1.index1 () == 12.index1 ()</code>.<br />
+If <code>it1</code>, <code>it2</code> are Row Iterators with <code>it1 == it2</code>,<br />
+then <code>it1.index1 () &lt; (++ it2</code>).<code>index1 ()</code>.<br />
+and <code>it1.index1 () &gt; (-- it2</code>).<code>index1 ()</code>.</td>
+</tr>
+<tr>
+<td>Column Index</td>
+<td><code>it.index2 ()</code></td>
+<td>If <code>it</code> is a Column iterator then <code>it</code> must be dereferenceable.</td>
+<td><code>it.index2 () &gt;= 0</code> and<br />
+<code>it.index2 () &lt; it () .size2 ()</code></td>
+<td>If <code>it1 == it2</code>,<br />
+then <code>it1.index2 () == it2</code>.<code>index2 ()</code>
+.<br />
+If <code>it1</code>, <code>it2</code> are Column Iterators with <code>it1 == i12</code>,<br />
+then <code>it1.index2 () &lt; (++ it2</code>).<code>index2 ()</code>.<br />
+end <code>it1.index2 () &gt; (-- it2</code>).<code>index2 ()</code>.</td>
+</tr>
+<tr>
+<td>Row/Column Begin</td>
+<td><code>it.begin ()</code></td>
+<td><code>it</code> is dereferenceable.</td>
+<td>If <code>it</code> is a Column Iterator,<br />
+then <code>it2 = it.begin ()</code> is a Row Iterator<br />
+with <code>it2.index1 () == it.index1 ()</code>.
+<p>If <code>it</code> is a Row Iterator,<br />
+then <code>it2 = it.begin ()</code> is a Column Iterator<br />
+with <code>it2.index2 () == it.index2 ()</code>.</p>
+</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Row/Column End</td>
+<td><code>it.end ()</code></td>
+<td><code>it</code> is dereferenceable.</td>
+<td>If <code>it</code> is a Column Iterator,<br />
+then <code>it2 = it.end ()</code> is a Row Iterator<br />
+with <code>it2.index1 () == it.index1 ()</code>.
+<p>If <code>it</code> is a Row Iterator,<br />
+then <code>it2 = it.end ()</code> is a Column Iterator<br />
+with <code>it2.index2 () == it.index2 ()</code>.</p>
+</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Reverse Row/Column Begin</td>
+<td><code>it.rbegin ()</code></td>
+<td><code>it</code> is dereferenceable.</td>
+<td>Equivalent to <code>reverse_iterator&lt;I2&gt; (it.end
+())</code>.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Reverse Row/Column End</td>
+<td><code>it.rend ()</code></td>
+<td><code>it</code> is dereferenceable.</td>
+<td>Equivalent to <code>reverse_iterator&lt;I2&gt; (it.begin
+())</code>.</td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Complexity guarantees</h4>
+<p>The complexity of operations on indexed bidirectional column/row
+iterators is guaranteed to be logarithmic depending on the size of
+the container. The complexity of one iterator (depending on the
+storage layout) can be lifted to be amortized constant time. The
+complexity of the other iterator (depending on the storage layout
+and the container) can be lifted to be amortized constant time for
+the first row/first column respectively.</p>
+<h4>Invariants</h4>
+<table border="1" summary="invariants">
+<tbody>
+<tr>
+<td>Identity</td>
+<td><code>it1 == it2</code> if and only if <code>&amp;*it1 ==
+&amp;*it2</code>.</td>
+</tr>
+<tr>
+<td>Symmetry of increment and decrement</td>
+<td>If <code>it</code> is dereferenceable, then <code>++ it;
+--it;</code> is a null operation. Similarly, <code>-- it; ++
+it;</code> is a null operation.</td>
+</tr>
+<tr>
+<td>Relation between iterator index and container element
+operator</td>
+<td>If <code>it</code> is dereferenceable, <code>*it == it ()
+(it.index1 (), it.index2 ())</code></td>
+</tr>
+<tr>
+<td>Relation between iterator column/row begin and iterator
+index</td>
+<td>If <code>it</code> is a Column Iterator
+and <code>it2 = it.begin ()</code> then <code>it2.index2 () &lt;
+it2t.index2 ()</code> for all <code>it2t</code> with <code>it2t ()
+== it2 ()</code> and <code>it2t ().index1 () == it2 ().index1
+()</code>.
+<p>If <code>it</code> is a Row Iterator and
+<code>it2 = it.begin ()</code> then <code>it2.index1 () &lt;
+it2t.index1 ()</code> for all <code>it2t</code> with <code>it2t ()
+== it2 ()</code> and <code>it2t ().index2 () == it2 ().index2
+()</code>.</p>
+</td>
+</tr>
+<tr>
+<td>Relation between iterator column/row end and iterator
+index</td>
+<td>If <code>it</code> is a Column Iterator
+and <code>it2 = it.end ()</code> then <code>it2.index2 () &gt;
+it2t.index2 ()</code> for all <code>it2t</code> with <code>it2t ()
+== it2 ()</code> and <code>it2t ().index1 () == it2 ().index1
+()</code>.
+<p>If <code>it</code> is a Row Iterator and
+<code>it2 = it.end ()</code> then <code>it2.index1 () &gt;
+it2t.index1 ()</code> for all <code>it2t</code> with <code>it2t ()
+== it2 ()</code> and <code>it2t ().index2 () == it2 ().index2
+()</code>.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h4>Models</h4>
+<ul>
+<li><code>sparse_matrix::iterator1</code></li>
+<li><code>sparse_matrix::iterator2</code></li>
+</ul>
+<h2><a name="indexed_random_access_cr_iterator"
+></a>Indexed Random Access Column/Row Iterator</h2>
+<h4>Description</h4>
+<p>An Indexed Random Access Column/Row Iterator is an iterator of a
+container that can be dereferenced, incremented, decremented and
+carries index information.</p>
+<h4>Refinement of</h4>
+<p><a href="#indexed_bidirectional_cr_iterator">Indexed
+Bidirectional Column/Row Iterator</a> .</p>
+<h4>Associated types</h4>
+<table border="1" summary="associated types">
+<tbody>
+<tr>
+<td>Value type</td>
+<td>The type of the value obtained by dereferencing a Indexed
+Random Access Column/Row Iterator</td>
+</tr>
+<tr>
+<td>Container type</td>
+<td>The type of the container a Indexed Random Access Column/Row
+Iterator points into.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notation</h4>
+<table border="0" summary="notation">
+<tbody>
+<tr>
+<td><code>I</code></td>
+<td>A type that is a model of Indexed Random Access Column/Row
+Iterator</td>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The value type of <code>I</code></td>
+</tr>
+<tr>
+<td><code>C</code></td>
+<td>The container type of <code>I</code></td>
+</tr>
+<tr>
+<td><code>it</code>, <code>itt, it1</code>, <code>it2</code></td>
+<td>Objects of type <code>I</code></td>
+</tr>
+<tr>
+<td><code>t</code></td>
+<td>Object of type <code>T</code></td>
+</tr>
+<tr>
+<td><code>c</code></td>
+<td>Object of type <code>C</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Definitions</h4>
+<h4>Valid expressions</h4>
+<p>In addition to the expressions defined for <a href=
+"#indexed_bidirectional_cr_iterator">Indexed Bidirectional
+Column/Row Iterator</a> , the following expressions must be
+valid.</p>
+<table border="1" summary="expressions">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Type requirements</th>
+<th>Return type</th>
+</tr>
+<tr>
+<td>Forward motion</td>
+<td><code>it += n</code></td>
+<td>&nbsp;</td>
+<td><code>I &amp;</code></td>
+</tr>
+<tr>
+<td>Iterator addition</td>
+<td><code>it + n</code></td>
+<td>&nbsp;</td>
+<td><code>I</code></td>
+</tr>
+<tr>
+<td>Backward motion</td>
+<td><code>i -= n</code></td>
+<td>&nbsp;</td>
+<td><code>I &amp;</code></td>
+</tr>
+<tr>
+<td>Iterator subtraction</td>
+<td><code>it - n</code></td>
+<td>&nbsp;</td>
+<td><code>I</code>&nbsp;</td>
+</tr>
+<tr>
+<td>Difference</td>
+<td><code>it1 - it2</code></td>
+<td>&nbsp;</td>
+<td><code>C::difference_type</code></td>
+</tr>
+<tr>
+<td>Element operator</td>
+<td><code>it [n]</code></td>
+<td>&nbsp;</td>
+<td>Convertible to <code>T</code>.</td>
+</tr>
+<tr>
+<td>Element assignment</td>
+<td><code>it [n] = t</code></td>
+<td><code>I</code> is mutable</td>
+<td>Convertible to <code>T</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Expression Semantics</h4>
+<p>Semantics of an expression is defined only where it differs
+from, or is not defined in, <a href=
+"#indexed_bidirectional_cr_iterator">Indexed Bidirectional
+Column/Row Iterator</a> .</p>
+<table border="1" summary="semantics">
+<tbody>
+<tr>
+<th>Name</th>
+<th>Expression</th>
+<th>Precondition</th>
+<th>Semantics</th>
+<th>Postcondition</th>
+</tr>
+<tr>
+<td>Forward motion</td>
+<td><code>it += n</code></td>
+<td>Including <code>it</code> itself, there must be <code>n</code>
+dereferenceable or past-the-end iterators following or preceding
+<code>it</code>, depending on whether <code>n</code> is positive or
+negative.</td>
+<td>If <code>n &gt; 0</code>, equivalent to executing <code>++
+it</code> <code>n</code> times. If <code>n &lt; 0</code>,
+equivalent to executing <code>-- it</code> <code>n</code> times. If
+<code>n == 0</code>, this is a null operation.</td>
+<td><code>it</code> is dereferenceable or past-the-end.</td>
+</tr>
+<tr>
+<td>Iterator addition</td>
+<td><code>it + n</code></td>
+<td>Same as for <code>i += n</code>.</td>
+<td>Equivalent to<br />
+<code>{<br />
+&nbsp;I itt = it;<br />
+&nbsp;return itt += n;<br />
+}</code></td>
+<td>Result is dereferenceable or past-the-end.</td>
+</tr>
+<tr>
+<td>Backward motion</td>
+<td><code>it -= n</code></td>
+<td>Including <code>it</code> itself, there must be <code>n</code>
+dereferenceable or past-the-end iterators preceding or following
+<code>it</code>, depending on whether <code>n</code> is positive or
+negative.</td>
+<td>Equivalent to <code>it += (-n)</code>.</td>
+<td><code>it</code> is dereferenceable or past-the-end.</td>
+</tr>
+<tr>
+<td>Iterator subtraction</td>
+<td><code>it - n</code></td>
+<td>Same as for <code>i -= n</code>.</td>
+<td>Equivalent to<br />
+<code>{<br />
+&nbsp;I itt = it;<br />
+&nbsp;return itt -= n;<br />
+}</code></td>
+<td>Result is dereferenceable or past-the-end.</td>
+</tr>
+<tr>
+<td>Difference</td>
+<td><code>it1 - it2</code></td>
+<td>Either <code>it1</code> is reachable from <code>it2</code> or
+<code>it2</code> is reachable from <code>it1</code>, or both.</td>
+<td>Returns a number <code>n</code> such that <code>it1 == it2 +
+n</code></td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Element operator</td>
+<td><code>it [n]</code></td>
+<td><code>it + n</code> exists and is dereferenceable.</td>
+<td>Equivalent to <code>*(it + n)</code></td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td>Element assignment</td>
+<td><code>i[n] = t</code></td>
+<td>Same as for <code>it [n]</code>.</td>
+<td>Equivalent to <code>*(it + n) = t</code></td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Complexity guarantees</h4>
+<p>The complexity of operations on indexed random access Column/Row
+iterators is guaranteed to be amortized constant time.</p>
+<h4>Invariants</h4>
+<table border="1" summary="invariants">
+<tbody>
+<tr>
+<td>Symmetry of addition and subtraction</td>
+<td>If <code>it + n</code> is well-defined, then <code>it += n; it
+-= n;</code> and <code>(it + n) - n</code> are null operations.
+Similarly, if <code>it - n</code> is well-defined, then <code>it -=
+n; it += n;</code> and <code>(it - n) + n</code> are null
+operations.</td>
+</tr>
+<tr>
+<td>Relation between distance and addition</td>
+<td>If <code>it1 - it2</code> is well-defined, then <code>it1 ==
+it2 + (it1 - it2)</code>.</td>
+</tr>
+<tr>
+<td>Reachability and distance</td>
+<td>If <code>it1</code> is reachable from <code>it2</code>, then
+<code>it1 - it2 &gt;= 0</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Models</h4>
+<ul>
+<li><code>matrix::iterator1</code></li>
+<li><code>matrix::iterator2</code></li>
+</ul>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/js/jquery-1.3.2.min.js b/doc/js/jquery-1.3.2.min.js
new file mode 100644
index 0000000..b1ae21d
--- /dev/null
+++ b/doc/js/jquery-1.3.2.min.js
@@ -0,0 +1,19 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
\ No newline at end of file
diff --git a/doc/js/jquery.toc-gw.js b/doc/js/jquery.toc-gw.js
new file mode 100644
index 0000000..d48dd4b
--- /dev/null
+++ b/doc/js/jquery.toc-gw.js
@@ -0,0 +1,166 @@
+/*!
+ * jQuery TOC Plugin v1.1.x based on 
+ * samaxesJS JavaScript Library
+ * http://code.google.com/p/samaxesjs/
+ *
+ * Copyright (c) 2008 samaxes.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * 2009-10-04, guwi17: modified and extended to meet uBLAS' needs
+ */
+
+(function($) {
+    /*
+     * The TOC plugin dynamically builds a table of contents from the headings in
+     * a document and prepends legal-style section numbers to each of the headings.
+     */
+    $.fn.toc = function(options) {
+        var opts = $.extend({}, $.fn.toc.defaults, options);
+
+        return this.each(function() {
+            var toc = $(this).append('<ul></ul>').children('ul');
+            var headers = {h1: 0, h2: 0, h3: 0, h4: 0, h5: 0, h6: 0};
+            var index = 0;
+            var indexes = {
+                    h1: (opts.exclude.match('h1') == null && $('h1').length > 0) ? ++index : 0,
+                    h2: (opts.exclude.match('h2') == null && $('h2').length > 0) ? ++index : 0,
+                    h3: (opts.exclude.match('h3') == null && $('h3').length > 0) ? ++index : 0,
+                    h4: (opts.exclude.match('h4') == null && $('h4').length > 0) ? ++index : 0,
+                    h5: (opts.exclude.match('h5') == null && $('h5').length > 0) ? ++index : 0,
+                    h6: (opts.exclude.match('h6') == null && $('h6').length > 0) ? ++index : 0
+            };
+
+            $(':header').not(opts.exclude).each(function() {
+                var linkId = "";
+                if ($(this).is('h6')) {
+                    checkContainer(headers.h6, toc);
+                    updateNumeration(headers, 'h6');
+                    $(this).text(addNumeration(headers, 'h6', $(this).text()));
+                    linkId = fixAnchor($(this));
+                    appendToTOC(toc, indexes.h6, linkId, $(this).text(), headers);
+                } else if ($(this).is('h5')) {
+                    checkContainer(headers.h5, toc);
+                    updateNumeration(headers, 'h5');
+                    $(this).text(addNumeration(headers, 'h5', $(this).text()));
+                    linkId = fixAnchor($(this));
+                    appendToTOC(toc, indexes.h5, linkId, $(this).text(), headers);
+                } else if ($(this).is('h4')) {
+                    checkContainer(headers.h4, toc);
+                    updateNumeration(headers, 'h4');
+                    $(this).text(addNumeration(headers, 'h4', $(this).text()));
+                    linkId = fixAnchor($(this));
+                    appendToTOC(toc, indexes.h4, linkId, $(this).text(), headers);
+                } else if ($(this).is('h3')) {
+                    checkContainer(headers.h3, toc);
+                    updateNumeration(headers, 'h3');
+                    $(this).text(addNumeration(headers, 'h3', $(this).text()));
+                    linkId = fixAnchor($(this));
+                    appendToTOC(toc, indexes.h3, linkId, $(this).text(), headers);
+                } else if ($(this).is('h2')) {
+                    checkContainer(headers.h2, toc);
+                    updateNumeration(headers, 'h2');
+                    $(this).text(addNumeration(headers, 'h2', $(this).text()));
+                    linkId = fixAnchor($(this));
+                    appendToTOC(toc, indexes.h2, linkId, $(this).text(), headers);
+                } else if ($(this).is('h1')) {
+                    updateNumeration(headers, 'h1');
+                    $(this).text(addNumeration(headers, 'h1', $(this).text()));
+                    linkId = fixAnchor($(this));
+                    appendToTOC(toc, indexes.h1, linkId, $(this).text(), headers);
+                }
+            });
+        });
+    };
+
+    /*
+     * Checks if the last node is an 'ul' element.
+     * If not, a new one is created.
+     */
+    function checkContainer(header, toc) {
+        if (header == 0 && !toc.find(':last').is('ul')) {
+            toc.find('li:last').append('<ul></ul>');
+        }
+    };
+
+    /*
+     * Updates headers numeration.
+     */
+    function updateNumeration(headers, header) {
+        $.each(headers, function(i, val) {
+            if (i == header)  {
+                ++headers[i];
+            } else if (i > header) {
+                headers[i] = 0;
+            }
+        });
+    };
+
+    /*
+     * Prepends the numeration to a heading.
+     */
+    function addNumeration(headers, header, text) {
+        var numeration = '';
+
+        $.each(headers, function(i, val) {
+            if (i <= header && headers[i] > 0)  {
+                numeration += headers[i] + '.';
+            }
+        });
+
+        return removeFinalDot(numeration) + ' ' + text;
+    };
+
+    function removeFinalDot(text) {
+        return (text||"").replace(/\.$/g, "" )
+    }
+
+    function fixAnchor(element) {
+        // use existing id by default
+        var linkId = element.attr('id');
+        // next, look for an anchor and use its id or name
+        if ( !linkId ) {
+            element.find('> a:first').each( function() {
+                linkId = $(this).attr('id') || $(this).attr('name');
+            });
+        }
+        // next, use the text content as last resort
+        if ( !linkId ) {
+            linkId = (element.text()||"unknown").replace(/[^a-zA-Z0-9]/g,"");
+        }
+
+        element.attr('id',linkId);
+        return linkId;
+    }
+    
+    /*
+     * Appends a new node to the TOC.
+     */
+    function appendToTOC(toc, index, id, text, headers) {
+        var parent = toc;
+
+        for (var i = 1; i < index; i++) {
+            if (parent.find('> li:last > ul').length == 0) {
+                parent = parent.append('<li><ul></ul></li>');
+            }
+            parent = parent.find('> li:last > ul');
+        }
+        if (id) {
+            parent.append('<li><a href="#' + id + '">' + text + '</a></li>');
+        } else {
+            parent.append('<li>' + text + '</li>');
+        }
+    };
+
+    $.fn.toc.defaults = {exclude: 'h1, h5, h6'}
+})(jQuery);
diff --git a/doc/matrix.html b/doc/matrix.html
new file mode 100644
index 0000000..0342d04
--- /dev/null
+++ b/doc/matrix.html
@@ -0,0 +1,768 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Matrix</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Matrix</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="matrix"></a>Matrix</h2>
+<h4>Description</h4>
+<p>The templated class <code>matrix&lt;T, F, A&gt;</code> is the
+base container adaptor for dense matrices. For a <em>(m x
+n</em>)-dimensional matrix and <em>0 &lt;= i &lt; m</em>, <em>0
+&lt;= j &lt; n</em> every element <em>m</em><sub><em>i,
+j</em></sub> is mapped to the <em>(i x n + j)-</em>th element of
+the container for row major orientation or the <em>(i + j x
+m)-</em>th element of the container for column major
+orientation.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    for (unsigned i = 0; i &lt; m.size1 (); ++ i)
+        for (unsigned j = 0; j &lt; m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+    std::cout &lt;&lt; m &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the matrix.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>Functor describing the storage organization. <a href=
+"#matrix_1">[1]</a></td>
+<td><code>row_major</code></td>
+</tr>
+<tr>
+<td><code>A</code></td>
+<td>The type of the <a href="storage_concept.html">Storage</a> array. <a href="#matrix_2">[2]</a></td>
+<td><code>unbounded_array&lt;T&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"container_concept.html#matrix">Matrix</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_container&lt;matrix&lt;T, F, A&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix ()</code></td>
+<td>Allocates an uninitialized <code>matrix</code> that holds zero
+rows of zero elements.</td>
+</tr>
+<tr>
+<td><code>matrix (size_type size1, size_type size2)</code></td>
+<td>Allocates an uninitialized <code>matrix</code> that holds
+<code>size1</code> rows of <code>size2</code> elements.</td>
+</tr>
+<tr>
+<td><code>matrix (const matrix &amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix (const matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size1, size_type size2, bool
+preserve = true)</code></td>
+<td>Reallocates a <code>matrix</code> to hold <code>size1</code>
+rows of <code>size2</code> elements. The existing elements of the
+<code>matrix</code> are preseved when specified.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const array_type&amp; data () const</code></td>
+<td></td>
+</tr>
+<tr>
+<td><code>array_type&amp; data ()</code></td>
+<td></td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns a <code>const</code> reference of the <code>j</code>
+-th element in the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>matrix &amp;operator = (const matrix &amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>matrix &amp;assign_temporary (matrix &amp;m)</code></td>
+<td>Assigns a temporary. May change the matrix <code>m</code>.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix &amp;operator = (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the matrix. Left and right hand
+side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix &amp;operator += (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix &amp;plus_assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Adds a matrix expression to the matrix. Left and right hand
+side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix &amp;operator -= (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix &amp;minus_assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Subtracts a matrix expression from the matrix. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the matrix with a
+scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the matrix through a
+scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (matrix &amp;m)</code></td>
+<td>Swaps the contents of the matrices.</td>
+</tr>
+<tr>
+<td><code>void insert_element (size_type i, size_type j, const_reference
+t)</code></td>
+<td>Inserts the value <code>t</code> at the <code>j</code>-th
+element of the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void erase_element (size_type i, size_type j)</code></td>
+<td>Erases the value at the <code>j</code>-th element of the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td>Clears the matrix.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>matrix</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="matrix_1">[1]</a> Supported parameters
+for the storage organization are <code>row_major</code> and
+<code>column_major</code>.</p>
+<p><a name="matrix_2">[2]</a> Common parameters
+for the storage array are <code>unbounded_array&lt;T&gt;</code> ,
+<code>bounded_array&lt;T&gt;</code> and
+<code>std::vector&lt;T&gt;</code> .</p>
+<h2><a name="identity_matrix"></a>Identity Matrix</h2>
+<h4>Description</h4>
+<p>The templated class <code>identity_matrix&lt;T, ALLOC&gt;</code>
+represents identity matrices. For a <em>(m x n</em>)-dimensional
+identity matrix and <em>0 &lt;= i &lt; m</em>, <em>0 &lt;= j &lt;
+n</em> holds <em>id</em><sub><em>i, j</em></sub> <em>= 0</em>, if
+<em>i &lt;&gt; j</em>, and <em>id</em><sub><em>i, i</em></sub><em>=
+1</em>.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    identity_matrix&lt;double&gt; m (3);
+    std::cout &lt;&lt; m &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the matrix.</td>
+<td><code>int</code></td>
+</tr>
+<tr>
+<td><code>ALLOC</code></td>
+<td>An STL Allocator for size_type and difference_type.</td>
+<td>std::allocator</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of
+<a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_container&lt;identity_matrix&lt;T&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>identity_matrix ()</code></td>
+<td>Constructs an <code>identity_matrix</code> that holds zero rows
+of zero elements.</td>
+</tr>
+<tr>
+<td><code>identity_matrix (size_type size)</code></td>
+<td>Constructs an <code>identity_matrix</code> that holds
+<code>size</code> rows of <code>size</code> elements.</td>
+</tr>
+<tr>
+<td><code>identity_matrix (const identity_matrix
+&amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size, bool preserve =
+true)</code></td>
+<td>Resizes a <code>identity_matrix</code> to hold
+<code>size</code> rows of <code>size</code> elements. Therefore the
+existing elements of the <code>itendity_matrix</code> are always
+preseved.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>identity_matrix &amp;operator = (const identity_matrix
+&amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>identity_matrix &amp;assign_temporary (identity_matrix
+&amp;m)</code></td>
+<td>Assigns a temporary. May change the identity matrix
+<code>m</code> .</td>
+</tr>
+<tr>
+<td><code>void swap (identity_matrix &amp;m)</code></td>
+<td>Swaps the contents of the identity matrices.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>identity_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>identity_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>identity_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>identity_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>identity_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>identity_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>identity_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>identity_matrix</code>.</td>
+</tr>
+</tbody>
+</table>
+<h2><a name="zero_matrix"></a>Zero Matrix</h2>
+<h4>Description</h4>
+<p>The templated class <code>zero_matrix&lt;T, ALLOC&gt;</code> represents
+zero matrices. For a <em>(m x n</em>)-dimensional zero matrix and
+<em>0 &lt;= i &lt; m</em>, <em>0 &lt;= j &lt; n</em> holds
+<em>z</em><sub><em>i, j</em></sub> <em>= 0</em>.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    zero_matrix&lt;double&gt; m (3, 3);
+    std::cout &lt;&lt; m &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the matrix.</td>
+<td><code>int</code></td>
+</tr>
+<tr>
+<td><code>ALLOC</code></td>
+<td>An STL Allocator for size_type and difference_type.</td>
+<td>std::allocator</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of
+<a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_container&lt;zero_matrix&lt;T&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>zero_matrix ()</code></td>
+<td>Constructs a <code>zero_matrix</code> that holds zero rows of
+zero elements.</td>
+</tr>
+<tr>
+<td><code>zero_matrix (size_type size1, size_type
+size2)</code></td>
+<td>Constructs a <code>zero_matrix</code> that holds
+<code>size1</code> rows of <code>size2</code> elements.</td>
+</tr>
+<tr>
+<td><code>zero_matrix (const zero_matrix &amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size1, size_type size2, bool
+preserve = true)</code></td>
+<td>Resizes a <code>zero_matrix</code> to hold <code>size1</code>
+rows of <code>size2</code> elements. Therefore the existing
+elements of the <code>zero_matrix</code> are always preseved.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>zero_matrix &amp;operator = (const zero_matrix
+&amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>zero_matrix &amp;assign_temporary (zero_matrix
+&amp;m)</code></td>
+<td>Assigns a temporary. May change the zero matrix <code>m</code>
+.</td>
+</tr>
+<tr>
+<td><code>void swap (zero_matrix &amp;m)</code></td>
+<td>Swaps the contents of the zero matrices.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>zero_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>zero_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>zero_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>zero_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>zero_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>zero_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>zero_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>zero_matrix</code>.</td>
+</tr>
+</tbody>
+</table>
+<h2><a name="scalar_matrix"></a>Scalar Matrix</h2>
+<h4>Description</h4>
+<p>The templated class <code>scalar_matrix&lt;T, ALLOC&gt;</code>
+represents scalar matrices. For a <em>(m x n</em>)-dimensional
+scalar matrix and <em>0 &lt;= i &lt; m</em>, <em>0 &lt;= j &lt;
+n</em> holds <em>z</em><sub><em>i, j</em></sub> <em>= s</em>.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    scalar_matrix&lt;double&gt; m (3, 3);
+    std::cout &lt;&lt; m &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the matrix.</td>
+<td><code>int</code></td>
+</tr>
+<tr>
+<td><code>ALLOC</code></td>
+<td>An STL Allocator for size_type and difference_type.</td>
+<td>std::allocator</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of
+<a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_container&lt;scalar_matrix&lt;T&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>scalar_matrix ()</code></td>
+<td>Constructs a <code>scalar_matrix</code> that holds scalar rows
+of zero elements.</td>
+</tr>
+<tr>
+<td><code>scalar_matrix (size_type size1, size_type size2, const
+value_type &amp;value)</code></td>
+<td>Constructs a <code>scalar_matrix</code> that holds
+<code>size1</code> rows of <code>size2</code> elements each of the
+specified value.</td>
+</tr>
+<tr>
+<td><code>scalar_matrix (const scalar_matrix &amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size1, size_type size2, bool
+preserve = true)</code></td>
+<td>Resizes a <code>scalar_matrix</code> to hold <code>size1</code>
+rows of <code>size2</code> elements. Therefore the existing
+elements of the <code>scalar_matrix</code> are always
+preseved.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>scalar_matrix &amp;operator = (const scalar_matrix
+&amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>scalar_matrix &amp;assign_temporary (scalar_matrix
+&amp;m)</code></td>
+<td>Assigns a temporary. May change the scalar matrix
+<code>m</code> .</td>
+</tr>
+<tr>
+<td><code>void swap (scalar_matrix &amp;m)</code></td>
+<td>Swaps the contents of the scalar matrices.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>scalar_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>scalar_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>scalar_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>scalar_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>scalar_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>scalar_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>scalar_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>scalar_matrix</code>.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/matrix_expression.html b/doc/matrix_expression.html
new file mode 100644
index 0000000..a979814
--- /dev/null
+++ b/doc/matrix_expression.html
@@ -0,0 +1,1428 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Matrix Expressions</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Matrix Expressions</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="matrix_expression"></a>Matrix Expression</h2>
+<h4>Description</h4>
+<p>The templated class <code>matrix_expression&lt;E&gt;</code>
+is required to be a public base of all classes which model the Matrix Expression concept.</p>
+<h4>Definition</h4>
+<p>Defined in the header expression_types.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E</code></td>
+<td>The type of the matrix expression.</td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p>None. <u>Not a Matrix Expression</u>!
+</p>
+<h4>Type requirements</h4>
+<p>None.</p>
+<h4>Public base classes</h4>
+<p>None.</p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>const expression_type &amp;operator () ()
+const</code></td>
+<td>Returns a <code>const</code> reference of the expression.</td>
+</tr>
+<tr>
+<td><code>expression_type &amp;operator () ()</code></td>
+<td>Returns a reference of the expression.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p>The <code>operator[]</code>, <code>row</code>, <code>column</code>, <code>range</code>, <code>slice</code> and <code>project</code> functions have been removed. Use the free functions defined in <a href="matrix_proxy.html">matrix proxy</a> instead.</p>
+<h2><a name="matrix_container"></a>Matrix Container</h2>
+<h4>Description</h4>
+<p>The templated class <code>matrix_container&lt;C&gt;</code>
+is required to be a public base of all classes which model the Matrix concept.
+This includes the class <code>matrix</code> itself.</p>
+<h4>Definition</h4>
+<p>Defined in the header expression_types.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E</code></td>
+<td>The type of the matrix expression.</td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p>None. <u>Not a Matrix Expression OR Matrix</u>!
+</p>
+<h4>Type requirements</h4>
+<p>None.</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;C&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>const container_type &amp;operator () ()
+const</code></td>
+<td>Returns a <code>const</code> reference of the container.</td>
+</tr>
+<tr>
+<td><code>container_type &amp;operator () ()</code></td>
+<td>Returns a reference of the container.</td>
+</tr>
+</tbody>
+</table>
+<h2><a name="matrix_references"></a>Matrix References</h2>
+<h3>Reference</h3>
+<h4>Description</h4>
+<p>The templated class <code>matrix_reference&lt;E&gt;</code>
+contains a reference to a matrix expression.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E</code></td>
+<td>The type of the matrix expression.</td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;matrix_reference&lt;E&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix_reference (expression_type &amp;e)</code></td>
+<td>Constructs a constant reference of the expression.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size1, size2)</code></td>
+<td>Resizes the expression to hold at most <code>size1</code> rows
+of <code>size2</code> elements.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the expression.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the expression.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed expression.</td>
+</tr>
+</tbody>
+</table>
+<h2><a name="matrix_operations"></a>Matrix Operations</h2>
+<h3>Unary Operation Description</h3>
+<h4>Description</h4>
+<p>The templated classes <code>matrix_unary1&lt;E, F&gt;</code> and
+<code>matrix_unary2&lt;E, F&gt;</code> describe unary matrix
+operations.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E</code></td>
+<td>The type of the matrix expression.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>The type of the operation.</td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;matrix_unary1&lt;E, F&gt; &gt;</code>
+and <code>matrix_expression&lt;matrix_unary2&lt;E, F&gt;
+&gt;</code> resp.</p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix_unary1 (const expression_type &amp;e)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>matrix_unary2 (const expression_type &amp;e)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+</tbody>
+</table>
+<h3>Unary Operations</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class E, class F&gt;
+    struct matrix_unary1_traits {
+        typedef matrix_unary1&lt;typename E::const_closure_type, F&gt; expression_type;
+        typedef expression_type result_type;
+     };
+
+    // (- m) [i] [j] = - m [i] [j]
+    template&lt;class E&gt;
+     typename matrix_unary1_traits&lt;E, scalar_negate&lt;typename E::value_type&gt; &gt;::result_type
+    operator - (const matrix_expression&lt;E&gt; &amp;e);
+
+    // (conj m) [i] [j] = conj (m [i] [j])
+    template&lt;class E&gt;
+     typename matrix_unary1_traits&lt;E, scalar_conj&lt;typename E::value_type&gt; &gt;::result_type
+    conj (const matrix_expression&lt;E&gt; &amp;e);
+
+    // (real m) [i] [j] = real (m [i] [j])
+    template&lt;class E&gt;
+     typename matrix_unary1_traits&lt;E, scalar_real&lt;typename E::value_type&gt; &gt;::result_type
+    real (const matrix_expression&lt;E&gt; &amp;e);
+
+    // (imag m) [i] [j] = imag (m [i] [j])
+    template&lt;class E&gt;
+     typename matrix_unary1_traits&lt;E, scalar_imag&lt;typename E::value_type&gt; &gt;::result_type
+    imag (const matrix_expression&lt;E&gt; &amp;e);
+
+    template&lt;class E, class F&gt;
+    struct matrix_unary2_traits {
+        typedef matrix_unary2&lt;typename E::const_closure_type, F&gt; expression_type;
+        typedef expression_type result_type;
+     };
+
+    // (trans m) [i] [j] = m [j] [i]
+    template&lt;class E&gt;
+     typename matrix_unary2_traits&lt;E, scalar_identity&lt;typename E::value_type&gt; &gt;::result_type
+    trans (const matrix_expression&lt;E&gt; &amp;e);
+
+    // (herm m) [i] [j] = conj (m [j] [i])
+    template&lt;class E&gt;
+     typename matrix_unary2_traits&lt;E, scalar_conj&lt;typename E::value_type&gt; &gt;::result_type
+    herm (const matrix_expression&lt;E&gt; &amp;e);</code>
+</pre>
+<h4>Description</h4>
+<p><code>operator -</code> computes the additive inverse of a
+matrix expression. <code>conj</code> computes the complex conjugate
+of a matrix expression. <code>real</code> and <code>imag</code>
+compute the real and imaginary parts of a matrix expression.
+<code>trans</code> computes the transpose of a matrix expression.
+<code>herm</code> computes the hermitian, i.e. the complex
+conjugate of the transpose of a matrix expression.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>E</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</li>
+</ul>
+<h4>Preconditions</h4>
+<p>None.</p>
+<h4>Complexity</h4>
+<p>Quadratic depending from the size of the matrix expression.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;std::complex&lt;double&gt; &gt; m (3, 3);
+    for (unsigned i = 0; i &lt; m.size1 (); ++ i)
+        for (unsigned j = 0; j &lt; m.size2 (); ++ j)
+            m (i, j) = std::complex&lt;double&gt; (3 * i + j, 3 * i + j);
+
+    std::cout &lt;&lt; - m &lt;&lt; std::endl;
+    std::cout &lt;&lt; conj (m) &lt;&lt; std::endl;
+    std::cout &lt;&lt; real (m) &lt;&lt; std::endl;
+    std::cout &lt;&lt; imag (m) &lt;&lt; std::endl;
+    std::cout &lt;&lt; trans (m) &lt;&lt; std::endl;
+    std::cout &lt;&lt; herm (m) &lt;&lt; std::endl;
+}
+</pre>
+<h3>Binary Operation Description</h3>
+<h4>Description</h4>
+<p>The templated class <code>matrix_binary&lt;E1, E2, F&gt;</code>
+describes a binary matrix operation.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E1</code></td>
+<td>The type of the first matrix expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>E2</code></td>
+<td>The type of the second matrix expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>The type of the operation.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;matrix_binary&lt;E1, E2, F&gt;
+&gt;</code>.</p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix_binary (const expression1_type &amp;e1, const
+expression2_type &amp;e2)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+</tbody>
+</table>
+<h3>Binary Operations</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class E1, class E2, class F&gt;
+    struct matrix_binary_traits {
+        typedef matrix_binary&lt;typename E1::const_closure_type,
+                               typename E2::const_closure_type, F&gt; expression_type;
+        typedef expression_type result_type;
+     };
+
+    // (m1 + m2) [i] [j] = m1 [i] [j] + m2 [i] [j]
+    template&lt;class E1, class E2&gt;
+    typename matrix_binary_traits&lt;E1, E2, scalar_plus&lt;typename E1::value_type,
+                                                       typename E2::value_type&gt; &gt;::result_type
+    operator + (const matrix_expression&lt;E1&gt; &amp;e1,
+                 const matrix_expression&lt;E2&gt; &amp;e2);
+
+    // (m1 - m2) [i] [j] = m1 [i] [j] - m2 [i] [j]
+    template&lt;class E1, class E2&gt;
+    typename matrix_binary_traits&lt;E1, E2, scalar_minus&lt;typename E1::value_type,
+                                                        typename E2::value_type&gt; &gt;::result_type
+    operator - (const matrix_expression&lt;E1&gt; &amp;e1,
+                 const matrix_expression&lt;E2&gt; &amp;e2);</code>
+</pre>
+<h4>Description</h4>
+<p><code>operator +</code> computes the sum of two matrix
+expressions. <code>operator -</code> computes the difference of two
+matrix expressions.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>E1</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</li>
+<li><code>E2</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</li>
+</ul>
+<h4>Preconditions</h4>
+<ul>
+<li><code>e1 ().size1 () == e2 ().size1 ()</code></li>
+<li><code>e1 ().size2 () == e2 ().size2 ()</code></li>
+</ul>
+<h4>Complexity</h4>
+<p>Quadratic depending from the size of the matrix expressions.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m1 (3, 3), m2 (3, 3);
+    for (unsigned i = 0; i &lt; std::min (m1.size1 (), m2.size1 ()); ++ i)
+        for (unsigned j = 0; j &lt; std::min (m1.size2 (), m2.size2 ()); ++ j)
+            m1 (i, j) = m2 (i, j) = 3 * i + j;
+
+    std::cout &lt;&lt; m1 + m2 &lt;&lt; std::endl;
+    std::cout &lt;&lt; m1 - m2 &lt;&lt; std::endl;
+}
+</pre>
+<h3>Scalar Matrix Operation Description</h3>
+<h4>Description</h4>
+<p>The templated classes <code>matrix_binary_scalar1&lt;E1, E2,
+F&gt;</code> and <code>matrix_binary_scalar2&lt;E1, E2,
+F&gt;</code> describe binary operations between a scalar and a
+matrix.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E1/E2</code></td>
+<td>The type of the scalar expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>E2/E1</code></td>
+<td>The type of the matrix expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>The type of the operation.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;matrix_binary_scalar1&lt;E1, E2,
+F&gt; &gt;</code> and
+<code>matrix_expression&lt;matrix_binary_scalar2&lt;E1, E2, F&gt;
+&gt;</code> resp.</p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix_binary_scalar1 (const expression1_type &amp;e1,
+const expression2_type &amp;e2)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>matrix_binary_scalar1 (const expression1_type &amp;e1,
+const expression2_type &amp;e2)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+</tbody>
+</table>
+<h3>Scalar Matrix Operations</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class T1, class E2, class F&gt;
+    struct matrix_binary_scalar1_traits {
+        typedef matrix_binary_scalar1&lt;scalar_const_reference&lt;T1&gt;,
+                                      typename E2::const_closure_type, F&gt; expression_type;
+        typedef expression_type result_type;
+     };
+
+    // (t * m) [i] [j] = t * m [i] [j]
+    template&lt;class T1, class E2&gt;
+    typename matrix_binary_scalar1_traits&lt;T1, E2, scalar_multiplies&lt;T1, typename E2::value_type&gt; &gt;::result_type
+    operator * (const T1 &amp;e1,
+                 const matrix_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class E1, class T2, class F&gt;
+    struct matrix_binary_scalar2_traits {
+        typedef matrix_binary_scalar2&lt;typename E1::const_closure_type,
+                                      scalar_const_reference&lt;T2&gt;, F&gt; expression_type;
+        typedef expression_type result_type;
+     };
+
+    // (m * t) [i] [j] = m [i] [j] * t
+    template&lt;class E1, class T2&gt;
+    typename matrix_binary_scalar2_traits&lt;E1, T2, scalar_multiplies&lt;typename E1::value_type, T2&gt; &gt;::result_type
+    operator * (const matrix_expression&lt;E1&gt; &amp;e1,
+                 const T2 &amp;e2);
+
+    // (m / t) [i] [j] = m [i] [j] / t
+    template&lt;class E1, class T2&gt;
+    typename matrix_binary_scalar2_traits&lt;E1, T2, scalar_divides&lt;typename E1::value_type, T2&gt; &gt;::result_type
+    operator / (const matrix_expression&lt;E1&gt; &amp;e1,
+                 const T2 &amp;e2);</code>
+</pre>
+<h4>Description</h4>
+<p><code>operator *</code> computes the product of a scalar and a
+matrix expression. <code>operator /</code> multiplies the matrix
+with the reciprocal of the scalar.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>T1/T2</code> is a model of <a href=
+"expression_concept.html#scalar_expression">Scalar Expression</a> .</li>
+<li><code>E2/E1</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</li>
+</ul>
+<h4>Preconditions</h4>
+<p>None.</p>
+<h4>Complexity</h4>
+<p>Quadratic depending from the size of the matrix expression.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    for (unsigned i = 0; i &lt; m.size1 (); ++ i)
+        for (unsigned j = 0; j &lt; m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+
+    std::cout &lt;&lt; 2.0 * m &lt;&lt; std::endl;
+    std::cout &lt;&lt; m * 2.0 &lt;&lt; std::endl;
+}
+</pre>
+<h2><a name="matrix_vector_operations"></a>Matrix Vector Operations</h2>
+<h3>Binary Operation Description</h3>
+<h4>Description</h4>
+<p>The templated classes <code>matrix_vector_binary1&lt;E1, E2,
+F&gt;</code> and <code>matrix_vector_binary2&lt;E1, E2,
+F&gt;</code> describe binary matrix vector operations.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E1</code></td>
+<td>The type of the matrix or vector expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>E2</code></td>
+<td>The type of the vector or matrix expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>The type of the operation.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_expression&lt;matrix_vector_binary1&lt;E1, E2,
+F&gt; &gt;</code> and
+<code>vector_expression&lt;matrix_vector_binary2&lt;E1, E2, F&gt;
+&gt;</code> resp.</p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix_vector_binary1 (const expression1_type &amp;e1,
+const expression2_type &amp;e2)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>matrix_vector_binary2 (const expression1_type &amp;e1,
+const expression2_type &amp;e2)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the expression.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+</tbody>
+</table>
+<h3>Binary Operations</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class T1, class E1, class T2, class E2&gt;
+    struct matrix_vector_binary1_traits {
+        typedef row_major_tag dispatch_category;
+        typedef typename promote_traits&lt;T1, T2&gt;::promote_type promote_type;
+        typedef matrix_vector_binary1&lt;typename E1::const_closure_type,
+                                       typename E2::const_closure_type,
+                                       matrix_vector_prod1&lt;T1, T2, promote_type&gt; &gt; expression_type;
+        typedef expression_type result_type;
+     };
+
+    template&lt;class E1, class E2&gt;
+    typename matrix_vector_binary1_traits&lt;typename E1::value_type, E1,
+                                           typename E2::value_type, E2&gt;::result_type
+    prod (const matrix_expression&lt;E1&gt; &amp;e1,
+           const vector_expression&lt;E2&gt; &amp;e2,
+          row_major_tag);
+
+    // Dispatcher
+    template&lt;class E1, class E2&gt;
+    typename matrix_vector_binary1_traits&lt;typename E1::value_type, E1,
+                                           typename E2::value_type, E2&gt;::result_type
+    prod (const matrix_expression&lt;E1&gt; &amp;e1,
+           const vector_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class E1, class E2&gt;
+    typename matrix_vector_binary1_traits&lt;typename type_traits&lt;typename E1::value_type&gt;::precision_type, E1,
+                                           typename type_traits&lt;typename E2::value_type&gt;::precision_type, E2&gt;::result_type
+    prec_prod (const matrix_expression&lt;E1&gt; &amp;e1,
+                const vector_expression&lt;E2&gt; &amp;e2,
+               row_major_tag);
+
+    // Dispatcher
+    template&lt;class E1, class E2&gt;
+    typename matrix_vector_binary1_traits&lt;typename type_traits&lt;typename E1::value_type&gt;::precision_type, E1,
+                                           typename type_traits&lt;typename E2::value_type&gt;::precision_type, E2&gt;::result_type
+    prec_prod (const matrix_expression&lt;E1&gt; &amp;e1,
+                const vector_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class V, class E1, class E2&gt;
+    V
+    prod (const matrix_expression&lt;E1&gt; &amp;e1,
+          const vector_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class V, class E1, class E2&gt;
+    V
+    prec_prod (const matrix_expression&lt;E1&gt; &amp;e1,
+               const vector_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class T1, class E1, class T2, class E2&gt;
+    struct matrix_vector_binary2_traits {
+        typedef column_major_tag dispatch_category;
+        typedef typename promote_traits&lt;T1, T2&gt;::promote_type promote_type;
+        typedef matrix_vector_binary2&lt;typename E1::const_closure_type,
+                                       typename E2::const_closure_type,
+                                       matrix_vector_prod2&lt;T1, T2, promote_type&gt; &gt; expression_type;
+        typedef expression_type result_type;
+     };
+
+    template&lt;class E1, class E2&gt;
+    typename matrix_vector_binary2_traits&lt;typename E1::value_type, E1,
+                                           typename E2::value_type, E2&gt;::result_type
+    prod (const vector_expression&lt;E1&gt; &amp;e1,
+           const matrix_expression&lt;E2&gt; &amp;e2,
+          column_major_tag);
+
+    // Dispatcher
+    template&lt;class E1, class E2&gt;
+    typename matrix_vector_binary2_traits&lt;typename E1::value_type, E1,
+                                           typename E2::value_type, E2&gt;::result_type
+    prod (const vector_expression&lt;E1&gt; &amp;e1,
+           const matrix_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class E1, class E2&gt;
+    typename matrix_vector_binary2_traits&lt;typename type_traits&lt;typename E1::value_type&gt;::precision_type, E1,
+                                           typename type_traits&lt;typename E2::value_type&gt;::precision_type, E2&gt;::result_type
+    prec_prod (const vector_expression&lt;E1&gt; &amp;e1,
+                const matrix_expression&lt;E2&gt; &amp;e2,
+               column_major_tag);
+
+    // Dispatcher
+    template&lt;class E1, class E2&gt;
+    typename matrix_vector_binary2_traits&lt;typename type_traits&lt;typename E1::value_type&gt;::precision_type, E1,
+                                           typename type_traits&lt;typename E2::value_type&gt;::precision_type, E2&gt;::result_type
+    prec_prod (const vector_expression&lt;E1&gt; &amp;e1,
+                const matrix_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class V, class E1, class E2&gt;
+    V
+    prod (const vector_expression&lt;E1&gt; &amp;e1,
+          const matrix_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class V, class E1, class E2&gt;
+    V
+    prec_prod (const vector_expression&lt;E1&gt; &amp;e1,
+               const matrix_expression&lt;E2&gt; &amp;e2);</code>
+</pre>
+<h4>Description</h4>
+<p><code>prod</code> computes the product of the matrix and the
+vector expression. <code>prec_prod</code> computes the double
+precision product of the matrix and the vector expression.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>E1</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> or
+<a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</li>
+<li><code>E2</code> is a model of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> or
+<a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</li>
+</ul>
+<h4>Preconditions</h4>
+<ul>
+<li><code>e1 ().size2 () == e2 ().size ()</code></li>
+<li><code>e1 ().size () == e2 ().size1 ()</code></li>
+</ul>
+<h4>Complexity</h4>
+<p>Quadratic depending from the size of the matrix expression.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    vector&lt;double&gt; v (3);
+    for (unsigned i = 0; i &lt; std::min (m.size1 (), v.size ()); ++ i) {
+        for (unsigned j = 0; j &lt; m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+        v (i) = i;
+    }
+
+    std::cout &lt;&lt; prod (m, v) &lt;&lt; std::endl;
+    std::cout &lt;&lt; prod (v, m) &lt;&lt; std::endl;
+}
+</pre>
+<h3>Triangular Solver</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class E1, class E2&gt;
+    struct matrix_vector_solve_traits {
+        typedef typename promote_traits&lt;typename E1::value_type, typename E2::value_type&gt;::promote_type promote_type;
+        typedef vector&lt;promote_type&gt; result_type;
+    };
+
+    template&lt;class E1, class E2&gt;
+    void inplace_solve (const matrix_expression&lt;E1&gt; &amp;e1,
+                         E2 &amp;e2,
+                        lower_tag,
+                        vector_tag);
+    template&lt;class E1, class E2&gt;
+    void inplace_solve (const matrix_expression&lt;E1&gt; &amp;e1,
+                         E2 &amp;e2,
+                        upper_tag,
+                        vector_tag);
+    template&lt;class E1, class E2&gt;
+    void inplace_solve (const matrix_expression&lt;E1&gt; &amp;e1,
+                         E2 &amp;e2,
+                        unit_lower_tag,
+                        vector_tag);
+    template&lt;class E1, class E2&gt;
+    void inplace_solve (const matrix_expression&lt;E1&gt; &amp;e1,
+                         E2 &amp;e2,
+                        unit_upper_tag,
+                        vector_tag);
+
+    template&lt;class E1, class E2, class C&gt;
+    typename matrix_vector_solve_traits&lt;E1, E2&gt;::result_type
+    solve (const matrix_expression&lt;E1&gt; &amp;e1,
+            const vector_expression&lt;E2&gt; &amp;e2,
+           C);
+
+    template&lt;class E1, class E2&gt;
+    void inplace_solve (E1 &amp;e1,
+                        const matrix_expression&lt;E2&gt; &amp;e2,
+                         vector_tag,
+                         lower_tag);
+    template&lt;class E1, class E2&gt;
+    void inplace_solve (E1 &amp;e1,
+                        const matrix_expression&lt;E2&gt; &amp;e2,
+                         vector_tag,
+                         upper_tag);
+    template&lt;class E1, class E2&gt;
+    void inplace_solve (E1 &amp;e1,
+                        const matrix_expression&lt;E2&gt; &amp;e2,
+                         vector_tag,
+                         unit_lower_tag);
+    template&lt;class E1, class E2&gt;
+    void inplace_solve (E1 &amp;e1,
+                        const matrix_expression&lt;E2&gt; &amp;e2,
+                         vector_tag,
+                         unit_upper_tag);
+
+    template&lt;class E1, class E2, class C&gt;
+    typename matrix_vector_solve_traits&lt;E1, E2&gt;::result_type
+    solve (const vector_expression&lt;E1&gt; &amp;e1,
+            const matrix_expression&lt;E2&gt; &amp;e2,
+           C);</code>
+</pre>
+<h4>Description</h4>
+<p><code>solve</code> solves a linear equation for lower or upper
+(unit) triangular matrices.</p>
+<h4>Definition</h4>
+<p>Defined in the header triangular.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>E1</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> or
+<a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</li>
+<li><code>E2</code> is a model of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> or
+<a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</li>
+</ul>
+<h4>Preconditions</h4>
+<ul>
+<li><code>e1 ().size1 () == e1 ().size2 ()</code></li>
+<li><code>e1 ().size2 () == e2 ().size ()</code></li>
+<li><code>e1 ().size () == e2 ().size1 ()</code></li>
+<li><code>e2 ().size1 () == e2 ().size2 ()</code></li>
+</ul>
+<h4>Complexity</h4>
+<p>Quadratic depending from the size of the matrix expression.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/triangular.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    vector&lt;double&gt; v (3);
+    for (unsigned i = 0; i &lt; std::min (m.size1 (), v.size ()); ++ i) {
+        for (unsigned j = 0; j &lt;= i; ++ j)
+            m (i, j) = 3 * i + j + 1;
+        v (i) = i;
+    }
+
+    std::cout &lt;&lt; solve (m, v, lower_tag ()) &lt;&lt; std::endl;
+    std::cout &lt;&lt; solve (v, m, lower_tag ()) &lt;&lt; std::endl;
+}
+</pre>
+<h2><a name="matrix_matrix_operations"></a>Matrix Matrix Operations</h2>
+<h3>Binary Operation Description</h3>
+<h4>Description</h4>
+<p>The templated class <code>matrix_matrix_binary&lt;E1, E2,
+F&gt;</code> describes a binary matrix operation.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E1</code></td>
+<td>The type of the first matrix expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>E2</code></td>
+<td>The type of the second matrix expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>The type of the operation.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;matrix_matrix_binary&lt;E1, E2, F&gt;
+&gt;</code> .</p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix_matrix_binary (const expression1_type &amp;e1,
+const expression2_type &amp;e2)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+</tbody>
+</table>
+<h3>Binary Operations</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class T1, class E1, class T2, class E2&gt;
+    struct matrix_matrix_binary_traits {
+        typedef unknown_orientation_tag dispatch_category;
+        typedef typename promote_traits&lt;T1, T2&gt;::promote_type promote_type;
+        typedef matrix_matrix_binary&lt;typename E1::const_closure_type,
+                                     typename E2::const_closure_type,
+                                     matrix_matrix_prod&lt;T1, T2, promote_type&gt; &gt; expression_type;
+        typedef expression_type result_type;
+    };
+
+    template&lt;class E1, class E2&gt;
+    typename matrix_matrix_binary_traits&lt;typename E1::value_type, E1,
+                                         typename E2::value_type, E2&gt;::result_type
+    prod (const matrix_expression&lt;E1&gt; &amp;e1,
+          const matrix_expression&lt;E2&gt; &amp;e2,
+          unknown_orientation_tag);
+
+    // Dispatcher
+    template&lt;class E1, class E2&gt;
+    typename matrix_matrix_binary_traits&lt;typename E1::value_type, E1,
+                                         typename E2::value_type, E2&gt;::result_type
+    prod (const matrix_expression&lt;E1&gt; &amp;e1,
+          const matrix_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class E1, class E2&gt;
+    typename matrix_matrix_binary_traits&lt;typename type_traits&lt;typename E1::value_type&gt;::precision_type, E1,
+                                         typename type_traits&lt;typename E2::value_type&gt;::precision_type, E2&gt;::result_type
+    prec_prod (const matrix_expression&lt;E1&gt; &amp;e1,
+               const matrix_expression&lt;E2&gt; &amp;e2,
+               unknown_orientation_tag);
+
+    // Dispatcher
+    template&lt;class E1, class E2&gt;
+    typename matrix_matrix_binary_traits&lt;typename type_traits&lt;typename E1::value_type&gt;::precision_type, E1,
+                                         typename type_traits&lt;typename E2::value_type&gt;::precision_type, E2&gt;::result_type
+    prec_prod (const matrix_expression&lt;E1&gt; &amp;e1,
+               const matrix_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class M, class E1, class E2&gt;
+    M
+    prod (const matrix_expression&lt;E1&gt; &amp;e1,
+          const matrix_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class M, class E1, class E2&gt;
+    M
+    prec_prod (const matrix_expression&lt;E1&gt; &amp;e1,
+               const matrix_expression&lt;E2&gt; &amp;e2);</code>
+</pre>
+<h4>Description</h4>
+<p><code>prod</code> computes the product of the matrix
+expressions. <code>prec_prod</code> computes the double precision
+product of the matrix expressions.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>E1</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</li>
+<li><code>E2</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</li>
+</ul>
+<h4>Preconditions</h4>
+<ul>
+<li><code>e1 ().size2 () == e2 ().size1 ()</code></li>
+</ul>
+<h4>Complexity</h4>
+<p>Cubic depending from the size of the matrix expression.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m1 (3, 3), m2 (3, 3);
+    for (unsigned i = 0; i &lt; std::min (m1.size1 (), m2.size1 ()); ++ i)
+        for (unsigned j = 0; j &lt; std::min (m1.size2 (), m2.size2 ()); ++ j)
+            m1 (i, j) = m2 (i, j) = 3 * i + j;
+
+    std::cout &lt;&lt; prod (m1, m2) &lt;&lt; std::endl;
+}
+</pre>
+<h3>Triangular Solvers</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class E1, class E2&gt;
+    struct matrix_matrix_solve_traits {
+        typedef typename promote_traits&lt;typename E1::value_type, typename E2::value_type&gt;::promote_type promote_type;
+        typedef matrix&lt;promote_type&gt; result_type;
+    };
+
+    template&lt;class E1, class E2&gt;
+    void inplace_solve (const matrix_expression&lt;E1&gt; &amp;e1,
+                        E2 &amp;e2,
+                        lower_tag,
+                        matrix_tag);
+    template&lt;class E1, class E2&gt;
+    void inplace_solve (const matrix_expression&lt;E1&gt; &amp;e1,
+                        E2 &amp;e2,
+                        upper_tag,
+                        matrix_tag);
+    template&lt;class E1, class E2&gt;
+    void inplace_solve (const matrix_expression&lt;E1&gt; &amp;e1,
+                        E2 &amp;e2,
+                        unit_lower_tag,
+                        matrix_tag);
+    template&lt;class E1, class E2&gt;
+    void inplace_solve (const matrix_expression&lt;E1&gt; &amp;e1,
+                        E2 &amp;e2,
+                        unit_upper_tag,
+                        matrix_tag);
+
+    template&lt;class E1, class E2, class C&gt;
+    typename matrix_matrix_solve_traits&lt;E1, E2&gt;::result_type
+    solve (const matrix_expression&lt;E1&gt; &amp;e1,
+           const matrix_expression&lt;E2&gt; &amp;e2,
+           C);</code>
+</pre>
+<h4>Description</h4>
+<p><code>solve</code> solves a linear equation for lower or upper
+(unit) triangular matrices.</p>
+<h4>Definition</h4>
+<p>Defined in the header triangular.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>E1</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</li>
+<li><code>E2</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</li>
+</ul>
+<h4>Preconditions</h4>
+<ul>
+<li><code>e1 ().size1 () == e1 ().size2 ()</code></li>
+<li><code>e1 ().size2 () == e2 ().size1 ()</code></li>
+</ul>
+<h4>Complexity</h4>
+<p>Cubic depending from the size of the matrix expressions.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/triangular.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m1 (3, 3), m2 (3, 3);
+    for (unsigned i = 0; i &lt; std::min (m1.size1 (), m2.size1 ()); ++ i)
+        for (unsigned j = 0; j &lt;= i; ++ j)
+            m1 (i, j) = m2 (i, j) = 3 * i + j + 1;
+
+    std::cout &lt;&lt; solve (m1, m2, lower_tag ()) &lt;&lt; std::endl;
+}
+</pre>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/matrix_proxy.html b/doc/matrix_proxy.html
new file mode 100644
index 0000000..d4b4202
--- /dev/null
+++ b/doc/matrix_proxy.html
@@ -0,0 +1,1428 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Matrix Proxies</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Matrix Proxies</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="matrix_row"></a>Matrix Row</h2>
+<h4>Description</h4>
+<p>The templated class <code>matrix_row&lt;M&gt;</code> allows
+addressing a row of a matrix.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/matrix_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    for (unsigned i = 0; i &lt; m.size1 (); ++ i) {
+        matrix_row&lt;matrix&lt;double&gt; &gt; mr (m, i);
+        for (unsigned j = 0; j &lt; mr.size (); ++ j)
+            mr (j) = 3 * i + j;
+        std::cout &lt;&lt; mr &lt;&lt; std::endl;
+    }
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_proxy.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>M</code></td>
+<td>The type of matrix referenced.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</p>
+<p>If the specified row falls outside that of the row index range
+of the matrix, then the <code>matrix_row</code> is not a well
+formed Vector Expression. That is, access to an element which is
+outside of the matrix is <i>undefined</i>.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_expression&lt;matrix_row&lt;M&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix_row (matrix_type &amp;data, size_type
+i)</code></td>
+<td>Constructs a sub vector.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the sub vector.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>matrix_row &amp;operator = (const matrix_row
+&amp;mr)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>matrix_row &amp;assign_temporary (matrix_row
+&amp;mr)</code></td>
+<td>Assigns a temporary. May change the matrix row <code>mr</code>
+.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_row &amp;operator = (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_row &amp;assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a vector expression to the sub vector. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_row &amp;operator += (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Adds the vector expression to
+the sub vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_row &amp;plus_assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Adds a vector expression to the sub vector. Left and right hand
+side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_row &amp;operator -= (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the vector expression
+from the sub vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_row &amp;minus_assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Subtracts a vector expression from the sub vector. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix_row &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the sub vector with
+a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix_row &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the sub vector through
+a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (matrix_row &amp;mr)</code></td>
+<td>Swaps the contents of the sub vectors.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>matrix_row</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>matrix_row</code>.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the <code>matrix_row</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+<code>matrix_row</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>matrix_row</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>matrix_row</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the
+beginning of the reversed <code>matrix_row</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of
+the reversed <code>matrix_row</code>.</td>
+</tr>
+</tbody>
+</table>
+<h3>Projections</h3>
+<h4>Description</h4>
+<p>The free <code>row</code> functions support the construction of
+matrix rows.</p>
+<h4>Prototypes</h4>
+<pre><code>
+    template&lt;class M&gt;
+    matrix_row&lt;M&gt; row (M &amp;data, std::size_t i);
+    template&lt;class M&gt;
+    const matrix_row&lt;const M&gt; row (const M &amp;data, std::size_t i);
+</code></pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_proxy.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>M</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</li>
+</ul>
+<h4>Complexity</h4>
+<p>Linear depending from the size of the row.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/matrix_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    for (unsigned i = 0; i &lt; m.size1 (); ++ i) {
+        for (unsigned j = 0; j &lt; m.size2 (); ++ j)
+            row (m, i) (j) = 3 * i + j;
+        std::cout &lt;&lt; row (m, i) &lt;&lt; std::endl;
+    }
+}
+</pre>
+<h2><a name="matrix_column"></a>Matrix Column</h2>
+<h4>Description</h4>
+<p>The templated class <code>matrix_column&lt;M&gt;</code> allows
+addressing a column of a matrix.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/matrix_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    for (unsigned j = 0; j &lt; m.size2 (); ++ j) {
+        matrix_column&lt;matrix&lt;double&gt; &gt; mc (m, j);
+        for (unsigned i = 0; i &lt; mc.size (); ++ i)
+            mc (i) = 3 * i + j;
+        std::cout &lt;&lt; mc &lt;&lt; std::endl;
+    }
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_proxy.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>M</code></td>
+<td>The type of matrix referenced.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</p>
+<p>If the specified column falls outside that of the column index
+range of the matrix, then the <code>matrix_column</code> is not a
+well formed Vector Expression. That is, access to an element which
+is outside of the matrix is <i>undefined</i>.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_expression&lt;matrix_column&lt;M&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix_column (matrix_type &amp;data, size_type
+j)</code></td>
+<td>Constructs a sub vector.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the sub vector.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>matrix_column &amp;operator = (const matrix_column
+&amp;mc)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>matrix_column &amp;assign_temporary (matrix_column
+&amp;mc)</code></td>
+<td>Assigns a temporary. May change the matrix column
+<code>mc</code> .</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_column &amp;operator = (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_column &amp;assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a vector expression to the sub vector. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_column &amp;operator += (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Adds the vector expression to
+the sub vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_column &amp;plus_assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Adds a vector expression to the sub vector. Left and right hand
+side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_column &amp;operator -= (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the vector expression
+from the sub vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_column &amp;minus_assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Subtracts a vector expression from the sub vector. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix_column &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the sub vector with
+a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix_column &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the sub vector through
+a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (matrix_column &amp;mc)</code></td>
+<td>Swaps the contents of the sub vectors.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>matrix_column</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>matrix_column</code>.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the <code>matrix_column</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+<code>matrix_column</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>matrix_column</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>matrix_column</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the
+beginning of the reversed <code>matrix_column</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of
+the reversed <code>matrix_column</code>.</td>
+</tr>
+</tbody>
+</table>
+<h3>Projections</h3>
+<h4>Description</h4>
+<p>The free <code>column</code> functions support the construction
+of matrix columns.</p>
+<h4>Prototypes</h4>
+<pre><code>
+    template&lt;class M&gt;
+    matrix_column&lt;M&gt; column (M &amp;data, std::size_t j);
+    template&lt;class M&gt;
+    const matrix_column&lt;const M&gt; column (const M &amp;data, std::size_t j);
+</code></pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_proxy.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>M</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</li>
+</ul>
+<h4>Complexity</h4>
+<p>Linear depending from the size of the column.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/matrix_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    for (unsigned j = 0; j &lt; m.size2 (); ++ j) {
+        for (unsigned i = 0; i &lt; m.size1 (); ++ i)
+            column (m, j) (i) = 3 * i + j;
+        std::cout &lt;&lt; column (m, j) &lt;&lt; std::endl;
+    }
+}
+</pre>
+<h2><a name="vector_range"></a>Vector Range</h2>
+<h4>Description</h4>
+<p>The templated class <code>matrix_vector_range&lt;M&gt;</code>
+allows addressing a sub vector of a matrix.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/matrix_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    for (unsigned i = 0; i &lt; m.size1 (); ++ i)
+        for (unsigned j = 0; j &lt; m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+
+    matrix_vector_range&lt;matrix&lt;double&gt; &gt; mvr (m, range (0, 3), range (0, 3));
+    std::cout &lt;&lt; mvr &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_proxy.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>M</code></td>
+<td>The type of matrix referenced.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</p>
+<p>If the specified ranges fall outside that of the index range of
+the matrix, then the <code>matrix_vector_range</code> is not a well
+formed Vector Expression. That is, access to an element which is
+outside of the matrix is <i>undefined</i>.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_expression&lt;matrix_vector_range&lt;M&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix_vector_range (matrix_type &amp;data,<br />
+const range &amp;r1, const range &amp;r2)</code></td>
+<td>Constructs a sub vector.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the sub vector.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>matrix_vector_range &amp;operator = (const
+matrix_vector_range &amp;mvr)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>matrix_vector_range &amp;assign_temporary
+(matrix_vector_range &amp;mvr)</code></td>
+<td>Assigns a temporary. May change the matrix vector range
+<code>mvr</code>.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_vector_range &amp;operator = (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_vector_range &amp;assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a vector expression to the sub vector. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_vector_range &amp;operator += (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Adds the vector expression to
+the sub vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_vector_range &amp;plus_assign (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Adds a vector expression to the sub vector. Left and right hand
+side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_vector_range &amp;operator -= (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the vector expression
+from the sub vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_vector_range &amp;minus_assign (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Subtracts a vector expression from the sub vector. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix_vector_range &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the sub vector with
+a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix_vector_range &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the sub vector through
+a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (matrix_vector_range &amp;mvr)</code></td>
+<td>Swaps the contents of the sub vectors.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>matrix_vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>matrix_vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the <code>matrix_vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+<code>matrix_vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the <code>matrix_vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>matrix_vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the
+beginning of the reversed <code>matrix_vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of
+the reversed <code>matrix_vector_range</code>.</td>
+</tr>
+</tbody>
+</table>
+<h2><a name="vector_slice"></a>Vector Slice</h2>
+<h4>Description</h4>
+<p>The templated class <code>matrix_vector_slice&lt;M&gt;</code>
+allows addressing a sliced sub vector of a matrix.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/matrix_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    for (unsigned i = 0; i &lt; m.size1 (); ++ i)
+        for (unsigned j = 0; j &lt; m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+
+    matrix_vector_slice&lt;matrix&lt;double&gt; &gt; mvs (m, slice (0, 1, 3), slice (0, 1, 3));
+    std::cout &lt;&lt; mvs &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_proxy.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>M</code></td>
+<td>The type of matrix referenced.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</p>
+<p>If the specified slices fall outside that of the index range of
+the matrix, then the <code>matrix_vector_slice</code> is not a well
+formed Vector Expression. That is, access to an element which is
+outside of the matrix is <i>undefined</i>.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_expression&lt;matrix_vector_slice&lt;M&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix_vector_slice (matrix_type &amp;data,<br />
+const slice &amp;s1, const slice &amp;s2)</code></td>
+<td>Constructs a sub vector.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the sub vector.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>matrix_vector_slice &amp;operator = (const
+matrix_vector_slice &amp;mvs)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>matrix_vector_slice &amp;assign_temporary
+(matrix_vector_slice &amp;mvs)</code></td>
+<td>Assigns a temporary. May change the matrix vector slice
+<code>vs</code>.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_vector_slice &amp;operator = (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_vector_slice &amp;assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a vector expression to the sub vector. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_vector_slice &amp;operator += (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Adds the vector expression to
+the sub vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_vector_slice &amp;plus_assign (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Adds a vector expression to the sub vector. Left and right hand
+side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_vector_slice &amp;operator -= (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the vector expression
+from the sub vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_vector_slice &amp;minus_assign (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Subtracts a vector expression from the sub vector. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix_vector_slice &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the sub vector with
+a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix_vector_slice &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the sub vector through
+a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (matrix_vector_slice &amp;mvs)</code></td>
+<td>Swaps the contents of the sub vectors.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>matrix_vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>matrix_vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the <code>matrix_vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+<code>matrix_vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>matrix_vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>matrix_vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the
+beginning of the reversed <code>matrix_vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of
+the reversed <code>matrix_vector_slice</code>.</td>
+</tr>
+</tbody>
+</table>
+<h2><a name="matrix_range"></a>Matrix Range</h2>
+<h4>Description</h4>
+<p>The templated class <code>matrix_range&lt;M&gt;</code> allows
+addressing a sub matrix of a matrix.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/matrix_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    matrix_range&lt;matrix&lt;double&gt; &gt; mr (m, range (0, 3), range (0, 3));
+    for (unsigned i = 0; i &lt; mr.size1 (); ++ i)
+        for (unsigned j = 0; j &lt; mr.size2 (); ++ j)
+            mr (i, j) = 3 * i + j;
+    std::cout &lt;&lt; mr &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_proxy.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>M</code></td>
+<td>The type of matrix referenced.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</p>
+<p>If the specified ranges fall outside that of the index range of
+the matrix, then the <code>matrix_range</code> is not a well formed
+Matrix Expression. That is, access to an element which is outside
+of the matrix is <i>undefined</i>.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;matrix_range&lt;M&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix_range (matrix_type &amp;data,<br />
+const range &amp;r1, const range &amp;r2)</code></td>
+<td>Constructs a sub matrix.</td>
+</tr>
+<tr>
+<td><code>size_type start1 () const</code></td>
+<td>Returns the index of the first row.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type start2 () const</code></td>
+<td>Returns the index of the first column.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>matrix_range &amp;operator = (const matrix_range
+&amp;mr)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>matrix_range &amp;assign_temporary (matrix_range
+&amp;mr)</code></td>
+<td>Assigns a temporary. May change the matrix range
+<code>mr</code> .</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_range &amp;operator = (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_range &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the sub matrix. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_range &amp;operator += (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the sub matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_range &amp;plus_assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Adds a matrix expression to the sub matrix. Left and right hand
+side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_range &amp;operator -= (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the sub matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_range &amp;minus_assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Subtracts a matrix expression from the sub matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix_range &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the sub matrix with
+a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix_range &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the sub matrix through
+a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (matrix_range &amp;mr)</code></td>
+<td>Swaps the contents of the sub matrices.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>matrix_range</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+reversed the <code>matrix_range</code>.</td>
+</tr>
+</tbody>
+</table>
+<h3>Simple Projections</h3>
+<h4>Description</h4>
+<p>The free <code>subrange</code> functions support the construction
+of matrix ranges.</p>
+<h4>Prototypes</h4>
+<pre><code>
+    template&lt;class M&gt;
+    matrix_range&lt;M&gt; subrange (M &amp;data,
+       M::size_type start1, M::size_type stop1, M::size_type start2, M::size_type, stop2);
+    template&lt;class M&gt;
+    const matrix_range&lt;const M&gt; subrange (const M &amp;data,
+       M::size_type start1, M::size_type stop1, M::size_type start2, M::size_type, stop2);
+</code></pre>
+<h3>Generic Projections</h3>
+<h4>Description</h4>
+<p>The free <code>project</code> functions support the construction
+of matrix ranges. Existing <code>matrix_range</code>'s can be composed with further ranges. The resulting ranges are computed using this existing ranges' <code>compose</code> function.</p>
+<h4>Prototypes</h4>
+<pre><code>
+    template&lt;class M&gt;
+    matrix_range&lt;M&gt; project (M &amp;data, const range &amp;r1, const range &amp;r2);
+    template&lt;class M&gt;
+    const matrix_range&lt;const M&gt; project (const M &amp;data, const range &amp;r1, const range &amp;r2);
+    template&lt;class M&gt;
+    matrix_range&lt;M&gt; project (matrix_range&lt;M&gt; &amp;data, const range &amp;r1, const range &amp;r2);
+    template&lt;class M&gt;
+    const matrix_range&lt;M&gt; project (const matrix_range&lt;M&gt; &amp;data, const range &amp;r1, const range &amp;r2);
+</code></pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_proxy.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>M</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</li>
+</ul>
+<h4>Complexity</h4>
+<p>Quadratic depending from the size of the ranges.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/matrix_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    for (unsigned i = 0; i &lt; m.size1 (); ++ i)
+        for (unsigned j = 0; j &lt; m.size2 (); ++ j)
+            project (m, range (0, 3), range (0, 3)) (i, j) = 3 * i + j;
+    std::cout &lt;&lt; project (m, range (0, 3), range (0, 3)) &lt;&lt; std::endl;
+}
+</pre>
+<h2><a name="matrix_slice"></a>Matrix Slice</h2>
+<h4>Description</h4>
+<p>The templated class <code>matrix_slice&lt;M&gt;</code> allows
+addressing a sliced sub matrix of a matrix.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/matrix_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    matrix_slice&lt;matrix&lt;double&gt; &gt; ms (m, slice (0, 1, 3), slice (0, 1, 3));
+    for (unsigned i = 0; i &lt; ms.size1 (); ++ i)
+        for (unsigned j = 0; j &lt; ms.size2 (); ++ j)
+            ms (i, j) = 3 * i + j;
+    std::cout &lt;&lt; ms &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_proxy.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>M</code></td>
+<td>The type of matrix referenced.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</p>
+<p>If the specified slices fall outside that of the index range of
+the matrix, then the <code>matrix_slice</code> is not a well formed
+Matrix Expression. That is, access to an element which is outside
+of the matrix is <i>undefined</i>.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;matrix_slice&lt;M&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>matrix_slice (matrix_type &amp;data,<br />
+const slice &amp;s1, const slice &amp;s2)</code></td>
+<td>Constructs a sub matrix.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>matrix_slice &amp;operator = (const matrix_slice
+&amp;ms)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>matrix_slice &amp;assign_temporary (matrix_slice
+&amp;ms)</code></td>
+<td>Assigns a temporary. May change the matrix slice
+<code>ms</code> .</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_slice &amp;operator = (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_slice &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the sub matrix. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_slice &amp;operator += (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the sub matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_slice &amp;plus_assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Adds a matrix expression to the sub matrix. Left and right hand
+side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_slice &amp;operator -= (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the sub matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+matrix_slice &amp;minus_assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Subtracts a matrix expression from the sub matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix_slice &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the sub matrix with
+a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+matrix_slice &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the sub matrix
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (matrix_slice &amp;ms)</code></td>
+<td>Swaps the contents of the sub matrices.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>matrix_slice</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>matrix_slice</code>.</td>
+</tr>
+</tbody>
+</table>
+<h3>Simple Projections</h3>
+<h4>Description</h4>
+<p>The free <code>subslice</code> functions support the construction
+of matrix slices.</p>
+<h4>Prototypes</h4>
+<pre><code>
+    template&lt;class M&gt;
+    matrix_slice&lt;M&gt; subslice (M &amp;data,
+       M::size_type start1, M::difference_type stride1, M::size_type size1,
+       M::size_type start2, M::difference_type stride2, M::size_type size2);
+    template&lt;class M&gt;
+    const matrix_slice&lt;const M&gt; subslice (const M &amp;data,
+       M::size_type start1, M::difference_type stride1, M::size_type size1,
+       M::size_type start2, M::difference_type stride2, M::size_type size2);
+</code></pre>
+<h3>Generic Projections</h3>
+<h4>Description</h4>
+<p>The free <code>project</code> functions support the construction
+of matrix slices. Existing <code>matrix_slice</code>'s can be composed with further ranges or slices. The resulting slices are computed using this existing slices' <code>compose</code> function.</p>
+<h4>Prototypes</h4>
+<pre><code>
+    template&lt;class M&gt;
+    matrix_slice&lt;M&gt; project (M &amp;data, const slice &amp;s1, const slice &amp;s2);
+    template&lt;class M&gt;
+    const matrix_slice&lt;const M&gt; project (const M &amp;data, const slice &amp;s1, const slice &amp;s2);
+    template&lt;class M&gt;
+    matrix_slice&lt;M&gt; project (matrix_slice&lt;M&gt; &amp;data, const range &amp;r1, const range &amp;r2);
+    template&lt;class M&gt;
+    const matrix_slice&lt;M&gt; project (const matrix_slice&lt;M&gt; &amp;data, const range &amp;r1, const range &amp;r2);
+    template&lt;class M&gt;
+    matrix_slice&lt;M&gt; project (matrix_slice&lt;M&gt; &amp;data, const slice &amp;s1, const slice &amp;s2);
+    template&lt;class M&gt;
+    const matrix_slice&lt;M&gt; project (const matrix_slice&lt;M&gt; &amp;data, const slice &amp;s1, const slice &amp;s2);
+</code></pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_proxy.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>M</code> is a model of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</li>
+</ul>
+<h4>Complexity</h4>
+<p>Quadratic depending from the size of the slices.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/matrix_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    for (unsigned i = 0; i &lt; m.size1 (); ++ i)
+        for (unsigned j = 0; j &lt; m.size2 (); ++ j)
+            project (m, slice (0, 1, 3), slice (0, 1, 3)) (i, j) = 3 * i + j;
+    std::cout &lt;&lt; project (m, slice (0, 1, 3), slice (0, 1, 3)) &lt;&lt; std::endl;
+}
+</pre>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/matrix_sparse.html b/doc/matrix_sparse.html
new file mode 100644
index 0000000..fb77de4
--- /dev/null
+++ b/doc/matrix_sparse.html
@@ -0,0 +1,983 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Sparse Matrix</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Sparse Matricies</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="mapped_matrix"></a>Mapped Matrix</h2>
+<h4>Description</h4>
+<p>The templated class <code>mapped_matrix&lt;T, F, A&gt;</code> is
+the base container adaptor for sparse matricies using element maps.
+For a <em>(m xn</em>)-dimensional sparse matrix and <em>0 &lt;= i &lt; m</em>,
+<em>0 &lt;= j &lt; n</em> the non-zero elements
+<em>m</em><sub><em>i, j</em></sub> are mapped via <em>(i x n +
+j)</em> for row major orientation or via <em>(i + j x m)</em> for
+column major orientation to consecutive elements of the associative
+container, i.e. for elements <em>k</em> =
+<em>m</em><sub><em>i</em></sub><sub><sub><em>1</em></sub></sub><sub>
+<em>,j</em></sub><sub><sub><em>1</em></sub></sub>and <em>k + 1 =
+m</em><sub><em>i</em></sub><sub><sub><em>2</em></sub></sub><sub><em>
+,j</em></sub><sub><sub><em>2</em></sub></sub>of the container holds
+<em>i</em><sub><em>1</em></sub> <em>&lt;
+i</em><sub><em>2</em></sub> or <em>(i</em><sub><em>1</em></sub>
+<em>= i</em><sub><em>2</em></sub> and
+<em>j</em><sub><em>1</em></sub> <em>&lt;
+j</em><sub><em>2</em></sub><em>)</em> with row major orientation or
+<em>j</em><sub><em>1</em></sub> <em>&lt;
+j</em><sub><em>2</em></sub> or <em>(j</em><sub><em>1</em></sub>
+<em>= j</em><sub><em>2</em></sub> and
+<em>i</em><sub><em>1</em></sub> <em>&lt;
+i</em><sub><em>2</em></sub><em>)</em> with column major
+orientation.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix_sparse.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    mapped_matrix&lt;double&gt; m (3, 3, 3 * 3);
+    for (unsigned i = 0; i &lt; m.size1 (); ++ i)
+        for (unsigned j = 0; j &lt; m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+    std::cout &lt;&lt; m &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_sparse.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the mapped matrix.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>Functor describing the storage organization. <a href=
+"#mapped_matrix_1">[1]</a></td>
+<td><code>row_major</code></td>
+</tr>
+<tr>
+<td><code>A</code></td>
+<td>The type of the adapted array. <a href=
+"#mapped_matrix_2">[2]</a></td>
+<td><code>map_std&lt;std::size_t, T&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"container_concept.html#matrix">Matrix</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_container&lt;mapped_matrix&lt;T, F, A&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>mapped_matrix ()</code></td>
+<td>Allocates a <code>mapped_matrix</code> that holds at most zero
+rows of zero elements.</td>
+</tr>
+<tr>
+<td><code>mapped_matrix (size_type size1, size_type2, size_type non_zeros = 0)</code></td>
+<td>Allocates a <code>mapped_matrix</code> that holds at most
+<code>size1</code> rows of <code>size2</code> elements.</td>
+</tr>
+<tr>
+<td><code>mapped_matrix (const mapped_matrix &amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_matrix (size_type non_zeros, const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size1, size_type size2, bool preserve = true)</code></td>
+<td>Reallocates a <code>mapped_matrix</code> to hold at most
+<code>size1</code> rows of <code>size2</code> elements. The
+existing elements of the <code>mapped_matrix</code> are preseved
+when specified.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>mapped_matrix &amp;operator = (const mapped_matrix
+&amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>mapped_matrix &amp;assign_temporary (mapped_matrix
+&amp;m)</code></td>
+<td>Assigns a temporary. May change the mapped matrix
+<code>m</code> .</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_matrix &amp;operator = (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_matrix &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the mapped matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_matrix &amp;operator += (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the mapped matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_matrix &amp;plus_assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Adds a matrix expression to the mapped matrix. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_matrix &amp;operator -= (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the mapped matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_matrix &amp;minus_assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Subtracts a matrix expression from the mapped matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+mapped_matrix &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the mapped matrix
+with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+mapped_matrix &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the mapped matrix
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (mapped_matrix &amp;m)</code></td>
+<td>Swaps the contents of the mapped matrices.</td>
+</tr>
+<tr>
+<td><code>true_refrence insert_element (size_type i, size_type j, const_reference
+t)</code></td>
+<td>Inserts the value <code>t</code> at the <code>j</code>-th
+element of the <code>i</code>-th row. Duplicates elements are not allowed.</td>
+</tr>
+<tr>
+<td><code>void erase_element (size_type i, size_type j)</code></td>
+<td>Erases the value at the <code>j</code>-th element of the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td>Clears the mapped matrix.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>mapped_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>mapped_matrix</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="mapped_matrix_1">[1]</a> Supported
+parameters for the storage organization are <code>row_major</code>
+and <code>column_major</code>.</p>
+<p><a name="mapped_matrix_2">[2]</a> Supported
+parameters for the adapted array are
+<code>map_array&lt;std::size_t, T&gt;</code> and
+<code>map_std&lt;std::size_t, T&gt;</code>. The latter is
+equivalent to <code>std::map&lt;std::size_t, T&gt;</code>.</p>
+<h2><a name="compressed_matrix"></a>Compressed Matrix</h2>
+<h4>Description</h4>
+<p>The templated class <code>compressed_matrix&lt;T, F, IB, IA,
+TA&gt;</code> is the base container adaptor for compressed
+matrices. For a <em>(m x n</em> )-dimensional compressed matrix and
+<em>0 &lt;= i &lt; m</em>, <em>0 &lt;= j &lt; n</em> the non-zero
+elements <em>m</em><sub><em>i, j</em></sub> are mapped via <em>(i x
+n + j)</em> for row major orientation or via <em>(i + j x m)</em>
+for column major orientation to consecutive elements of the index
+and value containers, i.e. for elements <em>k</em> =
+<em>m</em><sub><em>i</em></sub><sub><sub><em>1</em></sub></sub><sub>
+<em>,j</em></sub><sub><sub><em>1</em></sub></sub>and <em>k + 1 =
+m</em><sub><em>i</em></sub><sub><sub><em>2</em></sub></sub><sub><em>
+,j</em></sub><sub><sub><em>2</em></sub></sub>of the container holds
+<em>i</em><sub><em>1</em></sub> <em>&lt;
+i</em><sub><em>2</em></sub> or <em>(i</em><sub><em>1</em></sub>
+<em>= i</em><sub><em>2</em></sub> and
+<em>j</em><sub><em>1</em></sub> <em>&lt;
+j</em><sub><em>2</em></sub><em>)</em> with row major orientation or
+<em>j</em><sub><em>1</em></sub> <em>&lt;
+j</em><sub><em>2</em></sub> or <em>(j</em><sub><em>1</em></sub>
+<em>= j</em><sub><em>2</em></sub> and
+<em>i</em><sub><em>1</em></sub> <em>&lt;
+i</em><sub><em>2</em></sub><em>)</em> with column major
+orientation.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix_sparse.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    compressed_matrix&lt;double&gt; m (3, 3, 3 * 3);
+    for (unsigned i = 0; i &lt; m.size1 (); ++ i)
+        for (unsigned j = 0; j &lt; m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+    std::cout &lt;&lt; m &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_sparse.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the compressed matrix.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>Functor describing the storage organization. <a href=
+"#compressed_matrix_1">[1]</a></td>
+<td><code>row_major</code></td>
+</tr>
+<tr>
+<td><code>IB</code></td>
+<td>The index base of the compressed vector. <a href=
+"#compressed_matrix_2">[2]</a></td>
+<td><code>0</code></td>
+</tr>
+<tr>
+<td><code>IA</code></td>
+<td>The type of the adapted array for indices. <a href=
+"#compressed_matrix_3">[3]</a></td>
+<td><code>unbounded_array&lt;std::size_t&gt;</code></td>
+</tr>
+<tr>
+<td><code>TA</code></td>
+<td>The type of the adapted array for values. <a href=
+"#compressed_matrix_3">[3]</a></td>
+<td><code>unbounded_array&lt;T&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"container_concept.html#matrix">Matrix</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_container&lt;compressed_matrix&lt;T, F, IB, IA,
+TA&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>compressed_matrix ()</code></td>
+<td>Allocates a <code>compressed_matrix</code> that holds at most
+zero rows of zero elements.</td>
+</tr>
+<tr>
+<td><code>compressed_matrix (size_type size1, size_type2, size_type non_zeros = 0)</code></td>
+<td>Allocates a <code>compressed_matrix</code> that holds at most
+<code>size1</code> rows of <code>size2</code> elements.</td>
+</tr>
+<tr>
+<td><code>compressed_matrix (const compressed_matrix
+&amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_matrix (size_type non_zeros, const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size1, size_type size2, bool preserve = true)</code></td>
+<td>Reallocates a <code>compressed_matrix</code> to hold at most
+<code>size1</code> rows of <code>size2</code> elements. The
+existing elements of the <code>compressed_matrix</code> are
+preseved when specified.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>compressed_matrix &amp;operator = (const
+compressed_matrix &amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>compressed_matrix &amp;assign_temporary
+(compressed_matrix &amp;m)</code></td>
+<td>Assigns a temporary. May change the compressed matrix
+<code>m</code>.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_matrix &amp;operator = (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_matrix &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the compressed matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_matrix &amp;operator += (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the compressed matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_matrix &amp;plus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Adds a matrix expression to the compressed matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_matrix &amp;operator -= (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the compressed matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_matrix &amp;minus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Subtracts a matrix expression from the compressed matrix. Left
+and right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+compressed_matrix &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the compressed
+matrix with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+compressed_matrix &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the compressed matrix
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (compressed_matrix &amp;m)</code></td>
+<td>Swaps the contents of the compressed matrices.</td>
+</tr>
+<tr>
+<td><code>true_reference insert_element (size_type i, size_type j, const_reference
+t)</code></td>
+<td>Inserts the value <code>t</code> at the <code>j</code>-th
+element of the <code>i</code>-th row. Duplicates elements are not allowed.</td>
+</tr>
+<tr>
+<td><code>void erase_element (size_type i, size_type j)</code></td>
+<td>Erases the value at the <code>j</code>-th element of the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td>Clears the compressed matrix.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>compressed_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>compressed_matrix</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="compressed_matrix_1">[1]</a>
+Supported parameters for the storage organization are
+<code>row_major</code> and <code>column_major</code>.</p>
+<p><a name="compressed_matrix_2">[2]</a>
+Supported parameters for the index base are <code>0</code> and
+<code>1</code> at least.</p>
+<p><a name="compressed_matrix_3">[3]</a>
+Supported parameters for the adapted array are
+<code>unbounded_array&lt;&gt;</code> ,
+<code>bounded_array&lt;&gt;</code> and
+<code>std::vector&lt;&gt;</code> .</p>
+<h2><a name="coordinate_matrix"></a>Coordinate Matrix</h2>
+<h4>Description</h4>
+<p>The templated class <code>coordinate_matrix&lt;T, F, IB, IA,
+TA&gt;</code> is the base container adaptor for compressed
+matrices. For a <em>(m x n</em> )-dimensional sorted coordinate
+matrix and <em>0 &lt;= i &lt; m</em>, <em>0 &lt;= j &lt; n</em> the
+non-zero elements <em>m</em><sub><em>i, j</em></sub> are mapped via
+<em>(i x n + j)</em> for row major orientation or via <em>(i + j x
+m)</em> for column major orientation to consecutive elements of the
+index and value containers, i.e. for elements <em>k</em> =
+<em>m</em><sub><em>i</em></sub><sub><sub><em>1</em></sub></sub><sub>
+<em>,j</em></sub><sub><sub><em>1</em></sub></sub>and <em>k + 1 =
+m</em><sub><em>i</em></sub><sub><sub><em>2</em></sub></sub><sub><em>
+,j</em></sub><sub><sub><em>2</em></sub></sub>of the container holds
+<em>i</em><sub><em>1</em></sub> <em>&lt;
+i</em><sub><em>2</em></sub> or <em>(i</em><sub><em>1</em></sub>
+<em>= i</em><sub><em>2</em></sub> and
+<em>j</em><sub><em>1</em></sub> <em>&lt;
+j</em><sub><em>2</em></sub><em>)</em> with row major orientation or
+<em>j</em><sub><em>1</em></sub> <em>&lt;
+j</em><sub><em>2</em></sub> or <em>(j</em><sub><em>1</em></sub>
+<em>= j</em><sub><em>2</em></sub> and
+<em>i</em><sub><em>1</em></sub> <em>&lt;
+i</em><sub><em>2</em></sub><em>)</em> with column major
+orientation.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix_sparse.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    coordinate_matrix&lt;double&gt; m (3, 3, 3 * 3);
+    for (unsigned i = 0; i &lt; m.size1 (); ++ i)
+        for (unsigned j = 0; j &lt; m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+    std::cout &lt;&lt; m &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header matrix_sparse.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the coordinate matrix.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>Functor describing the storage organization. <a href=
+"#coordinate_matrix_1">[1]</a></td>
+<td><code>row_major</code></td>
+</tr>
+<tr>
+<td><code>IB</code></td>
+<td>The index base of the coordinate vector. <a href=
+"#coordinate_matrix_2">[2]</a></td>
+<td><code>0</code></td>
+</tr>
+<tr>
+<td><code>IA</code></td>
+<td>The type of the adapted array for indices. <a href=
+"#coordinate_matrix_3">[3]</a></td>
+<td><code>unbounded_array&lt;std::size_t&gt;</code></td>
+</tr>
+<tr>
+<td><code>TA</code></td>
+<td>The type of the adapted array for values. <a href=
+"#coordinate_matrix_3">[3]</a></td>
+<td><code>unbounded_array&lt;T&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"container_concept.html#matrix">Matrix</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_container&lt;coordinate_matrix&lt;T, F, IB, IA,
+TA&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>coordinate_matrix ()</code></td>
+<td>Allocates a <code>coordinate_matrix</code> that holds at most
+zero rows of zero elements.</td>
+</tr>
+<tr>
+<td><code>coordinate_matrix (size_type size1, size_type2, size_type non_zeros = 0)</code></td>
+<td>Allocates a <code>coordinate_matrix</code> that holds at most
+<code>size1</code> rows of <code>size2</code> elements.</td>
+</tr>
+<tr>
+<td><code>coordinate_matrix (const coordinate_matrix
+&amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_matrix (size_type non_zeros, const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size1, size_type size2, bool preserve = true)</code></td>
+<td>Reallocates a <code>coordinate_matrix</code> to hold at most
+<code>size1</code> rows of <code>size2</code> elements. The
+existing elements of the <code>coordinate_matrix</code> are
+preseved when specified.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>coordinate_matrix &amp;operator = (const
+coordinate_matrix &amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>coordinate_matrix &amp;assign_temporary
+(coordinate_matrix &amp;m)</code></td>
+<td>Assigns a temporary. May change the coordinate matrix
+<code>m</code>.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_matrix &amp;operator = (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_matrix &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the coordinate matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_matrix &amp;operator += (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the coordinate matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_matrix &amp;plus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Adds a matrix expression to the coordinate matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_matrix &amp;operator -= (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the coordinate matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_matrix &amp;minus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Subtracts a matrix expression from the coordinate matrix. Left
+and right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+coordinate_matrix &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the coordinate
+matrix with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+coordinate_matrix &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the coordinate matrix
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (coordinate_matrix &amp;m)</code></td>
+<td>Swaps the contents of the coordinate matrices.</td>
+</tr>
+<tr>
+<td><code>true_reference insert_element (size_type i, size_type j, const_reference
+t)</code></td>
+<td>Inserts the value <code>t</code> at the <code>j</code>-th
+element of the <code>i</code>-th row. Duplicates elements are not allowed.</td>
+</tr>
+<tr>
+<td><code>void append_element (size_type i, size_type j, const_reference t)</code></td>
+<td>Appends the value <code>t</code> at the <code>j</code>-th element of the <code>i</code>-th row.
+Duplicate elements can be appended to a <code>coordinate_matrix</code>. They are merged into a single
+arithmetically summed element by the <code>sort</code> function.</td>
+</tr>
+<tr>
+<td><code>void erase_element (size_type i, size_type j)</code></td>
+<td>Erases the value at the <code>j</code>-th element of the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td>Clears the coordinate matrix.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>coordinate_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>coordinate_matrix</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="coordinate_matrix_1">[1]</a>
+Supported parameters for the storage organization are
+<code>row_major</code> and <code>column_major</code>.</p>
+<p><a name="coordinate_matrix_2">[2]</a>
+Supported parameters for the index base are <code>0</code> and
+<code>1</code> at least.</p>
+<p><a name="coordinate_matrix_3">[3]</a>
+Supported parameters for the adapted array are
+<code>unbounded_array&lt;&gt;</code> ,
+<code>bounded_array&lt;&gt;</code> and
+<code>std::vector&lt;&gt;</code> .</p>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/operations_overview.html b/doc/operations_overview.html
new file mode 100644
index 0000000..42d9942
--- /dev/null
+++ b/doc/operations_overview.html
@@ -0,0 +1,261 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta name="GENERATOR" content="Quanta Plus" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>uBLAS operations overview</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Overview of Matrix and Vector Operations</h1>
+<div class="toc" id="toc"></div>
+
+<dl>
+<dt>Contents:</dt>
+<dd><a href="#blas">Basic Linear Algebra</a></dd>
+<dd><a href="#advanced">Advanced Functions</a></dd>
+<dd><a href="#sub">Submatrices, Subvectors</a></dd>
+<dd><a href="#speed">Speed Improvements</a></dd>
+</dl>
+
+<h2>Definitions</h2>
+
+<table style="" summary="notation">
+<tr><td><code>A, B, C</code></td>
+<td> are matrices</td></tr>
+<tr><td><code>u, v, w</code></td> 
+<td>are vectors</td></tr>
+<tr><td><code>i, j, k</code></td> 
+<td>are integer values</td></tr>
+<tr><td><code>t, t1, t2</code></td> 
+<td>are scalar values</td></tr>
+<tr><td><code>r, r1, r2</code></td> 
+<td>are <a href="range.html">ranges</a>, e.g. <code>range(0, 3)</code></td></tr>
+<tr><td><code>s, s1, s2</code></td> 
+<td>are <a href="range.html#slice">slices</a>, e.g. <code>slice(0, 1, 3)</code></td></tr>
+</table>
+
+<h2><a name="blas">Basic Linear Algebra</a></h2>
+
+<h3>standard operations: addition, subtraction, multiplication by a
+scalar</h3>
+
+<pre><code>
+C = A + B; C = A - B; C = -A;
+w = u + v; w = u - v; w = -u;
+C = t * A; C = A * t; C = A / t;
+w = t * u; w = u * t; w = u / t;
+</code></pre>
+
+<h3>computed assignments</h3>
+
+<pre><code>
+C += A; C -= A; 
+w += u; w -= u; 
+C *= t; C /= t; 
+w *= t; w /= t;
+</code></pre>
+
+<h3>inner, outer and other products</h3>
+
+<pre><code>
+t = inner_prod(u, v);
+C = outer_prod(u, v);
+w = prod(A, u); w = prod(u, A); w = prec_prod(A, u); w = prec_prod(u, A);
+C = prod(A, B); C = prec_prod(A, B);
+w = element_prod(u, v); w = element_div(u, v);
+C = element_prod(A, B); C = element_div(A, B);
+</code></pre>
+
+<h3>transformations</h3>
+
+<pre><code>
+w = conj(u); w = real(u); w = imag(u);
+C = trans(A); C = conj(A); C = herm(A); C = real(A); C = imag(A);
+</code></pre>
+
+<h2><a name="advanced">Advanced functions</a></h2>
+
+<h3>norms</h3>
+
+<pre><code>
+t = norm_inf(v); i = index_norm_inf(v);
+t = norm_1(v);   t = norm_2(v); 
+t = norm_inf(A); i = index_norm_inf(A);
+t = norm_1(A);   t = norm_frobenius(A); 
+</code></pre>
+
+<h3>products</h3>
+
+<pre><code>
+axpy_prod(A, u, w, true);  // w = A * u
+axpy_prod(A, u, w, false); // w += A * u
+axpy_prod(u, A, w, true);  // w = trans(A) * u
+axpy_prod(u, A, w, false); // w += trans(A) * u
+axpy_prod(A, B, C, true);  // C = A * B
+axpy_prod(A, B, C, false); // C += A * B
+</code></pre>
+<p><em>Note:</em> The last argument (<code>bool init</code>) of
+<code>axpy_prod</code> is optional. Currently it defaults to
+<code>true</code>, but this may change in the future. Setting the
+<code>init</code> to <code>true</code> is equivalent to calling
+<code>w.clear()</code> before <code>axpy_prod</code>. 
+There are some specialisation for products of compressed matrices that give a
+large speed up compared to <code>prod</code>.</p>
+<pre><code>
+w = block_prod&lt;matrix_type, 64&gt; (A, u); // w = A * u
+w = block_prod&lt;matrix_type, 64&gt; (u, A); // w = trans(A) * u
+C = block_prod&lt;matrix_type, 64&gt; (A, B); // C = A * B
+</code></pre>
+<p><em>Note:</em> The blocksize can be any integer. However, the
+actual speed depends very significantly on the combination of blocksize,
+CPU and compiler. The function <code>block_prod</code> is designed
+for large dense matrices.</p>
+<h3>rank-k updates</h3>
+<pre><code>
+opb_prod(A, B, C, true);  // C = A * B
+opb_prod(A, B, C, false); // C += A * B
+</code></pre>
+<p><em>Note:</em> The last argument (<code>bool init</code>) of
+<code>opb_prod</code> is optional. Currently it defaults to
+<code>true</code>, but this may change in the future. This function
+may give a speedup if <code>A</code> has less columns than rows,
+because the product is computed as a sum of outer products.</p>
+
+<h2><a name="sub">Submatrices, Subvectors</a></h2>
+<p>Accessing submatrices and subvectors via <b>proxies</b> using <code>project</code> functions:</p>
+<pre><code>
+w = project(u, r);         // the subvector of u specifed by the index range r
+w = project(u, s);         // the subvector of u specifed by the index slice s
+C = project(A, r1, r2);    // the submatrix of A specified by the two index ranges r1 and r2
+C = project(A, s1, s2);    // the submatrix of A specified by the two index slices s1 and s2
+w = row(A, i); w = column(A, j);    // a row or column of matrix as a vector
+</code></pre>
+<p>Assigning to submatrices and subvectors via <b>proxies</b> using <code>project</code> functions:</p>
+<pre><code>
+project(u, r) = w;         // assign the subvector of u specifed by the index range r
+project(u, s) = w;         // assign the subvector of u specifed by the index slice s
+project(A, r1, r2) = C;    // assign the submatrix of A specified by the two index ranges r1 and r2
+project(A, s1, s2) = C;    // assign the submatrix of A specified by the two index slices s1 and s2
+row(A, i) = w; column(A, j) = w;    // a row or column of matrix as a vector
+</code></pre>
+<p><em>Note:</em> A range <code>r = range(start, stop)</code>
+contains all indices <code>i</code> with <code>start &lt;= i &lt;
+stop</code>. A slice is something more general. The slice
+<code>s = slice(start, stride, size)</code> contains the indices
+<code>start, start+stride, ..., start+(size-1)*stride</code>. The
+stride can be 0 or negative! If <code>start >= stop</code> for a range
+or <code>size == 0</code> for a slice then it contains no elements.</p>
+<p>Sub-ranges and sub-slices of vectors and matrices can be created directly with the <code>subrange</code> and <code>sublice</code> functions:</p>
+<pre><code>
+w = subrange(u, 0, 2);         // the 2 element subvector of u
+w = subslice(u, 0, 1, 2);      // the 2 element subvector of u
+C = subrange(A, 0,2, 0,3);     // the 2x3 element submatrix of A
+C = subslice(A, 0,1,2, 0,1,3); // the 2x3 element submatrix of A
+subrange(u, 0, 2) = w;         // assign the 2 element subvector of u
+subslice(u, 0, 1, 2) = w;      // assign the 2 element subvector of u
+subrange(A, 0,2, 0,3) = C;     // assign the 2x3 element submatrix of A
+subrange(A, 0,1,2, 0,1,3) = C; // assigne the 2x3 element submatrix of A
+</code></pre>
+<p>There are to more ways to access some matrix elements as a
+vector:</p>
+<pre><code>matrix_vector_range&lt;matrix_type&gt; (A, r1, r2);
+matrix_vector_slice&lt;matrix_type&gt; (A, s1, s2);
+</code></pre>
+<p><em>Note:</em> These matrix proxies take a sequence of elements
+of a matrix and allow you to access these as a vector. In
+particular <code>matrix_vector_slice</code> can do this in a very
+general way. <code>matrix_vector_range</code> is less useful as the
+elements must lie along a diagonal.</p>
+<p><em>Example:</em> To access the first two elements of a sub
+column of a matrix we access the row with a slice with stride 1 and
+the column with a slice with stride 0 thus:<br />
+<code>matrix_vector_slice&lt;matrix_type&gt; (A, slice(0,1,2),
+slice(0,0,2));
+</code></p>
+
+<h2><a name="speed">Speed improvements</a></h2>
+<h3><a name='noalias'>Matrix / Vector assignment</a></h3>
+<p>If you know for sure that the left hand expression and the right
+hand expression have no common storage, then assignment has
+no <em>aliasing</em>. A more efficient assignment can be specified
+in this case:</p>
+<pre><code>noalias(C) = prod(A, B);
+</code></pre>
+<p>This avoids the creation of a temporary matrix that is required in a normal assignment.
+'noalias' assignment requires that the left and right hand side be size conformant.</p>
+
+<h3>Sparse element access</h3>
+<p>The matrix element access function <code>A(i1,i2)</code> or the equivalent vector
+element access functions (<code>v(i) or v[i]</code>) usually create 'sparse element proxies'
+when applied to a sparse matrix or vector. These <em>proxies</em> allow access to elements
+without having to worry about nasty C++ issues where references are invalidated.</p>
+<p>These 'sparse element proxies' can be implemented more efficiently when applied to <code>const</code>
+objects.
+Sadly in C++ there is no way to distinguish between an element access on the left and right hand side of
+an assignment. Most often elements on the right hand side will not be changed and therefore it would
+be better to use the <code>const</code> proxies. We can do this by making the matrix or vector
+<code>const</code> before accessing it's elements. For example:</p>
+<pre><code>value = const_cast&lt;const VEC&gt;(v)[i];   // VEC is the type of V
+</code></pre>
+<p>If more then one element needs to be accessed <code>const_iterator</code>'s should be used
+in preference to <code>iterator</code>'s for the same reason. For the more daring 'sparse element proxies'
+can be completely turned off in uBLAS by defining the configuration macro <code>BOOST_UBLAS_NO_ELEMENT_PROXIES</code>.
+</p>
+
+
+<h3>Controlling the complexity of nested products</h3>
+
+<p>What is the  complexity (the number of add and multiply operations) required to compute the following?
+</p>
+<pre>
+ R = prod(A, prod(B,C)); 
+</pre>
+<p>Firstly the complexity depends on matrix size. Also since prod is transitive (not commutative)
+the bracket order affects the complexity.
+</p>
+<p>uBLAS evaluates expressions without matrix or vector temporaries and honours
+the bracketing structure. However avoiding temporaries for nested product unnecessarly increases the complexity.
+Conversly by explictly using temporary matrices the complexity of a nested product can be reduced.
+</p>
+<p>uBLAS provides 3 alternative syntaxes for this purpose:
+</p>
+<pre>
+ temp_type T = prod(B,C); R = prod(A,T);   // Preferable if T is preallocated
+</pre>
+<pre>
+ prod(A, temp_type(prod(B,C));
+</pre>
+<pre>
+ prod(A, prod&lt;temp_type&gt;(B,C));
+</pre>
+<p>The 'temp_type' is important. Given A,B,C are all of the same type. Say
+matrix&lt;float&gt;, the choice is easy. However if the value_type is mixed (int with float or double)
+or the matrix type is mixed (sparse with symmetric) the best solution is not so obvious. It is up to you! It
+depends on numerical properties of A and the result of the prod(B,C).
+</p>
+
+<hr />
+<p>Copyright (&copy;) 2000-2007 Joerg Walter, Mathias Koch, Gunter
+Winkler, Michael Stevens<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/options.html b/doc/options.html
new file mode 100644
index 0000000..2b9e6f2
--- /dev/null
+++ b/doc/options.html
@@ -0,0 +1,247 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" >
+<head>
+<meta name="generator" content="HTML Tidy for Linux (vers 6 November 2007), see www.w3.org" />
+<!-- tidy options: -w 120 -asxhtml -clean - - vertical-space yes -f index.html.err -m index.html -->
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Boost Basic Linear Algebra - Configuration Options</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" alt="logo"/>Boost Basic Linear Algebra - Configuration Options</h1>
+<div class="toc" id="toc"></div>
+
+<div class="navigation">
+<a href="index.html">back to uBLAS home</a>
+</div>
+
+<h2>NDEBUG</h2> 
+
+<p><strong>Make sure you define NDEBUG</strong> The only way uBLAS
+knows you want a release configuration is to check if you have defined
+NDEBUG. If you don't it assumes you want a debug configuration and
+adds a lot of very useful runtime check. However these are very slow!
+</p>
+
+
+<h2>BOOST_UBLAS_MOVE_SEMANTICS</h2>
+
+<p class="credit">The patch and description was provided by Nasos Iliopoulos.</p>
+
+<p>An immediate effect of this option is the elimination of the need
+for noalias in types <tt>vector&lt;T&gt;</tt> and <tt>matrix&lt;T&gt;</tt>,
+when assigned to the same type. This option doesn't have an effect on
+bounded and c types. Although it is rare, not all compilers support copy
+elision (that allows for move semantics), so a test must be performed to
+make sure that there is a benefit when it is enabled. A small
+demonstration and test can be found in
+<a href="../test/manual/test_move_semantics.cpp"><tt>test_move_semantics.cpp</tt></a></p>
+
+<p>
+In the <a href="../test/manual/test_move_semantics.cpp">test
+example</a> two tests are defined, one for vectors and one for
+matrices. The aim of this example is to print the pointers of the
+storage of each of the containers, before and after the assignment to
+a temporary object. When move semantics are enabled, the
+<tt>vector&lt;T&gt;</tt> and <tt>matrix&lt;T&gt;</tt> storage is moved
+from the temporary and no copy is performed.
+</p>
+
+<p>
+If move semantics are supported by your compiler you will get an output like the following:
+</p>
+<pre class="screen">
+matrix&lt;double&gt; --------------------------------------------------------------------
+Temporary pointer r: 0x94790c0
+Pointer (must be equal to temp. pointer if move semantics are enabled) : 0x94790c0
+</pre>
+
+<p>Notes:</p>
+<ul>
+<li>It should be no surprise to see matrices and vectors been passed
+by VALUE, the compiler takes care and either moves (if the underlying
+code does not modify the object), or copies (if the underlying code
+modifies the object).
+</li>
+<li>There might be some space for some improvements (like clearing the
+data, before swaping)
+</li>
+<li>Move semantics don't eliminate temporaries. They rather move their
+storage around so no copies are performed.
+</li>
+<li>MSVC does no implement Named Return Value Optimization in debug
+mode. So if you build in debug with this compiler you might get <a
+href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=483229"
+target="_blank">different behaviour</a> than a release build.
+</li>
+<li>Enabling move semantics is done via #define BOOST_UBLAS_MOVE_SEMANTICS.
+</li>
+<li>There is plenty of room for optimizations when c++0x standard is
+out, taking advantage of rvalue references. (I have a sweet vector
+implementation using that).
+</li>
+<li>If you enable move semantics and your compiler does not support
+them, the operation will just be as passing by const reference.
+</li>
+</ul>
+
+<p>Interesting links</p>
+<ul>
+<li> <a href="http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/" target="_blank">Want Speed? Pass by Value.</a>
+</li>
+<li> <a href="http://blogs.msdn.com/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx" target="_blank">Rvalue References: C++0x Features in VC10, Part 2</a>
+</li>
+<li> <a href="http://cpp-next.com/archive/2009/09/move-it-with-rvalue-references/" target="_blank">Move It With Rvalue References</a>
+</li>
+</ul>
+
+<h2>BOOST_UBLAS_CHECK_ENABLE</h2>
+
+<p>When BOOST_UBLAS_CHECK_ENABLE is defined then all index and
+parameter checks are enabled. This is enabled in debug mode and
+disabled in release mode.
+</p>
+
+<h2>BOOST_UBLAS_TYPE_CHECK</h2>
+
+<p>When BOOST_UBLAS_TYPE_CHECK is enabled then all possibly expensive
+structure checks are enabled. If this is not desireable then use
+<tt>#define BOOST_UBLAS_TYPE_CHECK 0</tt> before including any uBLAS
+header. The define BOOST_UBLAS_TYPE_CHECK_EPSILON can be used to
+control the acceptable tolerance, see
+<tt>detail/matrix_assign.hpp</tt> for implementation details of this
+check.
+</p>
+
+<h2>BOOST_UBLAS_USE_LONG_DOUBLE</h2> 
+
+<p>Enable uBLAS expressions that involve containers of 'long double'</p>
+
+<h2>BOOST_UBLAS_USE_INTERVAL</h2>
+
+<p>Enable uBLAS expressions that involve containers of 'boost::numeric::interval' types</p>
+
+<h2>Configuring uBLAS with Macros</h2>
+
+<p>Many macro's appear in ublas/config.hpp and elsewhere. Hopefully in the future some of these will disappear!
+They fall into 4 groups:
+</p>
+<ul>
+<li> Automatically set by 'boost/numeric/ublas/config.hpp' based on
+NDEBUG. Makes the distinction between debug (safe) and release (fast)
+mode. Similar to STLport
+<ul>
+<li> <i>Release</i> mode (NDEBUG defined)
+<ul>
+<li> BOOST_UBLAS_INLINE <i>Compiler dependant definition to control
+function inlining.</i> </li><li> BOOST_UBLAS_USE_FAST_SAME </li></ul>
+</li><li> <i>Debug</i> mode
+<ul>
+<li> BOOST_UBLAS_CHECK_ENABLE <i>Enable checking of indexs, iterators
+and parameters. Prevents out of bound access etc.</i> </li><li>
+BOOST_UBLAS_TYPE_CHECK <i>Enable additional checks for the results of
+expressions using non dense types. Picks up runtime error such as the
+assignment of a numerically non-symmetric matrix to
+symmertic_matrix. Use <tt>#define BOOST_UBLAS_TYPE_CHECK 0</tt> to
+disable expensive numeric type checks.</i> (Note: "structure check"
+would be a much better name.)  </li><li>
+BOOST_UBLAS_TYPE_CHECK_EPSILON <i>default: sqrt(epsilon), controls how
+large the difference between the expected result and the computed
+result may become. Increase this value if you are going to use near
+singular or badly scaled matrices. Please, refer to
+<tt>detail/matrix_assign.hpp</tt> for implementation of these type
+checks.</i> </li></ul> </li></ul>
+</li>
+<li> Automatically set by 'boost/numeric/ublas/config.hpp' based on
+compiler and boost/config.hpp macro's. Augments the compiler
+deficiency workarounds already supplied by boost/config.hpp
+<ul>
+<li> BOOST_UBLAS_NO_NESTED_CLASS_RELATION <i>A particularly nasty
+problem with VC7.1 Requires that uBLAS and the user use begin(it)
+rather then it.begin()</i> </li><li> BOOST_UBLAS_NO_SMART_PROXIES
+<i>Disable the automatic propagation of 'constantness' to
+proxies. Smart proxies automatically determine if the underling
+container they reference is constant or not. They adjust there
+definition of iterators and container access to reflect this
+constantness.</i> </li></ul>
+</li>
+<li> For use by uBLAS authors to test implementation methods. Preset
+in config.hpp
+<ul>
+<li> BOOST_UBLAS_USE_INVARIANT_HOISTING </li><li>
+BOOST_UBLAS_USE_INDEXING </li><li> BOOST_UBLAS_USE_INDEXED_ITERATOR
+</li><li> BOOST_UBLAS_NON_CONFORMANT_PROXIES <i>Gappy containers may
+be non-conformant, that is contain elements at different
+indices. Assigning between proxies (vector ranges for example) of
+these containers is difficult as the LHS may need insert new
+elements. This is slow.</i> </li><li> BOOST_UBLAS_USE_DUFF_DEVICE
+<i>Near useless on all platforms (see GCC's -funroll-loops)</i>
+
+</li></ul>
+</li>
+<li> User options. Can be predefined by user before including any
+uBLAS headers. They may also be automatically defined for some
+compilers to work around compile bugs.
+<ul>
+<li> BOOST_UBLAS_USE_LONG_DOUBLE <i>Enable uBLAS expressions that
+involve containers of 'long double'</i> </li><li>
+BOOST_UBLAS_USE_INTERVAL <i>Enable uBLAS expressions that involve
+containers of 'boost::numeric::interval' types</i> </li><li>
+BOOST_UBLAS_SIMPLE_ET_DEBUG <i>In order to simplify debugging is is
+possible to simplify expression templateso they are restricted to a
+single operation</i>
+
+</li><li> BOOST_UBLAS_ENABLE_PROXY_SHORTCUTS <i> enable automatic
+conversion from proxy class to matrix expression </i> </li><li>
+BOOST_UBLAS_NO_ELEMENT_PROXIES <i>Disables the use of element proxies
+for gappy types.</i> </li><li> <i>The Gappy types (sparse, coordinate,
+compressed) store non-zero elements in their own containers. When new
+non-zero elements are assigned they must rearrange these
+containers. This invalidates references, iterators or pointers to
+these elements. This can happen at some surprising times such as the
+expression "a [1] = a [0] = 1;". Element proxies guarantee all such
+expressions will work as expected. However they bring their own
+restrictions and efficiency problems. For example as of Boost 1.30.0
+they prevent the assignment of elements between different types.</i>
+</li>
+<li> BOOST_UBLAS_REFERENCE_CONST_MEMBER <i>Enable to allow refernces
+to be returned to fixed (zero or one) elements of triangular or banded
+matrices</i>
+
+</li><li> BOOST_UBLAS_NO_EXCEPTIONS <i>Disable the use exceptions of
+uBLAS internal checks and error conditions. BOOST_NO_EXCEPTIONS has
+same effect.</i> 
+</li> 
+<li> BOOST_UBLAS_SINGULAR_CHECK <i>Check the for singularity in triangular solve() functions</i></li>
+</ul>
+</li>
+</ul>
+
+<hr />
+<div id="copyright">
+ <p>Copyright (&copy;) 2000-2009 Joerg Walter, Mathias Koch, Gunter Winkler<br />
+   Use, modification and distribution are subject to the Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+ </p>
+</div>
+<div id="revision">
+<p>
+<!-- Created: Wed Sep 16 21:19:20 CEST 2009 -->
+<!-- hhmts start -->
+Last modified: Wed Sep 16 23:16:45 CEST 2009
+<!-- hhmts end -->
+</p>
+</div>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/overview.html b/doc/overview.html
new file mode 100644
index 0000000..1ce347d
--- /dev/null
+++ b/doc/overview.html
@@ -0,0 +1,965 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content="HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>uBLAS Overview</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" alt="logo"/>uBLAS Overview</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="rationale">Rationale</h2>
+<p><cite>It would be nice if every kind of numeric software could
+be written in C++ without loss of efficiency, but unless something
+can be found that achieves this without compromising the C++ type
+system it may be preferable to rely on Fortran, assembler or
+architecture-specific extensions (Bjarne Stroustrup).</cite></p>
+<p>This C++ library is directed towards scientific computing on the
+level of basic linear algebra constructions with matrices and
+vectors and their corresponding abstract operations. The primary
+design goals were:</p>
+<ul type="disc">
+<li>mathematical notation</li>
+<li>efficiency</li>
+<li>functionality</li>
+<li>compatibility</li>
+</ul>
+<p>Another intention was to evaluate, if the abstraction penalty
+resulting from the use of such matrix and vector classes is
+acceptable.</p>
+<h2>Resources</h2>
+<p>The development of this library was guided by a couple of
+similar efforts:</p>
+<ul type="disc">
+<li><a href="http://www.netlib.org/blas/index.html">BLAS</a> by
+Jack Dongarra et al.</li>
+<li><a href="http://www.oonumerics.org/blitz/">Blitz++</a> by Todd
+Veldhuizen</li>
+<li><a href="http://acts.nersc.gov/pooma/">POOMA</a> by Scott
+Haney et al.</li>
+<li><a href="http://www.lsc.nd.edu/research/mtl/">MTL</a> by Jeremy
+Siek et al.</li>
+</ul>
+<p>BLAS seems to be the most widely used library for basic linear
+algebra constructions, so it could be called a de-facto standard.
+Its interface is procedural, the individual functions are somewhat
+abstracted from simple linear algebra operations. Due to the fact
+that is has been implemented using Fortran and its optimizations,
+it also seems to be one of the fastest libraries available. As we
+decided to design and implement our library in an object-oriented
+way, the technical approaches are distinct. However anyone should
+be able to express BLAS abstractions in terms of our library
+operators and to compare the efficiency of the implementations.</p>
+<p>Blitz++ is an impressive library implemented in C++. Its main
+design seems to be oriented towards multidimensional arrays and
+their associated operators including tensors. The author of Blitz++
+states, that the library achieves performance on par or better than
+corresponding Fortran code due to his implementation technique
+using expression templates and template metaprograms. However we
+see some reasons, to develop an own design and implementation
+approach. We do not know whether anybody tries to implement
+traditional linear algebra and other numerical algorithms using
+Blitz++. We also presume that even today Blitz++ needs the most
+advanced C++ compiler technology due to its implementation idioms.
+On the other hand, Blitz++ convinced us, that the use of expression
+templates is mandatory to reduce the abstraction penalty to an
+acceptable limit.</p>
+<p>POOMA's design goals seem to parallel Blitz++'s in many parts .
+It extends Blitz++'s concepts with classes from the domains of
+partial differential equations and theoretical physics. The
+implementation supports even parallel architectures.</p>
+<p>MTL is another approach supporting basic linear algebra
+operations in C++. Its design mainly seems to be influenced by BLAS
+and the C++ Standard Template Library. We share the insight that a
+linear algebra library has to provide functionality comparable to
+BLAS. On the other hand we think, that the concepts of the C++
+standard library have not yet been proven to support numerical
+computations as needed. As another difference MTL currently does
+not seem to use expression templates. This may result in one of two
+consequences: a possible loss of expressiveness or a possible loss
+of performance.</p>
+<h2>Concepts</h2>
+<h3>Mathematical Notation</h3>
+<p>The usage of mathematical notation may ease the development of
+scientific algorithms. So a C++ library implementing basic linear
+algebra concepts carefully should overload selected C++ operators
+on matrix and vector classes.</p>
+<p>We decided to use operator overloading for the following
+primitives:</p>
+<table border="1" summary="operators">
+<tbody>
+<tr>
+<th align="left">Description</th>
+<th align="left">Operator</th>
+</tr>
+<tr>
+<td>Indexing of vectors and matrices</td>
+<td><code>vector::operator(size_t i);<br />
+matrix::operator(size_t i, size_t j);</code></td>
+</tr>
+<tr>
+<td>Assignment of vectors and matrices</td>
+<td><code>vector::operator = (const vector_expression &amp;);<br />
+vector::operator += (const vector_expression &amp;);<br />
+vector::operator -= (const vector_expression &amp;);<br />
+vector::operator *= (const scalar_expression &amp;);<br />
+matrix::operator = (const matrix_expression &amp;);<br />
+matrix::operator += (const matrix_expression &amp;);<br />
+matrix::operator -= (const matrix_expression &amp;);<br />
+matrix::operator *= (const scalar_expression &amp;);</code></td>
+</tr>
+<tr>
+<td>Unary operations on vectors and matrices</td>
+<td><code>vector_expression operator - (const vector_expression
+&amp;);<br />
+matrix_expression operator - (const matrix_expression
+&amp;);</code></td>
+</tr>
+<tr>
+<td>Binary operations on vectors and matrices</td>
+<td><code>vector_expression operator + (const vector_expression
+&amp;, const vector_expression &amp;);<br />
+vector_expression operator - (const vector_expression &amp;, const
+vector_expression &amp;);<br />
+matrix_expression operator + (const matrix_expression &amp;, const
+matrix_expression &amp;);<br />
+matrix_expression operator - (const matrix_expression &amp;, const
+matrix_expression &amp;);</code></td>
+</tr>
+<tr>
+<td>Multiplication of vectors and matrices with a scalar</td>
+<td><code>vector_expression operator * (const scalar_expression
+&amp;, const vector_expression &amp;);<br />
+vector_expression operator * (const vector_expression &amp;, const
+scalar_expression &amp;);<br />
+matrix_expression operator * (const scalar_expression &amp;, const
+matrix_expression &amp;);<br />
+matrix_expression operator * (const matrix_expression &amp;, const
+scalar_expression &amp;);</code></td>
+</tr>
+</tbody>
+</table>
+<p>We decided to use no operator overloading for the following
+other primitives:</p>
+<table border="1" summary="functions">
+<tbody>
+<tr>
+<th align="left">Description</th>
+<th align="left">Function</th>
+</tr>
+<tr>
+<td>Left multiplication of vectors with a matrix</td>
+<td><code>vector_expression
+prod&lt;</code><code><em>vector_type</em></code> <code>&gt; (const
+matrix_expression &amp;, const vector_expression &amp;);<br />
+vector_expression prod (const matrix_expression &amp;, const
+vector_expression &amp;);</code></td>
+</tr>
+<tr>
+<td>Right multiplication of vectors with a matrix</td>
+<td><code>vector_expression
+prod&lt;</code><code><em>vector_type</em></code> <code>&gt; (const
+vector_expression &amp;, const matrix_expression &amp;);<br />
+vector_expression prod (const vector_expression &amp;, const
+matrix_expression &amp;);<br /></code></td>
+</tr>
+<tr>
+<td>Multiplication of matrices</td>
+<td><code>matrix_expression
+prod&lt;</code><code><em>matrix_type</em></code> <code>&gt; (const
+matrix_expression &amp;, const matrix_expression &amp;);<br />
+matrix_expression prod (const matrix_expression &amp;, const
+matrix_expression &amp;);</code></td>
+</tr>
+<tr>
+<td>Inner product of vectors</td>
+<td><code>scalar_expression inner_prod (const vector_expression
+&amp;, const vector_expression &amp;);</code></td>
+</tr>
+<tr>
+<td>Outer product of vectors</td>
+<td><code>matrix_expression outer_prod (const vector_expression
+&amp;, const vector_expression &amp;);</code></td>
+</tr>
+<tr>
+<td>Transpose of a matrix</td>
+<td><code>matrix_expression trans (const matrix_expression
+&amp;);</code></td>
+</tr>
+</tbody>
+</table>
+<h3>Efficiency</h3>
+<p>To achieve the goal of efficiency for numerical computing, one
+has to overcome two difficulties in formulating abstractions with
+C++, namely temporaries and virtual function calls. Expression
+templates solve these problems, but tend to slow down compilation
+times.</p>
+<h4>Eliminating Temporaries</h4>
+<p>Abstract formulas on vectors and matrices normally compose a
+couple of unary and binary operations. The conventional way of
+evaluating such a formula is first to evaluate every leaf operation
+of a composition into a temporary and next to evaluate the
+composite resulting in another temporary. This method is expensive
+in terms of time especially for small and space especially for
+large vectors and matrices. The approach to solve this problem is
+to use lazy evaluation as known from modern functional programming
+languages. The principle of this approach is to evaluate a complex
+expression element wise and to assign it directly to the
+target.</p>
+<p>Two interesting and dangerous facts result:</p>
+<h4>Aliases</h4>
+<p>One may get serious side effects using element wise
+evaluation on vectors or matrices. Consider the matrix vector
+product <em>x = A x</em>. Evaluation of
+<em>A</em><sub><em>1</em></sub><em>x</em> and assignment to
+<em>x</em><sub><em>1</em></sub> changes the right hand side, so
+that the evaluation of <em>A</em><sub><em>2</em></sub><em>x</em>
+returns a wrong result. In this case there are <strong>aliases</strong> of the elements 
+<em>x</em><sub><em>n</em></sub> on both the left and right hand side of the assignment.</p>
+<p>Our solution for this problem is to
+evaluate the right hand side of an assignment into a temporary and
+then to assign this temporary to the left hand side. To allow
+further optimizations, we provide a corresponding member function
+for every assignment operator and also a 
+<a href="operations_overview.html#noalias"> <code>noalias</code> syntax.</a>
+By using this syntax a programmer can confirm, that the left and right hand sides of an
+assignment are independent, so that element wise evaluation and
+direct assignment to the target is safe.</p>
+<h4>Complexity</h4>
+<p>The computational complexity may be unexpectedly large under certain
+cirumstances. Consider the chained matrix vector product <em>A (B
+x)</em>. Conventional evaluation of <em>A (B x)</em> is quadratic.
+Deferred evaluation of <em>B x</em><sub><em>i</em></sub> is linear.
+As every element <em>B x</em><sub><em>i</em></sub> is needed
+linearly depending of the size, a completely deferred evaluation of
+the chained matrix vector product <em>A (B x)</em> is cubic. In
+such cases one needs to reintroduce temporaries in the
+expression.</p>
+<h4>Eliminating Virtual Function Calls</h4>
+<p>Lazy expression evaluation normally leads to the definition of a
+class hierarchy of terms. This results in the usage of dynamic
+polymorphism to access single elements of vectors and matrices,
+which is also known to be expensive in terms of time. A solution
+was found a couple of years ago independently by David Vandervoorde
+and Todd Veldhuizen and is commonly called expression templates.
+Expression templates contain lazy evaluation and replace dynamic
+polymorphism with static, i.e. compile time polymorphism.
+Expression templates heavily depend on the famous Barton-Nackman
+trick, also coined 'curiously defined recursive templates' by Jim
+Coplien.</p>
+<p>Expression templates form the base of our implementation.</p>
+<h4>Compilation times</h4>
+<p>It is also a well known fact, that expression templates
+challenge currently available compilers. We were able to
+significantly reduce the amount of needed expression templates
+using the Barton-Nackman trick consequently.</p>
+<p>We also decided to support a dual conventional implementation
+(i.e. not using expression templates) with extensive bounds and
+type checking of vector and matrix operations to support the
+development cycle. Switching from debug mode to release mode is
+controlled by the <code>NDEBUG</code> preprocessor symbol of
+<code>&lt;cassert&gt;</code>.</p>
+
+<h2><a name="functionality">Functionality</h2>
+
+<p>Every C++ library supporting linear algebra will be measured
+against the long-standing Fortran package BLAS. We now describe how
+BLAS calls may be mapped onto our classes.</p>
+
+<p>The page <a href="operations_overview.html">Overview of Matrix and Vector Operations</a>
+gives a short summary of the most used operations on vectors and
+matrices.</p>
+
+<h4>Blas Level 1</h4>
+<table border="1" summary="level 1 blas">
+<tbody>
+<tr>
+<th align="left">BLAS Call</th>
+<th align="left">Mapped Library Expression</th>
+<th align="left">Mathematical Description</th>
+<th align="left">Comment</th>
+</tr>
+<tr>
+<td><code>sasum</code> OR <code>dasum</code></td>
+<td><code>norm_1 (x)</code></td>
+<td><em>sum |x<sub>i</sub>|</em></td>
+<td>Computes the <em>l<sub>1</sub></em> (sum) norm of a real vector.</td>
+</tr>
+<tr>
+<td><code>scasum</code> OR <code>dzasum</code></td>
+<td><em><code>real (sum (v)) + imag (sum (v))</code></em></td>
+<td><em>sum re(x<sub>i</sub>) + sum im(x<sub>i</sub>)</em></td>
+<td>Computes the sum of elements of a complex vector.</td>
+</tr>
+<tr>
+<td><code>_nrm2</code></td>
+<td><code>norm_2 (x)</code></td>
+<td><em>sqrt (sum
+|x</em><sub><em>i</em></sub>|<sup><em>2</em></sup> <em>)</em></td>
+<td>Computes the <em>l<sub>2</sub></em> (euclidean) norm of a vector.</td>
+</tr>
+<tr>
+<td><code>i_amax</code></td>
+<td><code>norm_inf (x)<br />
+index_norm_inf (x)</code></td>
+<td><em>max |x</em><sub><em>i</em></sub><em>|</em></td>
+<td>Computes the <em>l<sub>inf</sub></em> (maximum) norm of a vector.<br />
+BLAS computes the index of the first element having this
+value.</td>
+</tr>
+<tr>
+<td><code>_dot<br />
+_dotu<br />
+_dotc</code></td>
+<td><code>inner_prod (x, y)</code>or<code><br />
+inner_prod (conj (x), y)</code></td>
+<td><em>x</em><sup><em>T</em></sup> <em>y</em> or<br />
+<em>x</em><sup><em>H</em></sup> <em>y</em></td>
+<td>Computes the inner product of two vectors.<br />
+BLAS implements certain loop unrollment.</td>
+</tr>
+<tr>
+<td><code>dsdot<br />
+sdsdot</code></td>
+<td><code>a + prec_inner_prod (x, y)</code></td>
+<td><em>a + x</em><sup><em>T</em></sup> <em>y</em></td>
+<td>Computes the inner product in double precision.</td>
+</tr>
+<tr>
+<td><code>_copy</code></td>
+<td><code>x = y<br />
+y.assign (x)</code></td>
+<td><em>x &lt;- y</em></td>
+<td>Copies one vector to another.<br />
+BLAS implements certain loop unrollment.</td>
+</tr>
+<tr>
+<td><code>_swap</code></td>
+<td><code>swap (x, y)</code></td>
+<td><em>x &lt;-&gt; y</em></td>
+<td>Swaps two vectors.<br />
+BLAS implements certain loop unrollment.</td>
+</tr>
+<tr>
+<td><code>_scal<br />
+csscal<br />
+zdscal</code></td>
+<td><code>x *= a</code></td>
+<td><em>x &lt;- a x</em></td>
+<td>Scales a vector.<br />
+BLAS implements certain loop unrollment.</td>
+</tr>
+<tr>
+<td><code>_axpy</code></td>
+<td><code>y += a * x</code></td>
+<td><em>y &lt;- a x + y</em></td>
+<td>Adds a scaled vector.<br />
+BLAS implements certain loop unrollment.</td>
+</tr>
+<tr>
+<td><code>_rot<br />
+_rotm<br />
+csrot<br />
+zdrot</code></td>
+<td><code>t.assign (a * x + b * y),<br />
+y.assign (- b * x + a * y),<br />
+x.assign (t)</code></td>
+<td><em>(x, y) &lt;- (a x + b y, -b x + a y)</em></td>
+<td>Applies a plane rotation.</td>
+</tr>
+<tr>
+<td><code>_rotg<br />
+_rotmg</code></td>
+<td>&nbsp;</td>
+<td><em>(a, b) &lt;-<br />
+&nbsp; (? a / sqrt (a</em><sup><em>2</em></sup> +
+<em>b</em><sup><em>2</em></sup><em>),<br />
+&nbsp; &nbsp; ? b / sqrt (a</em><sup><em>2</em></sup> +
+<em>b</em><sup><em>2</em></sup><em>))</em> or<em><br />
+(1, 0) &lt;- (0, 0)</em></td>
+<td>Constructs a plane rotation.</td>
+</tr>
+</tbody>
+</table>
+<h4>Blas Level 2</h4>
+<table border="1" summary="level 2 blas">
+<tbody>
+<tr>
+<th align="left">BLAS Call</th>
+<th align="left">Mapped Library Expression</th>
+<th align="left">Mathematical Description</th>
+<th align="left">Comment</th>
+</tr>
+<tr>
+<td><code>_t_mv</code></td>
+<td><code>x = prod (A, x)</code> or<code><br />
+x = prod (trans (A), x)</code> or<code><br />
+x = prod (herm (A), x)</code></td>
+<td><em>x &lt;- A x</em> or<em><br />
+x &lt;- A</em><sup><em>T</em></sup> <em>x</em> or<em><br />
+x &lt;- A</em><sup><em>H</em></sup> <em>x</em></td>
+<td>Computes the product of a matrix with a vector.</td>
+</tr>
+<tr>
+<td><code>_t_sv</code></td>
+<td><code>y = solve (A, x, tag)</code> or<br />
+<code>inplace_solve (A, x, tag)</code> or<br />
+<code>y = solve (trans (A), x, tag)</code> or<br />
+<code>inplace_solve (trans (A), x, tag)</code> or<br />
+<code>y = solve (herm (A), x, tag)</code>or<br />
+<code>inplace_solve (herm (A), x, tag)</code></td>
+<!-- TODO: replace nested sub/sup -->
+<td><em>y &lt;- A</em><sup><em>-1</em></sup> <em>x</em>
+or<em><br />
+x &lt;- A</em><sup><em>-1</em></sup> <em>x</em> or<em><br />
+y &lt;-
+A</em><sup><em>T</em></sup><sup><sup><em>-1</em></sup></sup>
+<em>x</em> or<em><br />
+x &lt;-
+A</em><sup><em>T</em></sup><sup><sup><em>-1</em></sup></sup>
+<em>x</em> or<em><br />
+y &lt;-
+A</em><sup><em>H</em></sup><sup><sup><em>-1</em></sup></sup>
+<em>x</em> or<em><br />
+x &lt;-
+A</em><sup><em>H</em></sup><sup><sup><em>-1</em></sup></sup>
+<em>x</em></td>
+<td>Solves a system of linear equations with triangular form, i.e.
+<em>A</em> is triangular.</td>
+</tr>
+<tr>
+<td><code>_g_mv<br />
+_s_mv<br />
+_h_mv</code></td>
+<td><code>y = a * prod (A, x) + b * y</code> or<code><br />
+y = a * prod (trans (A), x) + b * y</code> or<code><br />
+y = a * prod (herm (A), x) + b * y</code></td>
+<td><em>y &lt;- a A x + b y</em> or<em><br />
+y &lt;- a A</em><sup><em>T</em></sup> <em>x + b y<br />
+y &lt;- a A</em><sup><em>H</em></sup> <em>x + b y</em></td>
+<td>Adds the scaled product of a matrix with a vector.</td>
+</tr>
+<tr>
+<td><code>_g_r<br />
+_g_ru<br />
+_g_rc</code></td>
+<td><code>A += a * outer_prod (x, y)</code> or<code><br />
+A += a * outer_prod (x, conj (y))</code></td>
+<td><em>A &lt;- a x y</em><sup><em>T</em></sup> <em>+ A</em>
+or<em><br />
+A &lt;- a x y</em><sup><em>H</em></sup> <em>+ A</em></td>
+<td>Performs a rank <em>1</em> update.</td>
+</tr>
+<tr>
+<td><code>_s_r<br />
+_h_r</code></td>
+<td><code>A += a * outer_prod (x, x)</code> or<code><br />
+A += a * outer_prod (x, conj (x))</code></td>
+<td><em>A &lt;- a x x</em><sup><em>T</em></sup> <em>+ A</em>
+or<em><br />
+A &lt;- a x x</em><sup><em>H</em></sup> <em>+ A</em></td>
+<td>Performs a symmetric or hermitian rank <em>1</em> update.</td>
+</tr>
+<tr>
+<td><code>_s_r2<br />
+_h_r2</code></td>
+<td><code>A += a * outer_prod (x, y) +<br />
+&nbsp;a * outer_prod (y, x))</code> or<code><br />
+A += a * outer_prod (x, conj (y)) +<br />
+&nbsp;conj (a) * outer_prod (y, conj (x)))</code></td>
+<td><em>A &lt;- a x y</em><sup><em>T</em></sup> <em>+ a y
+x</em><sup><em>T</em></sup> <em>+ A</em> or<em><br />
+A &lt;- a x y</em><sup><em>H</em></sup> <em>+
+a</em><sup><em>-</em></sup> <em>y x</em><sup><em>H</em></sup> <em>+
+A</em></td>
+<td>Performs a symmetric or hermitian rank <em>2</em> update.</td>
+</tr>
+</tbody>
+</table>
+<h4>Blas Level 3</h4>
+<table border="1" summary="level 3 blas">
+<tbody>
+<tr>
+<th align="left">BLAS Call</th>
+<th align="left">Mapped Library Expression</th>
+<th align="left">Mathematical Description</th>
+<th align="left">Comment</th>
+</tr>
+<tr>
+<td><code>_t_mm</code></td>
+<td><code>B = a * prod (A, B)</code> or<br />
+<code>B = a * prod (trans (A), B)</code> or<br />
+<code>B = a * prod (A, trans (B))</code> or<br />
+<code>B = a * prod (trans (A), trans (B))</code> or<br />
+<code>B = a * prod (herm (A), B)</code> or<br />
+<code>B = a * prod (A, herm (B))</code> or<br />
+<code>B = a * prod (herm (A), trans (B))</code> or<br />
+<code>B = a * prod (trans (A), herm (B))</code> or<br />
+<code>B = a * prod (herm (A), herm (B))</code></td>
+<td><em>B &lt;- a op (A) op (B)</em> with<br />
+&nbsp; <em>op (X) = X</em> or<br />
+&nbsp; <em>op (X) = X</em><sup><em>T</em></sup> or<br />
+&nbsp; <em>op (X) = X</em><sup><em>H</em></sup></td>
+<td>Computes the scaled product of two matrices.</td>
+</tr>
+<tr>
+<td><code>_t_sm</code></td>
+<td><code>C = solve (A, B, tag)</code> or<br />
+<code>inplace_solve (A, B, tag)</code> or<br />
+<code>C = solve (trans (A), B, tag)</code> or<code><br />
+inplace_solve (trans (A), B, tag)</code> or<code><br />
+C = solve (herm (A), B, tag)</code> or<code><br />
+inplace_solve (herm (A), B, tag)</code></td>
+<td><em>C &lt;- A</em><sup><em>-1</em></sup> <em>B</em>
+or<em><br />
+B &lt;- A</em><sup><em>-1</em></sup> <em>B</em> or<em><br />
+C &lt;-
+A</em><sup><em>T</em></sup><sup><sup><em>-1</em></sup></sup>
+<em>B</em> or<em><br />
+B &lt;- A</em><sup><em>-1</em></sup> <em>B</em> or<em><br />
+C &lt;-
+A</em><sup><em>H</em></sup><sup><sup><em>-1</em></sup></sup>
+<em>B</em> or<em><br />
+B &lt;-
+A</em><sup><em>H</em></sup><sup><sup><em>-1</em></sup></sup>
+<em>B</em></td>
+<td>Solves a system of linear equations with triangular form, i.e.
+<em>A</em> is triangular.</td>
+</tr>
+<tr>
+<td><code>_g_mm<br />
+_s_mm<br />
+_h_mm</code></td>
+<td><code>C = a * prod (A, B) + b * C</code> or<br />
+<code>C = a * prod (trans (A), B) + b * C</code> or<br />
+<code>C = a * prod (A, trans (B)) + b * C</code> or<br />
+<code>C = a * prod (trans (A), trans (B)) + b * C</code> or<br />
+<code>C = a * prod (herm (A), B) + b * C</code> or<br />
+<code>C = a * prod (A, herm (B)) + b * C</code> or<br />
+<code>C = a * prod (herm (A), trans (B)) + b * C</code> or<br />
+<code>C = a * prod (trans (A), herm (B)) + b * C</code> or<br />
+<code>C = a * prod (herm (A), herm (B)) + b * C</code></td>
+<td><em>C &lt;- a op (A) op (B) + b C</em> with<br />
+&nbsp; <em>op (X) = X</em> or<br />
+&nbsp; <em>op (X) = X</em><sup><em>T</em></sup> or<br />
+&nbsp; <em>op (X) = X</em><sup><em>H</em></sup></td>
+<td>Adds the scaled product of two matrices.</td>
+</tr>
+<tr>
+<td><code>_s_rk<br />
+_h_rk</code></td>
+<td><code>B = a * prod (A, trans (A)) + b * B</code> or<br />
+<code>B = a * prod (trans (A), A) + b * B</code> or<br />
+<code>B = a * prod (A, herm (A)) + b * B</code> or<br />
+<code>B = a * prod (herm (A), A) + b * B</code></td>
+<td><em>B &lt;- a A A</em><sup><em>T</em></sup> <em>+ b B</em>
+or<em><br />
+B &lt;- a A</em><sup><em>T</em></sup> <em>A + b B</em> or<br />
+<em>B &lt;- a A A</em><sup><em>H</em></sup> <em>+ b B</em>
+or<em><br />
+B &lt;- a A</em><sup><em>H</em></sup> <em>A + b B</em></td>
+<td>Performs a symmetric or hermitian rank <em>k</em> update.</td>
+</tr>
+<tr>
+<td><code>_s_r2k<br />
+_h_r2k</code></td>
+<td><code>C = a * prod (A, trans (B)) +<br />
+&nbsp;a * prod (B, trans (A)) + b * C</code> or<br />
+<code>C = a * prod (trans (A), B) +<br />
+&nbsp;a * prod (trans (B), A) + b * C</code> or<br />
+<code>C = a * prod (A, herm (B)) +<br />
+&nbsp;conj (a) * prod (B, herm (A)) + b * C</code> or<br />
+<code>C = a * prod (herm (A), B) +<br />
+&nbsp;conj (a) * prod (herm (B), A) + b * C</code></td>
+<td><em>C &lt;- a A B</em><sup><em>T</em></sup> <em>+ a B
+A</em><sup><em>T</em></sup> <em>+ b C</em> or<em><br />
+C &lt;- a A</em><sup><em>T</em></sup> <em>B + a
+B</em><sup><em>T</em></sup> <em>A + b C</em> or<em><br />
+C &lt;- a A B</em><sup><em>H</em></sup> <em>+
+a</em><sup><em>-</em></sup> <em>B A</em><sup><em>H</em></sup> <em>+
+b C</em> or<em><br />
+C &lt;- a A</em><sup><em>H</em></sup> <em>B +
+a</em><sup><em>-</em></sup> <em>B</em><sup><em>H</em></sup> <em>A +
+b C</em></td>
+<td>Performs a symmetric or hermitian rank <em>2 k</em>
+update.</td>
+</tr>
+</tbody>
+</table>
+
+<h2>Storage Layout</h2>
+
+<p>uBLAS supports many different storage layouts. The full details can be
+found at the <a href="types_overview.html">Overview of Types</a>. Most types like 
+<code>vector&lt;double&gt;</code> and <code>matrix&lt;double&gt;</code> are 
+by default compatible to C arrays, but can also be configured to contain
+FORTAN compatible data.
+</p>
+
+<h2>Compatibility</h2>
+<p>For compatibility reasons we provide array like indexing for vectors and matrices. For some types (hermitian, sparse etc) this can be expensive for matrices due to the needed temporary proxy objects.</p>
+<p>uBLAS uses STL compatible allocators for the allocation of the storage required for it's containers.</p>
+<h2>Benchmark Results</h2>
+<p>The following tables contain results of one of our benchmarks.
+This benchmark compares a native C implementation ('C array') and
+some library based implementations. The safe variants based on the
+library assume aliasing, the fast variants do not use temporaries
+and are functionally equivalent to the native C implementation.
+Besides the generic vector and matrix classes the benchmark
+utilizes special classes <code>c_vector</code> and
+<code>c_matrix</code>, which are intended to avoid every overhead
+through genericity.</p>
+<p>The benchmark program <strong>bench1</strong> was compiled with GCC 4.0 and run on an Athlon 64 3000+. Times are scales for reasonable precision by running <strong>bench1 100</strong>.</p>
+<p>First we comment the results for double vectors and matrices of dimension 3 and 3 x 3, respectively.</p>
+<table border="1" summary="1st benchmark">
+<tbody>
+<tr>
+<th align="left">Comment</th>
+</tr>
+<tr>
+<td rowspan="3">inner_prod</td>
+<td>C array</td>
+<td align="right">0.61</td>
+<td align="right">782</td>
+<td rowspan="3">Some abstraction penalty</td>
+</tr>
+<tr>
+<td>c_vector</td>
+<td align="right">0.86</td>
+<td align="right">554</td>
+</tr>
+<tr>
+<td>vector&lt;unbounded_array&gt;</td>
+<td align="right">1.02</td>
+<td align="right">467</td>
+</tr>
+<tr>
+<td rowspan="5">vector + vector</td>
+<td>C array</td>
+<td align="right">0.51</td>
+<td align="right">1122</td>
+<td rowspan="5">Abstraction penalty: factor 2</td>
+</tr>
+<tr>
+<td>c_vector fast</td>
+<td align="right">1.17</td>
+<td align="right">489</td>
+</tr>
+<tr>
+<td>vector&lt;unbounded_array&gt; fast</td>
+<td align="right">1.32</td>
+<td align="right">433</td>
+</tr>
+<tr>
+<td>c_vector safe</td>
+<td align="right">2.02</td>
+<td align="right">283</td>
+</tr>
+<tr>
+<td>vector&lt;unbounded_array&gt; safe</td>
+<td align="right">6.95</td>
+<td align="right">82</td>
+</tr>
+<tr>
+<td rowspan="5">outer_prod</td>
+<td>C array</td>
+<td align="right">0.59</td>
+<td align="right">872</td>
+<td rowspan="5">Some abstraction penalty</td>
+</tr>
+<tr>
+<td>c_matrix, c_vector fast</td>
+<td align="right">0.88</td>
+<td align="right">585</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt;, vector&lt;unbounded_array&gt; fast</td>
+<td align="right">0.90</td>
+<td align="right">572</td>
+</tr>
+<tr>
+<td>c_matrix, c_vector safe</td>
+<td align="right">1.66</td>
+<td align="right">310</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt;, vector&lt;unbounded_array&gt; safe</td>
+<td align="right">2.95</td>
+<td align="right">175</td>
+</tr>
+<tr>
+<td rowspan="5">prod (matrix, vector)</td>
+<td>C array</td>
+<td align="right">0.64</td>
+<td align="right">671</td>
+<td rowspan="5">No significant abstraction penalty</td>
+</tr>
+<tr>
+<td>c_matrix, c_vector fast</td>
+<td align="right">0.70</td>
+<td align="right">613</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt;, vector&lt;unbounded_array&gt; fast</td>
+<td align="right">0.79</td>
+<td align="right">543</td>
+</tr>
+<tr>
+<td>c_matrix, c_vector safe</td>
+<td align="right">0.95</td>
+<td align="right">452</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt;, vector&lt;unbounded_array&gt; safe</td>
+<td align="right">2.61</td>
+<td align="right">164</td>
+</tr>
+<tr>
+<td rowspan="5">matrix + matrix</td>
+<td>C array</td>
+<td align="right">0.75</td>
+<td align="right">686</td>
+<td rowspan="5">No significant abstraction penalty</td>
+</tr>
+<tr>
+<td>c_matrix fast</td>
+<td align="right">0.99</td>
+<td align="right">520</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt; fast</td>
+<td align="right">1.29</td>
+<td align="right">399</td>
+</tr>
+<tr>
+<td>c_matrix safe</td>
+<td align="right">1.7</td>
+<td align="right">303</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt; safe</td>
+<td align="right">3.14</td>
+<td align="right">164</td>
+</tr>
+<tr>
+<td rowspan="5">prod (matrix, matrix)</td>
+<td>C array</td>
+<td align="right">0.94</td>
+<td align="right">457</td>
+<td rowspan="5">No significant abstraction penalty</td>
+</tr>
+<tr>
+<td>c_matrix fast</td>
+<td align="right">1.17</td>
+<td align="right">367</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt; fast</td>
+<td align="right">1.34</td>
+<td align="right">320</td>
+</tr>
+<tr>
+<td>c_matrix safe</td>
+<td align="right">1.56</td>
+<td align="right">275</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt; safe</td>
+<td align="right">2.06</td>
+<td align="right">208</td>
+</tr>
+</tbody>
+</table>
+<p>We notice a two fold performance loss for small vectors and matrices: first the general abstraction penalty for using classes, and then a small loss when using the generic vector and matrix classes. The difference w.r.t. alias assumptions is also significant.</p>
+<p>Next we comment the results for double vectors and matrices of
+dimension 100 and 100 x 100, respectively.</p>
+<table border="1" summary="2nd benchmark">
+<tbody>
+<tr>
+<th align="left">Operation</th>
+<th align="left">Implementation</th>
+<th align="left">Elapsed [s]</th>
+<th align="left">MFLOP/s</th>
+<th align="left">Comment</th>
+</tr>
+<tr>
+<td rowspan="3">inner_prod</td>
+<td>C array</td>
+<td align="right">0.64</td>
+<td align="right">889</td>
+<td rowspan="3">No significant abstraction penalty</td>
+</tr>
+<tr>
+<td>c_vector</td>
+<td align="right">0.66</td>
+<td align="right">862</td>
+</tr>
+<tr>
+<td>vector&lt;unbounded_array&gt;</td>
+<td align="right">0.66</td>
+<td align="right">862</td>
+</tr>
+<tr>
+<td rowspan="5">vector + vector</td>
+<td>C array</td>
+<td align="right">0.64</td>
+<td align="right">894</td>
+<td rowspan="5">No significant abstraction penalty</td>
+</tr>
+<tr>
+<td>c_vector fast</td>
+<td align="right">0.66</td>
+<td align="right">867</td>
+</tr>
+<tr>
+<td>vector&lt;unbounded_array&gt; fast</td>
+<td align="right">0.66</td>
+<td align="right">867</td>
+</tr>
+<tr>
+<td>c_vector safe</td>
+<td align="right">1.14</td>
+<td align="right">501</td>
+</tr>
+<tr>
+<td>vector&lt;unbounded_array&gt; safe</td>
+<td align="right">1.23</td>
+<td align="right">465</td>
+</tr>
+<tr>
+<td rowspan="5">outer_prod</td>
+<td>C array</td>
+<td align="right">0.50</td>
+<td align="right">1144</td>
+<td rowspan="5">No significant abstraction penalty</td>
+</tr>
+<tr>
+<td>c_matrix, c_vector fast</td>
+<td align="right">0.71</td>
+<td align="right">806</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt;, vector&lt;unbounded_array&gt; fast</td>
+<td align="right">0.57</td>
+<td align="right">1004</td>
+</tr>
+<tr>
+<td>c_matrix, c_vector safe</td>
+<td align="right">1.91</td>
+<td align="right">300</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt;, vector&lt;unbounded_array&gt; safe</td>
+<td align="right">0.89</td>
+<td align="right">643</td>
+</tr>
+<tr>
+<td rowspan="5">prod (matrix, vector)</td>
+<td>C array</td>
+<td align="right">0.65</td>
+<td align="right">876</td>
+<td rowspan="5">No significant abstraction penalty</td>
+</tr>
+<tr>
+<td>c_matrix, c_vector fast</td>
+<td align="right">0.65</td>
+<td align="right">876</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt;, vector&lt;unbounded_array&gt;
+fast</td>
+<td align="right">0.66</td>
+<td align="right">863</td>
+</tr>
+<tr>
+<td>c_matrix, c_vector safe</td>
+<td align="right">0.66</td>
+<td align="right">863</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt;, vector&lt;unbounded_array&gt;
+safe</td>
+<td align="right">0.66</td>
+<td align="right">863</td>
+</tr>
+<tr>
+<td rowspan="5">matrix + matrix</td>
+<td>C array</td>
+<td align="right">0.96</td>
+<td align="right">596</td>
+<td rowspan="5">No significant abstraction penalty</td>
+</tr>
+<tr>
+<td>c_matrix fast</td>
+<td align="right">1.21</td>
+<td align="right">473</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt; fast</td>
+<td align="right">1.00</td>
+<td align="right">572</td>
+</tr>
+<tr>
+<td>c_matrix safe</td>
+<td align="right">2.44</td>
+<td align="right">235</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt; safe</td>
+<td align="right">1.30</td>
+<td align="right">440</td>
+</tr>
+<tr>
+<td rowspan="5">prod (matrix, matrix)</td>
+<td>C array</td>
+<td align="right">0.70</td>
+<td align="right">813</td>
+<td rowspan="5">No significant abstraction penalty</td>
+</tr>
+<tr>
+<td>c_matrix fast</td>
+<td align="right">0.73</td>
+<td align="right">780</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt; fast</td>
+<td align="right">0.76</td>
+<td align="right">749</td>
+</tr>
+<tr>
+<td>c_matrix safe</td>
+<td align="right">0.75</td>
+<td align="right">759</td>
+</tr>
+<tr>
+<td>matrix&lt;unbounded_array&gt; safe</td>
+<td align="right">0.76</td>
+<td align="right">749</td>
+</tr>
+</tbody>
+</table>
+<p>For larger vectors and matrices the general abstraction penalty
+for using classes seems to decrease, the small loss when using
+generic vector and matrix classes seems to remain. The difference
+w.r.t. alias assumptions remains visible, too.</p>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/products.html b/doc/products.html
new file mode 100644
index 0000000..563a4b8
--- /dev/null
+++ b/doc/products.html
@@ -0,0 +1,318 @@
+?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <title>Special Products</title>
+  <meta name="GENERATOR" content="Quanta Plus" />
+  <meta name="AUTHOR" content="Gunter Winkler" />
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+  <link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+  <link rel="stylesheet" href="ublas.css" type="text/css" />
+  <script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+  <script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+</head>
+<body>
+
+<h1><img src="../../../../boost.png" align="middle" />Special Products </h1>
+<div class="toc" id="toc"></div>
+
+<h2>Functions</h2>
+
+<table summary="" border=0 cellpadding=0 cellspacing=0>
+<tr>
+<td class="memItemLeft" nowrap align=right valign=top>template&lt;class V, class E1, class E2&gt; BOOST_UBLAS_INLINE V &amp;&nbsp;</td>
+<td class="memItemRight" valign=bottom><a class="el" href="#ga8">axpy_prod</a> (const matrix_expression&lt; E1 &gt; &amp;e1, const vector_expression&lt; E2 &gt; &amp;e2, V &amp;v, bool init=true)</td></tr>
+
+<tr>
+<td class="mdescLeft">&nbsp;</td>
+<td class="mdescRight">computes <code>v += A x</code> or <code>v = A x</code> in an optimized fashion.  <a href="#ga8"></a><br /><br /></td></tr>
+<tr>
+<td class="memItemLeft" nowrap align=right valign=top>template&lt;class V, class E1, class E2&gt; BOOST_UBLAS_INLINE V &amp;&nbsp;</td>
+<td class="memItemRight" valign=bottom><a class="el" href="#ga9">axpy_prod</a> (const vector_expression&lt; E1 &gt; &amp;e1, const matrix_expression&lt; E2 &gt; &amp;e2, V &amp;v, bool init=true)</td></tr>
+
+<tr>
+<td class="mdescLeft">&nbsp;</td>
+<td class="mdescRight">computes <code>v += A<sup>T</sup> x</code> or <code>v = A<sup>T</sup> x</code> in an optimized fashion.  <a href="#ga9"></a><br /><br /></td></tr>
+<tr>
+<td class="memItemLeft" nowrap align=right valign=top>template&lt;class M, class E1, class E2&gt; BOOST_UBLAS_INLINE M &amp;&nbsp;</td>
+<td class="memItemRight" valign=bottom><a class="el" href="#ga7">axpy_prod</a> (const matrix_expression&lt; E1 &gt; &amp;e1, const matrix_expression&lt; E2 &gt; &amp;e2, M &amp;m, bool init=true)</td></tr>
+
+<tr>
+<td class="mdescLeft">&nbsp;</td>
+<td class="mdescRight">computes <code>M += A X</code> or <code>M = A X</code> in an optimized fashion.  <a href="#ga7"></a><br /><br /></td></tr>
+<tr>
+<td class="memItemLeft" nowrap align=right valign=top>template&lt;class M, class E1, class E2&gt; BOOST_UBLAS_INLINE M &amp;&nbsp;</td>
+<td class="memItemRight" valign=bottom><a class="el" href="#ga6">opb_prod</a> (const matrix_expression&lt; E1 &gt; &amp;e1, const matrix_expression&lt; E2 &gt; &amp;e2, M &amp;m, bool init=true)</td></tr>
+
+<tr>
+<td class="mdescLeft">&nbsp;</td>
+<td class="mdescRight">computes <code>M += A X</code> or <code>M = A X</code> in an optimized fashion.  <a href="#ga6"></a><br /><br /></td></tr>
+</table>
+
+<hr />
+
+<a class="anchor" name="ga8" doxytag="boost::numeric::ublas::axpy_prod" ></a>
+<table summary="" class="mdTable" width="95%" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table summary="" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"> BOOST_UBLAS_INLINE V&amp; axpy_prod           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">const matrix_expression&lt; E1 &gt; &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>e1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const vector_expression&lt; E2 &gt; &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>e2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>V &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>v</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>bool&nbsp;</td>
+          <td class="mdname" nowrap> <em>init</em> = <code>true</code></td>
+        </tr>
+        <tr>
+          <td></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table summary="" cellspacing=5 cellpadding=0 border=0>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+computes <code>v += A x</code> or <code>v = A x</code> in an optimized fashion. 
+</p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table summary="" border="0" cellspacing="2" cellpadding="0">
+    <tr><td></td><td valign=top><em>e1</em>&nbsp;</td><td>the matrix expression <code>A</code> </td></tr>
+    <tr><td></td><td valign=top><em>e2</em>&nbsp;</td><td>the vector expression <code>x</code> </td></tr>
+    <tr><td></td><td valign=top><em>v</em>&nbsp;</td><td>the result vector <code>v</code> </td></tr>
+    <tr><td></td><td valign=top><em>init</em>&nbsp;</td><td>a boolean parameter</td></tr>
+  </table>
+</dl>
+<code>axpy_prod(A, x, v, init)</code> implements the well known axpy-product. Setting <em>init</em> to <code>true</code> is equivalent to call <code>v.clear()</code> before <code>axpy_prod</code>. Currently <em>init</em> defaults to <code>true</code>, but this may change in the future.<p>
+Up to now there are some specialisation for compressed matrices that give a large speed up compared to prod.    </td>
+  </tr>
+</table>
+
+
+<a class="anchor" name="ga9" doxytag="boost::numeric::ublas::axpy_prod" ></a>
+<table summary="" class="mdTable" width="95%" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table summary="" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"> BOOST_UBLAS_INLINE V&amp; axpy_prod           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">const vector_expression&lt; E1 &gt; &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>e1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const matrix_expression&lt; E2 &gt; &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>e2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>V &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>v</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>bool&nbsp;</td>
+          <td class="mdname" nowrap> <em>init</em> = <code>true</code></td>
+        </tr>
+        <tr>
+          <td></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table summary="" cellspacing=5 cellpadding=0 border=0>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+computes <code>v += A<sup>T</sup> x</code> or <code>v = A<sup>T</sup> x</code> in an optimized fashion. 
+</p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table summary="" border="0" cellspacing="2" cellpadding="0">
+    <tr><td></td><td valign=top><em>e1</em>&nbsp;</td><td>the vector expression <code>x</code> </td></tr>
+    <tr><td></td><td valign=top><em>e2</em>&nbsp;</td><td>the matrix expression <code>A</code> </td></tr>
+    <tr><td></td><td valign=top><em>v</em>&nbsp;</td><td>the result vector <code>v</code> </td></tr>
+    <tr><td></td><td valign=top><em>init</em>&nbsp;</td><td>a boolean parameter</td></tr>
+  </table>
+</dl>
+<code>axpy_prod(x, A, v, init)</code> implements the well known axpy-product. Setting <em>init</em> to <code>true</code> is equivalent to call <code>v.clear()</code> before <code>axpy_prod</code>. Currently <em>init</em> defaults to <code>true</code>, but this may change in the future.<p>
+Up to now there are some specialisation for compressed matrices that give a large speed up compared to prod.    </td>
+  </tr>
+</table>
+
+<a class="anchor" name="ga7" doxytag="boost::numeric::ublas::axpy_prod" ></a>
+<table summary="" class="mdTable" width="95%" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table summary="" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"> BOOST_UBLAS_INLINE M&amp; axpy_prod           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">const matrix_expression&lt; E1 &gt; &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>e1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const matrix_expression&lt; E2 &gt; &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>e2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>M &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>bool&nbsp;</td>
+          <td class="mdname" nowrap> <em>init</em> = <code>true</code></td>
+        </tr>
+        <tr>
+          <td></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table summary="" cellspacing=5 cellpadding=0 border=0>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+computes <code>M += A X</code> or <code>M = A X</code> in an optimized fashion. 
+</p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table summary="" border="0" cellspacing="2" cellpadding="0">
+    <tr><td></td><td valign=top><em>e1</em>&nbsp;</td><td>the matrix expression <code>A</code> </td></tr>
+    <tr><td></td><td valign=top><em>e2</em>&nbsp;</td><td>the matrix expression <code>X</code> </td></tr>
+    <tr><td></td><td valign=top><em>m</em>&nbsp;</td><td>the result matrix <code>M</code> </td></tr>
+    <tr><td></td><td valign=top><em>init</em>&nbsp;</td><td>a boolean parameter</td></tr>
+  </table>
+</dl>
+<code>axpy_prod(A, X, M, init)</code> implements the well known axpy-product. Setting <em>init</em> to <code>true</code> is equivalent to call <code>M.clear()</code> before <code>axpy_prod</code>. Currently <em>init</em> defaults to <code>true</code>, but this may change in the future.<p>
+Up to now there are no specialisations.    </td>
+  </tr>
+</table>
+
+<a class="anchor" name="ga6" doxytag="boost::numeric::ublas::opb_prod" ></a>
+
+<table summary="" class="mdTable" width="95%" cellpadding="2" cellspacing="0">
+  <tr>
+    <td class="mdRow">
+      <table summary="" cellpadding="0" cellspacing="0" border="0">
+        <tr>
+          <td class="md" nowrap valign="top"> BOOST_UBLAS_INLINE M&amp; opb_prod           </td>
+          <td class="md" valign="top">(&nbsp;</td>
+          <td class="md" nowrap valign="top">const matrix_expression&lt; E1 &gt; &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>e1</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>const matrix_expression&lt; E2 &gt; &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>e2</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>M &amp;&nbsp;</td>
+          <td class="mdname" nowrap> <em>m</em>, </td>
+        </tr>
+        <tr>
+          <td class="md" nowrap align="right"></td>
+          <td></td>
+          <td class="md" nowrap>bool&nbsp;</td>
+          <td class="mdname" nowrap> <em>init</em> = <code>true</code></td>
+        </tr>
+        <tr>
+          <td></td>
+          <td class="md">)&nbsp;</td>
+          <td class="md" colspan="2"></td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+<table summary="" cellspacing=5 cellpadding=0 border=0>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+
+<p>
+computes <code>M += A X</code> or <code>M = A X</code> in an optimized fashion. 
+</p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table summary="" border="0" cellspacing="2" cellpadding="0">
+    <tr><td></td><td valign=top><em>e1</em>&nbsp;</td><td>the matrix expression <code>A</code> </td></tr>
+    <tr><td></td><td valign=top><em>e2</em>&nbsp;</td><td>the matrix expression <code>X</code> </td></tr>
+    <tr><td></td><td valign=top><em>m</em>&nbsp;</td><td>the result matrix <code>M</code> </td></tr>
+    <tr><td></td><td valign=top><em>init</em>&nbsp;</td><td>a boolean parameter</td></tr>
+  </table>
+</dl>
+<code>opb_prod(A, X, M, init)</code> implements the well known axpy-product. Setting <em>init</em> to <code>true</code> is equivalent to call <code>M.clear()</code> before <code>opb_prod</code>. Currently <em>init</em> defaults to <code>true</code>, but this may change in the future.<p>
+This function may give a speedup if <code>A</code> has less columns than rows, because the product is computed as a sum of outer products.    </td>
+  </tr>
+</table>
+
+
+
+<hr />
+<p>Copyright (&copy;) 2000-2004 Michael Stevens, Mathias Koch, 
+Joerg Walter, Gunter Winkler<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/range.html b/doc/range.html
new file mode 100644
index 0000000..37213be
--- /dev/null
+++ b/doc/range.html
@@ -0,0 +1,229 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Range and slice</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Range and Slice Storage</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="range"></a>Range&lt;SizeType,DistanceType&gt;</h2>
+<h4>Description</h4>
+<p>The class <code>range</code> specifies a range of indicies. The range is a sequence of indices
+from a start value to stop value. The indices increase by one and exlude the stop value.
+<code>range</code> can therefore be used to specify ranges of elements from vectors and matrices.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/storage.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    range r (0, 3);
+    for (unsigned i = 0; i &lt; r.size (); ++ i) {
+        std::cout &lt;&lt; r (i) &lt;&lt; std::endl;
+    }
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header storage.hpp.</p>
+<h4>Model of</h4>
+<p>Reversible Container.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of Reversible
+Container.</p>
+<h4>Public base classes</h4>
+<p>None.</p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>range (size_type start, size_type stop)</code></td>
+<td>Constructs a range of indicies from <code>start</code> to <code>stop (excluded)</code>
+.</td>
+</tr>
+<tr>
+<td><code>size_type start () const</code></td>
+<td>Returns the beginning of the <code>range</code>.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the <code>range</code>.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i)
+const</code></td>
+<td>Returns the value <code>start + i</code> of the <code>i</code>
+-th element.</td>
+</tr>
+<tr>
+<td><code>range compose (const range &amp;r) const</code></td>
+<td>Returns the composite range from <code>start + r.start
+()</code> to <code>start + r.start () + r.size ()</code>.</td>
+</tr>
+<tr>
+<td><code>bool operator == (const range &amp;r) const</code></td>
+<td>Tests two ranges for equality.</td>
+</tr>
+<tr>
+<td><code>bool operator != (const range &amp;r) const</code></td>
+<td>Tests two ranges for inequality.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>range</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>range</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>range</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>range</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Preconditions</h4>
+<ul>
+<li><code>start () &lt;= stop ()</code></li>
+</ul>
+
+<h2><a name="slice"></a>Slice&lt;SizeType,DistanceType&gt;</h2>
+<h4>Description</h4>
+<p>The class <code>slice</code> specifies a 'slice' of indicies. Slices are more general
+then ranges, the stride allows the sequence of indicies to increase and decrease by the specified amount between element.
+<code>slice</code> can therefore be used to specify slices of element from vectors and matrices.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/storage.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    slice s (0, 1, 3);
+    for (unsigned i = 0; i &lt; s.size (); ++ i) {
+        std::cout &lt;&lt; s (i) &lt;&lt; std::endl;
+    }
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header storage.hpp.</p>
+<h4>Model of</h4>
+<p>Reversible Container.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of Reversible
+Container.</p>
+<h4>Public base classes</h4>
+<p>None.</p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>slice (size_type start, size_type stride, size_type
+size)</code></td>
+<td>Constructs a slice <code>start,start+stride,start+2*stride...</code> with 
+<code>size</code> elements.</td>
+</tr>
+<tr>
+<td><code>size_type start () const</code></td>
+<td>Returns the beginning of the <code>slice</code>.</td>
+</tr>
+<tr>
+<td><code>size_type stride () const</code></td>
+<td>Returns the stride of the <code>slice</code>.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the <code>slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i)
+const</code></td>
+<td>Returns the value <code>start + i * stride</code> of the
+<code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>slice compose (const range &amp;r) const</code></td>
+<td>Returns the composite slice from <code>start + stride * r.start
+()</code> to <code>start + stride * (r.start () + r.size ())</code>
+with stride <code>stride</code>.</td>
+</tr>
+<tr>
+<td><code>slice compose (const slice &amp;s) const</code></td>
+<td>Returns the composite slice from <code>start + stride * s.start
+()</code> to <code>start + stride * s.stride () * (s.start () +
+s.size ())</code> with stride <code>stride * s.stride ()</code>
+.</td>
+</tr>
+<tr>
+<td><code>bool operator == (const slice &amp;s) const</code></td>
+<td>Tests two slices for equality.</td>
+</tr>
+<tr>
+<td><code>bool operator != (const slice &amp;s) const</code></td>
+<td>Tests two slices for inequality.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>slice</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Preconditions</h4>
+<ul>
+<li>None all strides are vaild. However when an index is returned or an iterator is dereferenced its
+value must be representable as the size_type.</li>
+</ul>
+   <hr/>
+   <p>
+      Copyright (&copy;) 2000-2004 Michael Stevens, Mathias Koch,
+      Joerg Walter, Gunter Winkler<br />
+      Use, modification and distribution are subject to the
+      Boost Software License, Version 1.0.
+      (See accompanying file LICENSE_1_0.txt
+      or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+         http://www.boost.org/LICENSE_1_0.txt
+      </a>).
+   </p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/release_notes.html b/doc/release_notes.html
new file mode 100644
index 0000000..2a10e07
--- /dev/null
+++ b/doc/release_notes.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content="HTML Tidy for Linux (vers 6 November 2007), see www.w3.org" />
+<!-- tidy options: -w 120 -asxhtml -clean - - vertical-space yes -f index.html.err -m index.html -->
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Boost Basic Linear Algebra - Release Notes</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" alt="logo"/>Boost Basic Linear Algebra - Release Notes</h1>
+
+<div class="navigation">
+<a href="index.html">back to uBLAS home</a>
+</div>
+<div class="toc" id="toc"></div>
+
+<h2>Release 1.52.0</h2>
+
+<h3>improvements</h3>
+
+<ul>
+<li><a href="https://svn.boost.org/trac/boost/ticket/4024">[4024]</a> improve performance of inplace_solve</li>
+<li><a href="https://svn.boost.org/trac/boost/ticket/6511">[6511]</a> Division by scalar should use enable_if&lt;&gt;</li>
+<li><a href="https://svn.boost.org/trac/boost/ticket/7297">[7297]</a> Make the free functions 'num_columns' and 'num_rows' support the uBLAS traits system and better work with expression types</li>
+</ul>
+
+<h3>bug fixes</h3>
+
+<ul>
+<li><a href="https://svn.boost.org/trac/boost/ticket/7296">[7296]</a> fixes and improvements to test utility functions</li>
+<li><a href="https://svn.boost.org/trac/boost/ticket/7363">[7363]</a> fixed coordinate_matrix::sort() for gcc 4.7 and others</li>
+</ul>
+
+<h2>Release 1.43.0</h2>
+
+<h3>bug fixes</h3>
+
+<ul>
+<li><a href="https://svn.boost.org/trac/boost/ticket/3968">[3968]</a> fixed coordinate_matrix sort problem on MSVC10
+</li>
+<li><a href="https://svn.boost.org/trac/boost/ticket/3539">[3539]</a>
+	changed computation of <code>norm_inf</code> for complex types to match
+	mathematical definition. <br />
+	<b>Note:</b> This might cause a performance drop
+	because now <code>std::abs(z)</code> is called for each vector element.
+	The old implementation used <code>std::max(std::abs(real(z)),std::abs(imag(z))</code>.
+	Further <code>norm_inf</code> and <code>norm_1</code> will now return
+	the same values for complex vector.
+</li>
+<li><a href="https://svn.boost.org/trac/boost/ticket/3501">[3501]</a> Moved free functions in <code>concepts.hpp</code> into anonymous namespace.
+</li>
+</ul>
+
+<h2>Release 1.41.1</h2>
+
+<h3>new features</h3>
+
+<ul>
+<li>Move semantics of vector/matrix container assignments have been
+implemented. They can be enabled by setting
+BOOST_UBLAS_MOVE_SEMANTICS. More details are on the <a
+href="options.html">preprocessor options page</a>.
+</li>
+<li>Introduce new free functions. See <a href="https://svn.boost.org/trac/boost/ticket/3449" target="_blank">[3449]</a>, 
+the new tests in <tt>libs/numeric/ublas/test</tt> and the inline documentation of the files in <tt>boost/numeric/ublas/operation/</tt>.
+</li>
+</ul>
+
+<h3>bug fixes</h3>
+
+<ul>
+<li><a href="https://svn.boost.org/trac/boost/ticket/3293">[3293]</a> Fix resizing problem in <code>identity_matrix</code>
+</li>
+<li><a href="https://svn.boost.org/trac/boost/ticket/3499">[3499]</a> Add DefaultConstructible to concept checks
+</li>
+</ul>
+
+<h2>Release 1.40.0 and before</h2>
+<ul>
+<li>Release notes were not available in this form.</li>
+</ul>
+
+<hr />
+<p>Copyright (&copy;) 2000-2009 Joerg Walter, Mathias Koch, Gunter Winkler<br />
+   Use, modification and distribution are subject to the Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<!-- Created: Sun Sep 13 00:57:13 CEST 2009 -->
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+  </body>
+</html>
diff --git a/doc/samples/Jamfile.v2 b/doc/samples/Jamfile.v2
new file mode 100644
index 0000000..55a8e6a
--- /dev/null
+++ b/doc/samples/Jamfile.v2
@@ -0,0 +1,228 @@
+# Copyright Michael Stevens 2004
+
+# Use, modification, and distribution is subject to the Boost Software
+# License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+# bring in rules for testing
+
+# Boost uBLAS library documentation samples
+
+# Project requirements
+project samples
+    : requirements
+      <toolset>borland:<cxxflags>"-w-8026 -w-8027 -w-8057 -w-8084 -w-8092"
+      <toolset>kylix:<cxxflags>"-w-8026 -w-8027 -w-8057 -w-8084 -w-8092"
+    ;
+
+exe unbounded_array
+    : unbounded_array.cpp
+    ;
+
+exe bounded_array
+    : bounded_array.cpp
+    ;
+
+exe range
+    : range.cpp
+    ;
+
+exe slice
+    : slice.cpp
+    ;
+
+exe map_array
+    : map_array.cpp
+    ;
+
+exe vector
+    : vector.cpp
+    ;
+
+exe unit_vector
+    : unit_vector.cpp
+    ;
+
+exe zero_vector
+    : zero_vector.cpp
+    ;
+
+exe mapped_vector
+    : mapped_vector.cpp
+    ;
+
+exe compressed_vector
+    : compressed_vector.cpp
+    ;
+
+exe coordinate_vector
+    : coordinate_vector.cpp
+    ;
+
+exe vector_range
+    : vector_range.cpp
+    ;
+
+exe vector_range_project
+    : vector_range_project.cpp
+    ;
+
+exe vector_slice
+    : vector_slice.cpp
+    ;
+
+exe vector_slice_project
+    : vector_slice_project.cpp
+    ;
+
+exe vector_unary
+    : vector_unary.cpp
+    ;
+
+exe vector_binary
+    : vector_binary.cpp
+    ;
+
+exe vector_binary_outer
+    : vector_binary_outer.cpp
+    ;
+
+exe vector_binary_scalar
+    : vector_binary_scalar.cpp
+    ;
+
+exe vector_unary_redux
+    : vector_unary_redux.cpp
+    ;
+
+exe vector_binary_redux
+    : vector_binary_redux.cpp
+    ;
+
+exe matrix
+    : matrix.cpp
+    ;
+
+exe identity_matrix
+    : identity_matrix.cpp
+    ;
+
+exe zero_matrix
+    : zero_matrix.cpp
+    ;
+
+exe mapped_matrix
+    : mapped_matrix.cpp
+    ;
+
+exe compressed_matrix
+    : compressed_matrix.cpp
+    ;
+
+exe coordinate_matrix
+    : coordinate_matrix.cpp
+    ;
+
+exe matrix_row
+    : matrix_row.cpp
+    ;
+
+exe matrix_row_project
+    : matrix_row_project.cpp
+    ;
+
+exe matrix_column
+    : matrix_column.cpp
+    ;
+
+exe matrix_column_project
+    : matrix_column_project.cpp
+    ;
+
+exe matrix_vector_range
+    : matrix_vector_range.cpp
+    ;
+
+exe matrix_vector_slice
+    : matrix_vector_slice.cpp
+    ;
+
+exe matrix_range
+    : matrix_range.cpp
+    ;
+
+exe matrix_range_project
+    : matrix_range_project.cpp
+    ;
+
+exe matrix_slice
+    : matrix_slice.cpp
+    ;
+
+exe matrix_slice_project
+    : matrix_slice_project.cpp
+    ;
+
+exe matrix_unary
+    : matrix_unary.cpp
+    ;
+
+exe matrix_binary
+    : matrix_binary.cpp
+    : <include>$(BOOST_ROOT)
+    ;
+
+exe matrix_binary_scalar
+    : matrix_binary_scalar.cpp
+    ;
+
+exe matrix_vector_binary
+    : matrix_vector_binary.cpp
+    ;
+
+exe matrix_vector_solve
+    : matrix_vector_solve.cpp
+    ;
+
+exe matrix_matrix_binary
+    : matrix_matrix_binary.cpp
+    ;
+
+exe matrix_matrix_solve
+    : matrix_matrix_solve.cpp
+    ;
+
+exe banded_matrix
+    : banded_matrix.cpp
+    ;
+
+exe banded_adaptor
+    : banded_adaptor.cpp
+    ;
+
+exe hermitian_matrix
+    : hermitian_matrix.cpp
+    ;
+
+exe hermitian_adaptor
+    : hermitian_adaptor.cpp
+    ;
+
+exe symmetric_matrix
+    : symmetric_matrix.cpp
+    ;
+
+exe symmetric_adaptor
+    : symmetric_adaptor.cpp
+    ;
+
+exe triangular_matrix
+    : triangular_matrix.cpp
+    ;
+
+exe triangular_adaptor
+    : triangular_adaptor.cpp
+    ;
+
+exe ex_triangular
+    : ex_triangular.cpp
+    ;
diff --git a/doc/samples/assignment_examples.cpp b/doc/samples/assignment_examples.cpp
new file mode 100644
index 0000000..bfad1f5
--- /dev/null
+++ b/doc/samples/assignment_examples.cpp
@@ -0,0 +1,319 @@
+//
+//  Copyright (c) 2010 Athanasios Iliopoulos
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#include <boost/numeric/ublas/assignment.hpp>
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/vector_proxy.hpp>
+#include <boost/numeric/ublas/matrix_proxy.hpp>
+#include <boost/numeric/ublas/vector_sparse.hpp>
+#include <boost/numeric/ublas/matrix_sparse.hpp>
+#include <boost/numeric/ublas/io.hpp>
+#include <boost/numeric/ublas/matrix.hpp>
+
+using namespace boost::numeric::ublas;
+
+int main() {
+        // Simple vector fill
+    vector<double> a(3);
+    a <<= 0, 1, 2;
+    std::cout << a << std::endl;
+    // [ 0 1 2]
+
+    // Vector from vector
+    vector<double> b(7);
+    b <<= a, 10, a;
+    std::cout << b << std::endl;
+    // [ 0 1 2 10 0 1 2]
+
+    // Simple matrix fill
+    matrix<double> A(3,3);
+    A <<= 0, 1, 2,
+         3, 4, 5,
+         6, 7, 8;
+    std::cout << A << std::endl;
+    // [ 0 1 2 ]
+    // [ 3 4 5 ]
+    // [ 6 7 8 ]
+
+    // Matrix from vector
+    A <<= 0, 1, 2,
+         3, 4, 5,
+         a;
+    std::cout << A << std::endl;
+    // [ 0 1 2 ]
+    // [ 3 4 5 ]
+    // [ 0 1 2 ]
+
+    // Matrix from vector - column assignment
+    A <<= move(0,2), traverse_policy::by_column(),
+         a;
+    std::cout << A << std::endl;
+    // [ 0 1 0 ]
+    // [ 3 4 1 ]
+    // [ 0 1 2 ]
+
+    // Another matrix from vector example (watch the wraping);
+    vector<double> c(9); c <<= 1, 2, 3, 4, 5, 6, 7, 8, 9;
+    A <<= c;
+    std::cout << A << std::endl;
+    // [ 1 2 3 ]
+    // [ 4 5 6 ]
+    // [ 7 8 9 ]
+
+    // If for performance(Benchmarks are not definite about that) or consistency reasons you need to disable wraping:
+    static next_row_manip endr; //This can be defined globally
+    A <<= traverse_policy::by_row_no_wrap(),
+            1, 2, 3, endr,
+            4, 5, 6, endr,
+            7, 8, 9, endr;
+    // [ 1 2 3 ]
+    // [ 4 5 6 ]
+    // [ 7 8 9 ]
+    // If by default you need to disable wraping define
+    // BOOST_UBLAS_DEFAULT_NO_WRAP_POLICY, in the compilation options,
+    // so that you avoid typing the "traverse_policy::by_row_no_wrap()".
+
+    //  Plus and minus assign:
+    A <<= fill_policy::index_plus_assign(),
+         3,2,1;
+    std::cout << A << std::endl;
+    // [ 4 4 4 ]
+    // [ 4 5 6 ]
+    // [ 7 8 9 ]
+
+    // Matrix from proxy
+    A <<= 0, 1, 2,
+         project(b, range(3,6)),
+         a;
+    std::cout << A << std::endl;
+    // [ 0 1 2 ]
+    // [10 0 1 ]
+    // [ 6 7 8 ]
+
+    // Matrix from matrix
+    matrix<double> B(6,6);
+    B <<= A, A,
+         A, A;
+    std::cout << B << std::endl;
+    // [ A A ]
+    // [ A A ]
+
+    // Matrix range (vector is similar)
+    B = zero_matrix<double>(6,6);
+    matrix_range<matrix<double> > mrB (B, range (1, 4), range (1, 4));
+    mrB <<= 1,2,3,4,5,6,7,8,9;
+    std::cout << B << std::endl;
+    // [ 0 0 0 0 0 0]
+    // [ 0 1 2 3 0 0]
+    // [ 0 4 5 6 0 0]
+    // [ 0 0 0 0 0 0]
+    // [ 0 0 0 0 0 0]
+    // [ 0 0 0 0 0 0]
+
+    // Horizontal concatenation can be achieved using this trick:
+    matrix<double> BH(3,9);
+    BH <<= A, A, A;
+    std::cout << BH << std::endl;
+    // [ A A A]
+
+    // Vertical concatenation can be achieved using this trick:
+    matrix<double> BV(9,3);
+    BV <<= A,
+          A,
+          A;
+    std::cout << BV << std::endl;
+    // [ A ]
+    // [ A ]
+    // [ A ]
+
+    // Watch the difference when assigning matrices for different traverse policies:
+    matrix<double> BR(9,9, 0);
+    BR <<= traverse_policy::by_row(), // This is the default, so this might as well be omitted.
+          A, A, A;
+    std::cout << BR << std::endl;
+    // [ A A A]
+    // [ 0 0 0]
+    // [ 0 0 0]
+
+    matrix<double> BC(9,9, 0);
+    BC <<= traverse_policy::by_column(),
+          A, A, A;
+    std::cout << BC << std::endl;
+    // [ A 0 0]
+    // [ A 0 0]
+    // [ A 0 0]
+
+    // The following will throw a run-time exception in debug mode (matrix mid-assignment wrap is not allowed) :
+    // matrix<double> C(7,7);
+    // C <<= A, A, A;
+
+    // Matrix from matrix with index manipulators
+    matrix<double> C(6,6,0);
+    C <<= A, move(3,0), A;
+    // [ A 0 ]
+    // [ 0 A ]
+
+    // A faster way for to construct this dense matrix.
+    matrix<double> D(6,6);
+    D <<= A, zero_matrix<double>(3,3),
+         zero_matrix<double>(3,3), A;
+    // [ A 0 ]
+    // [ 0 A ]
+
+    // The next_row and next_column index manipulators:
+    // note: next_row and next_column functions return
+    // a next_row_manip and and next_column_manip object.
+    // This is the manipulator we used earlier when we disabled
+    // wrapping.
+    matrix<double> E(2,4,0);
+    E <<= 1, 2, next_row(),
+         3, 4, next_column(),5;
+    std::cout << E << std::endl;
+    // [ 1 2 0 5 ]
+    // [ 3 4 0 0 ]
+
+    // The begin1 (moves to the begining of the column) index manipulator, begin2 does the same for the row:
+    matrix<double> F(2,4,0);
+    F <<= 1, 2, next_row(),
+         3, 4, begin1(),5;
+    std::cout << F << std::endl;
+    // [ 1 2 5 0 ]
+    // [ 3 4 0 0 ]
+
+    // The move (relative) and move_to(absolute) index manipulators (probably the most useful manipulators):
+    matrix<double> G(2,4,0);
+    G <<= 1, 2, move(0,1), 3,
+         move_to(1,3), 4;
+    std::cout << G << std::endl;
+    // [ 1 2 0 3 ]
+    // [ 0 0 0 4 ]
+
+    // Static equivallents (faster) when sizes are known at compile time:
+    matrix<double> Gs(2,4,0);
+    Gs <<= 1, 2, move<0,1>(), 3,
+         move_to<1,3>(), 4;
+    std::cout << Gs << std::endl;
+    // [ 1 2 0 3 ]
+    // [ 0 0 0 4 ]
+
+    // Choice of traverse policy (default is "row by row" traverse):
+
+    matrix<double> H(2,4,0);
+    H <<= 1, 2, 3, 4,
+         5, 6, 7, 8;
+    std::cout << H << std::endl;
+    // [ 1 2 3 4 ]
+    // [ 5 6 7 8 ]
+
+    H <<= traverse_policy::by_column(),
+        1, 2, 3, 4,
+        5, 6, 7, 8;
+    std::cout << H << std::endl;
+    // [ 1 3 5 7 ]
+    // [ 2 4 6 8 ]
+
+    // traverse policy can be changed mid assignment if desired.
+     matrix<double> H1(4,4,0);
+     H1 <<= 1, 2, 3, traverse_policy::by_column(), 1, 2, 3;
+
+    std::cout << H << std::endl;
+    // [1 2 3 1]
+    // [0 0 0 2]
+    // [0 0 0 3]
+    // [0 0 0 0]
+
+    // note: fill_policy and traverse_policy are namespaces, so you can use them
+    // by a using statement.
+
+    // For compressed and coordinate matrix types a push_back or insert fill policy can be chosen for faster assginment:
+    compressed_matrix<double> I(2, 2);
+    I <<=    fill_policy::sparse_push_back(),
+            0, 1, 2, 3;
+    std::cout << I << std::endl;
+    // [ 0 1 ]
+    // [ 2 3 ]
+
+    coordinate_matrix<double> J(2,2);
+    J<<=fill_policy::sparse_insert(),
+        1, 2, 3, 4;
+    std::cout << J << std::endl;
+    // [ 1 2 ]
+    // [ 3 4 ]
+
+    // A sparse matrix from another matrix works as with other types.
+    coordinate_matrix<double> K(3,3);
+    K<<=fill_policy::sparse_insert(),
+        J;
+    std::cout << K << std::endl;
+    // [ 1 2 0 ]
+    // [ 3 4 0 ]
+    // [ 0 0 0 ]
+
+    // Be careful this will not work:
+    //compressed_matrix<double> J2(4,4);
+    //J2<<=fill_policy::sparse_push_back(),
+     //   J,J;
+    // That's because the second J2's elements
+    // are attempted to be assigned at positions
+    // that come before the elements already pushed.
+    // Unfortunatelly that's the only thing you can do in this case
+    // (or of course make a custom agorithm):
+    compressed_matrix<double> J2(4,4);
+    J2<<=fill_policy::sparse_push_back(),
+        J, fill_policy::sparse_insert(),
+        J;
+
+    std::cout << J2 << std::endl;
+    // [  J   J  ]
+    // [ 0 0 0 0 ]
+    // [ 0 0 0 0 ]
+
+    // A different traverse policy doesn't change the result, only they order it is been assigned.
+    coordinate_matrix<double> L(3,3);
+    L<<=fill_policy::sparse_insert(), traverse_policy::by_column(),
+        J;
+    std::cout << L << std::endl;
+    // (same as previous)
+    // [ 1 2 0 ]
+    // [ 3 4 0 ]
+    // [ 0 0 0 ]
+
+    typedef coordinate_matrix<double>::size_type cmst;
+    const cmst size = 30;
+    //typedef fill_policy::sparse_push_back spb;
+    // Although the above could have been used the following is may be faster if
+    //  you use the policy often and for relatively small containers.
+    static fill_policy::sparse_push_back spb;
+
+    // A block diagonal sparse using a loop:
+    compressed_matrix<double> M(size, size, 4*15);
+    for (cmst i=0; i!=size; i+=J.size1())
+        M <<= spb, move_to(i,i), J;
+
+
+    // If typedef was used above the last expression should start
+    // with M <<= spb()...
+
+    // Displaying so that blocks can be easily seen:
+    for (unsigned int i=0; i!=M.size1(); i++) {
+        std::cout << M(i,0);
+        for (unsigned int j=1; j!=M.size2(); j++) std::cout << ", " << M(i,j);
+        std::cout << "\n";
+    }
+    // [ J 0 0 0 ... 0]
+    // [ 0 J 0 0 ... 0]
+    // [ 0 . . . ... 0]
+    // [ 0 0 ... 0 0 J]
+
+
+    // A "repeat" trasverser may by provided so that this becomes faster and an on-liner like:
+    // M <<= spb, repeat(0, size, J.size1(), 0, size, J.size1()), J;
+    // An alternate would be to create a :repeater" matrix and vector expression that can be used in other places as well. The latter is probably better,
+    return 0;
+}
+
diff --git a/doc/samples/banded_adaptor.cpp b/doc/samples/banded_adaptor.cpp
new file mode 100644
index 0000000..8aa5a21
--- /dev/null
+++ b/doc/samples/banded_adaptor.cpp
@@ -0,0 +1,25 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/banded.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    banded_adaptor<matrix<double> > ba (m, 1, 1);
+    for (signed i = 0; i < signed (ba.size1 ()); ++ i)
+        for (signed j = (std::max) (i - 1, 0); j < (std::min) (i + 2, signed (ba.size2 ())); ++ j)
+            ba (i, j) = 3 * i + j;
+    std::cout << ba << std::endl;
+}
+
diff --git a/doc/samples/banded_matrix.cpp b/doc/samples/banded_matrix.cpp
new file mode 100644
index 0000000..73746b7
--- /dev/null
+++ b/doc/samples/banded_matrix.cpp
@@ -0,0 +1,24 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/banded.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    banded_matrix<double> m (3, 3, 1, 1);
+    for (signed i = 0; i < signed (m.size1 ()); ++ i)
+        for (signed j = (std::max) (i - 1, 0); j < (std::min) (i + 2, signed (m.size2 ())); ++ j)
+            m (i, j) = 3 * i + j;
+    std::cout << m << std::endl;
+}
+
diff --git a/doc/samples/bounded_array.cpp b/doc/samples/bounded_array.cpp
new file mode 100644
index 0000000..bc827a3
--- /dev/null
+++ b/doc/samples/bounded_array.cpp
@@ -0,0 +1,23 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/storage.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    bounded_array<double, 3> a (3);
+    for (unsigned i = 0; i < a.size (); ++ i) {
+        a [i] = i;
+        std::cout << a [i] << std::endl;
+    }
+}
+
diff --git a/doc/samples/compressed_matrix.cpp b/doc/samples/compressed_matrix.cpp
new file mode 100644
index 0000000..997106e
--- /dev/null
+++ b/doc/samples/compressed_matrix.cpp
@@ -0,0 +1,24 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix_sparse.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    compressed_matrix<double> m (3, 3, 3 * 3);
+    for (unsigned i = 0; i < m.size1 (); ++ i)
+        for (unsigned j = 0; j < m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+    std::cout << m << std::endl;
+}
+
diff --git a/doc/samples/compressed_vector.cpp b/doc/samples/compressed_vector.cpp
new file mode 100644
index 0000000..33353e4
--- /dev/null
+++ b/doc/samples/compressed_vector.cpp
@@ -0,0 +1,23 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector_sparse.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    compressed_vector<double> v (3, 3);
+    for (unsigned i = 0; i < v.size (); ++ i)
+        v (i) = i;
+    std::cout << v << std::endl;
+}
+
diff --git a/doc/samples/coordinate_matrix.cpp b/doc/samples/coordinate_matrix.cpp
new file mode 100644
index 0000000..ee09515
--- /dev/null
+++ b/doc/samples/coordinate_matrix.cpp
@@ -0,0 +1,24 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix_sparse.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    coordinate_matrix<double> m (3, 3, 3 * 3);
+    for (unsigned i = 0; i < m.size1 (); ++ i)
+        for (unsigned j = 0; j < m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+    std::cout << m << std::endl;
+}
+
diff --git a/doc/samples/coordinate_vector.cpp b/doc/samples/coordinate_vector.cpp
new file mode 100644
index 0000000..44893fc
--- /dev/null
+++ b/doc/samples/coordinate_vector.cpp
@@ -0,0 +1,23 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector_sparse.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    coordinate_vector<double> v (3, 3);
+    for (unsigned i = 0; i < v.size (); ++ i)
+        v (i) = i;
+    std::cout << v << std::endl;
+}
+
diff --git a/doc/samples/ex_triangular.cpp b/doc/samples/ex_triangular.cpp
new file mode 100644
index 0000000..a2a34d9
--- /dev/null
+++ b/doc/samples/ex_triangular.cpp
@@ -0,0 +1,58 @@
+//          Copyright Gunter Winkler 2004 - 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+
+#include <iostream>
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/triangular.hpp>
+
+#include <boost/numeric/ublas/io.hpp>
+
+using std::cout;
+using std::endl;
+
+
+
+namespace ublas = boost::numeric::ublas;
+
+
+int main(int argc, char * argv[] ) {
+
+  ublas::matrix<double> M (3, 3);
+  for (std::size_t i=0; i < M.data().size(); ++i) { M.data()[i] = 1+i ; }
+
+  std::cout << "full         M  = " << M << "\n" ;
+
+  ublas::triangular_matrix<double, ublas::lower> L;
+  ublas::triangular_matrix<double, ublas::unit_lower> UL;
+  ublas::triangular_matrix<double, ublas::strict_lower> SL;
+  
+  L  = ublas::triangular_adaptor<ublas::matrix<double>, ublas::lower> (M);
+  SL = ublas::triangular_adaptor<ublas::matrix<double>, ublas::strict_lower> (M); 
+  UL = ublas::triangular_adaptor<ublas::matrix<double>, ublas::unit_lower> (M);  
+  
+  std::cout << "lower        L  = " << L << "\n" 
+            << "strict lower SL = " << SL << "\n" 
+            << "unit lower   UL = " << UL << "\n" ;
+
+  ublas::triangular_matrix<double, ublas::upper> U;
+  ublas::triangular_matrix<double, ublas::unit_upper> UU;
+  ublas::triangular_matrix<double, ublas::strict_upper> SU;
+  
+  U =  ublas::triangular_adaptor<ublas::matrix<double>, ublas::upper> (M);
+  SU = ublas::triangular_adaptor<ublas::matrix<double>, ublas::strict_upper> (M); 
+  UU = ublas::triangular_adaptor<ublas::matrix<double>, ublas::unit_upper> (M);  
+
+  std::cout << "upper        U  = " << U << "\n" 
+            << "strict upper SU = " << SU << "\n" 
+            << "unit upper   UU = " << UU << "\n" ;
+
+  std::cout << "M = L + SU ? " << ((norm_inf( M - (L + SU) ) == 0.0)?"ok":"failed") << "\n";
+  std::cout << "M = U + SL ? " << ((norm_inf( M - (U + SL) ) == 0.0)?"ok":"failed") << "\n";
+
+}
+
+
diff --git a/doc/samples/hermitian_adaptor.cpp b/doc/samples/hermitian_adaptor.cpp
new file mode 100644
index 0000000..889ae4e
--- /dev/null
+++ b/doc/samples/hermitian_adaptor.cpp
@@ -0,0 +1,34 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/hermitian.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<std::complex<double> > m (3, 3);
+    hermitian_adaptor<matrix<std::complex<double> >, lower> hal (m);
+    for (unsigned i = 0; i < hal.size1 (); ++ i) {
+        for (unsigned j = 0; j < i; ++ j)
+            hal (i, j) = std::complex<double> (3 * i + j, 3 * i + j);
+        hal (i, i) = std::complex<double> (4 * i, 0);
+    }
+    std::cout << hal << std::endl;
+    hermitian_adaptor<matrix<std::complex<double> >, upper> hau (m);
+    for (unsigned i = 0; i < hau.size1 (); ++ i) {
+        hau (i, i) = std::complex<double> (4 * i, 0);
+        for (unsigned j = i + 1; j < hau.size2 (); ++ j)
+            hau (i, j) = std::complex<double> (3 * i + j, 3 * i + j);
+    }
+    std::cout << hau << std::endl;
+}
+
diff --git a/doc/samples/hermitian_matrix.cpp b/doc/samples/hermitian_matrix.cpp
new file mode 100644
index 0000000..1a71ad5
--- /dev/null
+++ b/doc/samples/hermitian_matrix.cpp
@@ -0,0 +1,33 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/hermitian.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    hermitian_matrix<std::complex<double>, lower> ml (3, 3);
+    for (unsigned i = 0; i < ml.size1 (); ++ i) {
+        for (unsigned j = 0; j < i; ++ j)
+            ml (i, j) = std::complex<double> (3 * i + j, 3 * i + j);
+        ml (i, i) = std::complex<double> (4 * i, 0);
+    }
+    std::cout << ml << std::endl;
+    hermitian_matrix<std::complex<double>, upper> mu (3, 3);
+    for (unsigned i = 0; i < mu.size1 (); ++ i) {
+        mu (i, i) = std::complex<double> (4 * i, 0);
+        for (unsigned j = i + 1; j < mu.size2 (); ++ j)
+            mu (i, j) = std::complex<double> (3 * i + j, 3 * i + j);
+    }
+    std::cout << mu << std::endl;
+}
+
diff --git a/doc/samples/identity_matrix.cpp b/doc/samples/identity_matrix.cpp
new file mode 100644
index 0000000..0e98683
--- /dev/null
+++ b/doc/samples/identity_matrix.cpp
@@ -0,0 +1,21 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    identity_matrix<double> m (3);
+    std::cout << m << std::endl;
+}
+
diff --git a/doc/samples/map_array.cpp b/doc/samples/map_array.cpp
new file mode 100644
index 0000000..12dc519
--- /dev/null
+++ b/doc/samples/map_array.cpp
@@ -0,0 +1,24 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/storage_sparse.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    map_array<int, double> a;
+    a.reserve (3);
+    for (unsigned i = 0; i < 3; ++ i) {
+        a [i] = i;
+        std::cout << a [i] << std::endl;
+    }
+}
+
diff --git a/doc/samples/mapped_matrix.cpp b/doc/samples/mapped_matrix.cpp
new file mode 100644
index 0000000..92b5ca7
--- /dev/null
+++ b/doc/samples/mapped_matrix.cpp
@@ -0,0 +1,24 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix_sparse.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    mapped_matrix<double> m (3, 3, 3 * 3);
+    for (unsigned i = 0; i < m.size1 (); ++ i)
+        for (unsigned j = 0; j < m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+    std::cout << m << std::endl;
+}
+
diff --git a/doc/samples/mapped_vector.cpp b/doc/samples/mapped_vector.cpp
new file mode 100644
index 0000000..73e6d8f
--- /dev/null
+++ b/doc/samples/mapped_vector.cpp
@@ -0,0 +1,23 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector_sparse.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    mapped_vector<double> v (3, 3);
+    for (unsigned i = 0; i < v.size (); ++ i)
+        v (i) = i;
+    std::cout << v << std::endl;
+}
+
diff --git a/doc/samples/matrix.cpp b/doc/samples/matrix.cpp
new file mode 100644
index 0000000..63d3c7d
--- /dev/null
+++ b/doc/samples/matrix.cpp
@@ -0,0 +1,24 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    for (unsigned i = 0; i < m.size1 (); ++ i)
+        for (unsigned j = 0; j < m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+    std::cout << m << std::endl;
+}
+
diff --git a/doc/samples/matrix_binary.cpp b/doc/samples/matrix_binary.cpp
new file mode 100644
index 0000000..66edf62
--- /dev/null
+++ b/doc/samples/matrix_binary.cpp
@@ -0,0 +1,26 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m1 (3, 3), m2 (3, 3);
+    for (unsigned i = 0; i < (std::min) (m1.size1 (), m2.size1 ()); ++ i)
+        for (unsigned j = 0; j < (std::min) (m1.size2 (), m2.size2 ()); ++ j)
+            m1 (i, j) = m2 (i, j) = 3 * i + j;
+
+    std::cout << m1 + m2 << std::endl;
+    std::cout << m1 - m2 << std::endl;
+}
+
diff --git a/doc/samples/matrix_binary_scalar.cpp b/doc/samples/matrix_binary_scalar.cpp
new file mode 100644
index 0000000..fb3282f
--- /dev/null
+++ b/doc/samples/matrix_binary_scalar.cpp
@@ -0,0 +1,26 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    for (unsigned i = 0; i < m.size1 (); ++ i)
+        for (unsigned j = 0; j < m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+
+    std::cout << 2.0 * m << std::endl;
+    std::cout << m * 2.0 << std::endl;
+}
+
diff --git a/doc/samples/matrix_column.cpp b/doc/samples/matrix_column.cpp
new file mode 100644
index 0000000..9eb0ca4
--- /dev/null
+++ b/doc/samples/matrix_column.cpp
@@ -0,0 +1,27 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/matrix_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    for (unsigned j = 0; j < m.size2 (); ++ j) {
+        matrix_column<matrix<double> > mc (m, j);
+        for (unsigned i = 0; i < mc.size (); ++ i)
+            mc (i) = 3 * i + j;
+        std::cout << mc << std::endl;
+    }
+}
+
diff --git a/doc/samples/matrix_column_project.cpp b/doc/samples/matrix_column_project.cpp
new file mode 100644
index 0000000..d2585c6
--- /dev/null
+++ b/doc/samples/matrix_column_project.cpp
@@ -0,0 +1,26 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/matrix_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    for (unsigned j = 0; j < m.size2 (); ++ j) {
+        for (unsigned i = 0; i < m.size1 (); ++ i)
+            column (m, j) (i) = 3 * i + j;
+        std::cout << column (m, j) << std::endl;
+    }
+}
+
diff --git a/doc/samples/matrix_matrix_binary.cpp b/doc/samples/matrix_matrix_binary.cpp
new file mode 100644
index 0000000..17e33a6
--- /dev/null
+++ b/doc/samples/matrix_matrix_binary.cpp
@@ -0,0 +1,25 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m1 (3, 3), m2 (3, 3);
+    for (unsigned i = 0; i < (std::min) (m1.size1 (), m2.size1 ()); ++ i)
+        for (unsigned j = 0; j < (std::min) (m1.size2 (), m2.size2 ()); ++ j)
+            m1 (i, j) = m2 (i, j) = 3 * i + j;
+
+    std::cout << prod (m1, m2) << std::endl;
+}
+
diff --git a/doc/samples/matrix_matrix_solve.cpp b/doc/samples/matrix_matrix_solve.cpp
new file mode 100644
index 0000000..07d05a3
--- /dev/null
+++ b/doc/samples/matrix_matrix_solve.cpp
@@ -0,0 +1,25 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/triangular.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m1 (3, 3), m2 (3, 3);
+    for (unsigned i = 0; i < (std::min) (m1.size1 (), m2.size1 ()); ++ i)
+        for (unsigned j = 0; j <= i; ++ j)
+            m1 (i, j) = m2 (i, j) = 3 * i + j + 1;
+
+    std::cout << solve (m1, m2, lower_tag ()) << std::endl;
+}
+
diff --git a/doc/samples/matrix_range.cpp b/doc/samples/matrix_range.cpp
new file mode 100644
index 0000000..048ab9f
--- /dev/null
+++ b/doc/samples/matrix_range.cpp
@@ -0,0 +1,26 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/matrix_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    matrix_range<matrix<double> > mr (m, range (0, 3), range (0, 3));
+    for (unsigned i = 0; i < mr.size1 (); ++ i)
+        for (unsigned j = 0; j < mr.size2 (); ++ j)
+            mr (i, j) = 3 * i + j;
+    std::cout << mr << std::endl;
+}
+
diff --git a/doc/samples/matrix_range_project.cpp b/doc/samples/matrix_range_project.cpp
new file mode 100644
index 0000000..3ee095c
--- /dev/null
+++ b/doc/samples/matrix_range_project.cpp
@@ -0,0 +1,25 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/matrix_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    for (unsigned i = 0; i < m.size1 (); ++ i)
+        for (unsigned j = 0; j < m.size2 (); ++ j)
+            project (m, range (0, 3), range (0, 3)) (i, j) = 3 * i + j;
+    std::cout << project (m, range (0, 3), range (0, 3)) << std::endl;
+}
+
diff --git a/doc/samples/matrix_row.cpp b/doc/samples/matrix_row.cpp
new file mode 100644
index 0000000..156c1f5
--- /dev/null
+++ b/doc/samples/matrix_row.cpp
@@ -0,0 +1,27 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/matrix_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    for (unsigned i = 0; i < m.size1 (); ++ i) {
+        matrix_row<matrix<double> > mr (m, i);
+        for (unsigned j = 0; j < mr.size (); ++ j)
+            mr (j) = 3 * i + j;
+        std::cout << mr << std::endl;
+    }
+}
+
diff --git a/doc/samples/matrix_row_project.cpp b/doc/samples/matrix_row_project.cpp
new file mode 100644
index 0000000..6cc3569
--- /dev/null
+++ b/doc/samples/matrix_row_project.cpp
@@ -0,0 +1,26 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/matrix_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    for (unsigned i = 0; i < m.size1 (); ++ i) {
+        for (unsigned j = 0; j < m.size2 (); ++ j)
+            row (m, i) (j) = 3 * i + j;
+        std::cout << row (m, i) << std::endl;
+    }
+}
+
diff --git a/doc/samples/matrix_slice.cpp b/doc/samples/matrix_slice.cpp
new file mode 100644
index 0000000..d3911f6
--- /dev/null
+++ b/doc/samples/matrix_slice.cpp
@@ -0,0 +1,26 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/matrix_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    matrix_slice<matrix<double> > ms (m, slice (0, 1, 3), slice (0, 1, 3));
+    for (unsigned i = 0; i < ms.size1 (); ++ i)
+        for (unsigned j = 0; j < ms.size2 (); ++ j)
+            ms (i, j) = 3 * i + j;
+    std::cout << ms << std::endl;
+}
+
diff --git a/doc/samples/matrix_slice_project.cpp b/doc/samples/matrix_slice_project.cpp
new file mode 100644
index 0000000..0b6150a
--- /dev/null
+++ b/doc/samples/matrix_slice_project.cpp
@@ -0,0 +1,25 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/matrix_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    for (unsigned i = 0; i < m.size1 (); ++ i)
+        for (unsigned j = 0; j < m.size2 (); ++ j)
+            project (m, slice (0, 1, 3), slice (0, 1, 3)) (i, j) = 3 * i + j;
+    std::cout << project (m, slice (0, 1, 3), slice (0, 1, 3)) << std::endl;
+}
+
diff --git a/doc/samples/matrix_unary.cpp b/doc/samples/matrix_unary.cpp
new file mode 100644
index 0000000..044b294
--- /dev/null
+++ b/doc/samples/matrix_unary.cpp
@@ -0,0 +1,30 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<std::complex<double> > m (3, 3);
+    for (unsigned i = 0; i < m.size1 (); ++ i)
+        for (unsigned j = 0; j < m.size2 (); ++ j)
+            m (i, j) = std::complex<double> (3 * i + j, 3 * i + j);
+
+    std::cout << - m << std::endl;
+    std::cout << conj (m) << std::endl;
+    std::cout << real (m) << std::endl;
+    std::cout << imag (m) << std::endl;
+    std::cout << trans (m) << std::endl;
+    std::cout << herm (m) << std::endl;
+}
+
diff --git a/doc/samples/matrix_vector_binary.cpp b/doc/samples/matrix_vector_binary.cpp
new file mode 100644
index 0000000..a53665b
--- /dev/null
+++ b/doc/samples/matrix_vector_binary.cpp
@@ -0,0 +1,29 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    vector<double> v (3);
+    for (unsigned i = 0; i < (std::min) (m.size1 (), v.size ()); ++ i) {
+        for (unsigned j = 0; j < m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+        v (i) = i;
+    }
+
+    std::cout << prod (m, v) << std::endl;
+    std::cout << prod (v, m) << std::endl;
+}
+
diff --git a/doc/samples/matrix_vector_range.cpp b/doc/samples/matrix_vector_range.cpp
new file mode 100644
index 0000000..3a4c7e7
--- /dev/null
+++ b/doc/samples/matrix_vector_range.cpp
@@ -0,0 +1,27 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/matrix_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    for (unsigned i = 0; i < m.size1 (); ++ i)
+        for (unsigned j = 0; j < m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+
+    matrix_vector_range<matrix<double> > mvr (m, range (0, 3), range (0, 3));
+    std::cout << mvr << std::endl;
+}
+
diff --git a/doc/samples/matrix_vector_slice.cpp b/doc/samples/matrix_vector_slice.cpp
new file mode 100644
index 0000000..335c06c
--- /dev/null
+++ b/doc/samples/matrix_vector_slice.cpp
@@ -0,0 +1,27 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/matrix_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    for (unsigned i = 0; i < m.size1 (); ++ i)
+        for (unsigned j = 0; j < m.size2 (); ++ j)
+            m (i, j) = 3 * i + j;
+
+    matrix_vector_slice<matrix<double> > mvs (m, slice (0, 1, 3), slice (0, 1, 3));
+    std::cout << mvs << std::endl;
+}
+
diff --git a/doc/samples/matrix_vector_solve.cpp b/doc/samples/matrix_vector_solve.cpp
new file mode 100644
index 0000000..819856f
--- /dev/null
+++ b/doc/samples/matrix_vector_solve.cpp
@@ -0,0 +1,29 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/triangular.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    vector<double> v (3);
+    for (unsigned i = 0; i < (std::min) (m.size1 (), v.size ()); ++ i) {
+        for (unsigned j = 0; j <= i; ++ j)
+            m (i, j) = 3 * i + j + 1;
+        v (i) = i;
+    }
+
+    std::cout << solve (m, v, lower_tag ()) << std::endl;
+    std::cout << solve (v, m, lower_tag ()) << std::endl;
+}
+
diff --git a/doc/samples/range.cpp b/doc/samples/range.cpp
new file mode 100644
index 0000000..35526ff
--- /dev/null
+++ b/doc/samples/range.cpp
@@ -0,0 +1,22 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/storage.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    range r (0, 3);
+    for (unsigned i = 0; i < r.size (); ++ i) {
+        std::cout << r (i) << std::endl;
+    }
+}
+
diff --git a/doc/samples/slice.cpp b/doc/samples/slice.cpp
new file mode 100644
index 0000000..394251e
--- /dev/null
+++ b/doc/samples/slice.cpp
@@ -0,0 +1,22 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/storage.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    slice s (0, 1, 3);
+    for (unsigned i = 0; i < s.size (); ++ i) {
+        std::cout << s (i) << std::endl;
+    }
+}
+
diff --git a/doc/samples/symmetric_adaptor.cpp b/doc/samples/symmetric_adaptor.cpp
new file mode 100644
index 0000000..4a3f67c
--- /dev/null
+++ b/doc/samples/symmetric_adaptor.cpp
@@ -0,0 +1,30 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/symmetric.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    symmetric_adaptor<matrix<double>, lower> sal (m);
+    for (unsigned i = 0; i < sal.size1 (); ++ i)
+        for (unsigned j = 0; j <= i; ++ j)
+            sal (i, j) = 3 * i + j;
+    std::cout << sal << std::endl;
+    symmetric_adaptor<matrix<double>, upper> sau (m);
+    for (unsigned i = 0; i < sau.size1 (); ++ i)
+        for (unsigned j = i; j < sau.size2 (); ++ j)
+            sau (i, j) = 3 * i + j;
+    std::cout << sau << std::endl;
+}
+
diff --git a/doc/samples/symmetric_matrix.cpp b/doc/samples/symmetric_matrix.cpp
new file mode 100644
index 0000000..c9bed51
--- /dev/null
+++ b/doc/samples/symmetric_matrix.cpp
@@ -0,0 +1,29 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/symmetric.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    symmetric_matrix<double, lower> ml (3, 3);
+    for (unsigned i = 0; i < ml.size1 (); ++ i)
+        for (unsigned j = 0; j <= i; ++ j)
+            ml (i, j) = 3 * i + j;
+    std::cout << ml << std::endl;
+    symmetric_matrix<double, upper> mu (3, 3);
+    for (unsigned i = 0; i < mu.size1 (); ++ i)
+        for (unsigned j = i; j < mu.size2 (); ++ j)
+            mu (i, j) = 3 * i + j;
+    std::cout << mu << std::endl;
+}
+
diff --git a/doc/samples/triangular_adaptor.cpp b/doc/samples/triangular_adaptor.cpp
new file mode 100644
index 0000000..7f7647e
--- /dev/null
+++ b/doc/samples/triangular_adaptor.cpp
@@ -0,0 +1,30 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/triangular.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix<double> m (3, 3);
+    triangular_adaptor<matrix<double>, lower> tal (m);
+    for (unsigned i = 0; i < tal.size1 (); ++ i)
+        for (unsigned j = 0; j <= i; ++ j)
+            tal (i, j) = 3 * i + j;
+    std::cout << tal << std::endl;
+    triangular_adaptor<matrix<double>, upper> tau (m);
+    for (unsigned i = 0; i < tau.size1 (); ++ i)
+        for (unsigned j = i; j < tau.size2 (); ++ j)
+            tau (i, j) = 3 * i + j;
+    std::cout << tau << std::endl;
+}
+
diff --git a/doc/samples/triangular_matrix.cpp b/doc/samples/triangular_matrix.cpp
new file mode 100644
index 0000000..9177233
--- /dev/null
+++ b/doc/samples/triangular_matrix.cpp
@@ -0,0 +1,29 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/triangular.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    triangular_matrix<double, lower> ml (3, 3);
+    for (unsigned i = 0; i < ml.size1 (); ++ i)
+        for (unsigned j = 0; j <= i; ++ j)
+            ml (i, j) = 3 * i + j;
+    std::cout << ml << std::endl;
+    triangular_matrix<double, upper> mu (3, 3);
+    for (unsigned i = 0; i < mu.size1 (); ++ i)
+        for (unsigned j = i; j < mu.size2 (); ++ j)
+            mu (i, j) = 3 * i + j;
+    std::cout << mu << std::endl;
+}
+
diff --git a/doc/samples/unbounded_array.cpp b/doc/samples/unbounded_array.cpp
new file mode 100644
index 0000000..2331f57
--- /dev/null
+++ b/doc/samples/unbounded_array.cpp
@@ -0,0 +1,23 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/storage.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    unbounded_array<double> a (3);
+    for (unsigned i = 0; i < a.size (); ++ i) {
+        a [i] = i;
+        std::cout << a [i] << std::endl;
+    }
+}
+
diff --git a/doc/samples/unit_vector.cpp b/doc/samples/unit_vector.cpp
new file mode 100644
index 0000000..63fc825
--- /dev/null
+++ b/doc/samples/unit_vector.cpp
@@ -0,0 +1,23 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    for (int i = 0; i < 3; ++ i) {
+        unit_vector<double> v (3, i);
+        std::cout << v << std::endl;
+    }
+}
+
diff --git a/doc/samples/vector.cpp b/doc/samples/vector.cpp
new file mode 100644
index 0000000..1f8310c
--- /dev/null
+++ b/doc/samples/vector.cpp
@@ -0,0 +1,23 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector<double> v (3);
+    for (unsigned i = 0; i < v.size (); ++ i)
+        v (i) = i;
+    std::cout << v << std::endl;
+}
+
diff --git a/doc/samples/vector_binary.cpp b/doc/samples/vector_binary.cpp
new file mode 100644
index 0000000..8b42d06
--- /dev/null
+++ b/doc/samples/vector_binary.cpp
@@ -0,0 +1,25 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector<double> v1 (3), v2 (3);
+    for (unsigned i = 0; i < (std::min) (v1.size (), v2.size ()); ++ i)
+        v1 (i) = v2 (i) = i;
+
+    std::cout << v1 + v2 << std::endl;
+    std::cout << v1 - v2 << std::endl;
+}
+
diff --git a/doc/samples/vector_binary_outer.cpp b/doc/samples/vector_binary_outer.cpp
new file mode 100644
index 0000000..094a0a9
--- /dev/null
+++ b/doc/samples/vector_binary_outer.cpp
@@ -0,0 +1,24 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector<double> v1 (3), v2 (3);
+    for (unsigned i = 0; i < (std::min) (v1.size (), v2.size ()); ++ i)
+        v1 (i) = v2 (i) = i;
+
+    std::cout << outer_prod (v1, v2) << std::endl;
+}
+
diff --git a/doc/samples/vector_binary_redux.cpp b/doc/samples/vector_binary_redux.cpp
new file mode 100644
index 0000000..abc3641
--- /dev/null
+++ b/doc/samples/vector_binary_redux.cpp
@@ -0,0 +1,23 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector<double> v1 (3), v2 (3);
+    for (unsigned i = 0; i < (std::min) (v1.size (), v2.size ()); ++ i)
+        v1 (i) = v2 (i) = i;
+
+    std::cout << inner_prod (v1, v2) << std::endl;
+}
+
diff --git a/doc/samples/vector_binary_scalar.cpp b/doc/samples/vector_binary_scalar.cpp
new file mode 100644
index 0000000..8f853e5
--- /dev/null
+++ b/doc/samples/vector_binary_scalar.cpp
@@ -0,0 +1,25 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector<double> v (3);
+    for (unsigned i = 0; i < v.size (); ++ i)
+        v (i) = i;
+
+    std::cout << 2.0 * v << std::endl;
+    std::cout << v * 2.0 << std::endl;
+}
+
diff --git a/doc/samples/vector_range.cpp b/doc/samples/vector_range.cpp
new file mode 100644
index 0000000..bf48c23
--- /dev/null
+++ b/doc/samples/vector_range.cpp
@@ -0,0 +1,25 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/vector_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector<double> v (3);
+    vector_range<vector<double> > vr (v, range (0, 3));
+    for (unsigned i = 0; i < vr.size (); ++ i)
+        vr (i) = i;
+    std::cout << vr << std::endl;
+}
+
diff --git a/doc/samples/vector_range_project.cpp b/doc/samples/vector_range_project.cpp
new file mode 100644
index 0000000..ebe3481
--- /dev/null
+++ b/doc/samples/vector_range_project.cpp
@@ -0,0 +1,24 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/vector_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector<double> v (3);
+    for (int i = 0; i < 3; ++ i)
+        project (v, range (0, 3)) (i) = i;
+    std::cout << project (v, range (0, 3)) << std::endl;
+}
+
diff --git a/doc/samples/vector_slice.cpp b/doc/samples/vector_slice.cpp
new file mode 100644
index 0000000..478631b
--- /dev/null
+++ b/doc/samples/vector_slice.cpp
@@ -0,0 +1,25 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/vector_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector<double> v (3);
+    vector_slice<vector<double> > vs (v, slice (0, 1, 3));
+    for (unsigned i = 0; i < vs.size (); ++ i)
+        vs (i) = i;
+    std::cout << vs << std::endl;
+}
+
diff --git a/doc/samples/vector_slice_project.cpp b/doc/samples/vector_slice_project.cpp
new file mode 100644
index 0000000..a8f1794
--- /dev/null
+++ b/doc/samples/vector_slice_project.cpp
@@ -0,0 +1,24 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/vector_proxy.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector<double> v (3);
+    for (int i = 0; i < 3; ++ i)
+        project (v, slice (0, 1, 3)) (i) = i;
+    std::cout << project (v, slice (0, 1, 3)) << std::endl;
+}
+
diff --git a/doc/samples/vector_unary.cpp b/doc/samples/vector_unary.cpp
new file mode 100644
index 0000000..4d9a8b5
--- /dev/null
+++ b/doc/samples/vector_unary.cpp
@@ -0,0 +1,29 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector<std::complex<double> > v (3);
+    for (unsigned i = 0; i < v.size (); ++ i)
+        v (i) = std::complex<double> (i, i);
+
+    std::cout << - v << std::endl;
+    std::cout << conj (v) << std::endl;
+    std::cout << real (v) << std::endl;
+    std::cout << imag (v) << std::endl;
+    std::cout << trans (v) << std::endl;
+    std::cout << herm (v) << std::endl;
+}
+
diff --git a/doc/samples/vector_unary_redux.cpp b/doc/samples/vector_unary_redux.cpp
new file mode 100644
index 0000000..7de1918
--- /dev/null
+++ b/doc/samples/vector_unary_redux.cpp
@@ -0,0 +1,27 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector<double> v (3);
+    for (unsigned i = 0; i < v.size (); ++ i)
+        v (i) = i;
+
+    std::cout << sum (v) << std::endl;
+    std::cout << norm_1 (v) << std::endl;
+    std::cout << norm_2 (v) << std::endl;
+    std::cout << norm_inf (v) << std::endl;
+    std::cout << index_norm_inf (v) << std::endl;
+}
+
diff --git a/doc/samples/zero_matrix.cpp b/doc/samples/zero_matrix.cpp
new file mode 100644
index 0000000..fbdd8d6
--- /dev/null
+++ b/doc/samples/zero_matrix.cpp
@@ -0,0 +1,21 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    zero_matrix<double> m (3, 3);
+    std::cout << m << std::endl;
+}
+
diff --git a/doc/samples/zero_vector.cpp b/doc/samples/zero_vector.cpp
new file mode 100644
index 0000000..7a4d77d
--- /dev/null
+++ b/doc/samples/zero_vector.cpp
@@ -0,0 +1,21 @@
+//
+//  Copyright (c) 2000-2002
+//  Joerg Walter, Mathias Koch
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  The authors gratefully acknowledge the support of
+//  GeNeSys mbH & Co. KG in producing this work.
+//
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+int main () {
+    using namespace boost::numeric::ublas;
+    zero_vector<double> v (3);
+    std::cout << v << std::endl;
+}
+
diff --git a/doc/storage_concept.html b/doc/storage_concept.html
new file mode 100644
index 0000000..2f30529
--- /dev/null
+++ b/doc/storage_concept.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Storage concept</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Storage concept</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="range"></a>Storage concept</h2>
+<h4>Description</h4>
+<p>Storage is a variable-size container whose elements are arranged in a strict linear order.
+<p>Storage extends the STL Container concept with some STL Sequence-like functionality. The main difference with
+the Sequence concept however is that the Storage concept does not require default-initialisation of its
+elements.
+<h4>Refinement of</h4>
+<a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html">Random Access Container</a>
+and 
+<a href="http://www.sgi.com/tech/stl/DefaultConstructible.html">Default Constructible</a>
+<h4>Associated types</h4>
+No additional types beyond those defined by 
+<a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html">Random Access Container</a>
+<h4>Notation</h4>
+<table summary="storage types">
+<tr><td><tt>X</tt></td><td>A type that is model of Storage</td></tr>
+<tr><td><tt>T</tt></td><td>The value_type of <tt>X</tt></td></tr>
+<tr><td><tt>t</tt></td><td>An object of type <tt>T</tt></td></tr>
+<tr><td><tt>n</tt></td><td>object of type convertible to <tt>X::size_type</tt></td></tr>
+</table>
+<h4>Definitions</h4>
+<h4>Valid expressions</h4>
+In addition to the expressions defined in 
+<a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html">Random Access Container</a>,
+and 
+<a href="http://www.sgi.com/tech/stl/DefaultConstructible.html">Default Constructible</a>
+the following expressions must be valid:
+<table border="1" summary="type requirements">
+<TR><TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH><TH>Return type</TH></TR>
+<TR>
+<td>Size constructor</td>
+<td><tt>X(n)</tt></td>
+<td>T is <a href="http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</a></td>
+<td><tt>X</tt></td>
+</TR>
+<TR>
+<td>Fill constructor</td>
+<td><tt>X(n,t)</tt></td>
+<td></td>
+<td><tt>X</tt></td>
+</TR>
+<TR>
+<TD>Range constructor</TD>
+<TD><tt>X(i, j)</tt></TD>
+<TD><tt>i</tt> and <tt>j</tt> are <A href="http://www.sgi.com/tech/stl/InputIterator.html">Input Iterators</A> whose value type is convertible to <tt>T</tt> </TD>
+<TD><tt>X</tt> </TD>
+</TR>
+<TR>
+<TD>Resize</TD>
+<TD><tt>a.resize(n, t)</tt></TD>
+<TD><tt>a</tt> is mutable</TD>
+<TD><tt>void</tt></TD>
+</TR>
+<TR>
+<TD>Resize</TD>
+<TD><tt>a.resize(n)</tt></TD>
+<TD><tt>a</tt> is mutable</TD>
+<TD><tt>void</tt></TD>
+</tr>
+</table>
+<h3>Expression semantics</h3>
+<table border="1" summary="expresisons">
+<tr><th>Name<th>Expression<th>Precondition<th>Semantics<th>Postcondition
+<tr>
+<td>Default-constructor</td>
+<td><tt>X()</tt>
+<td></td>
+<td>Creates 0 elements. 
+</td>
+<td><tt>size()==0</tt></td>
+</tr>
+<tr>
+<td>Size-constructor</td>
+<td><tt>X(n)</tt>
+<td><tt>n>=0</tt></td>
+<td>Creates n elements. Elements are constructed without an initializer. That is
+if T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is default
+initialized. Otherwise, the object created has indeterminate value. See the sentance
+"If new initializer is omitted" in section 5.3.4 paragraph 15 of the ISO C++ standard.
+</td>
+<td><tt>size()==n</tt></td>
+</tr>
+<tr>
+<td>Fill-constructor</td>
+<td><tt>X(n,t)</tt>
+<td><tt>n>=0</tt></td>
+<td>Creates n initialised element with copies of <code>t</code></td>
+<td><tt>size()==n</tt></td>
+</tr>
+<TR>
+<TD>Range constructor</TD>
+<TD><tt>X(i, j)</tt></TD>
+<TD><tt>[i,j)</tt> is a valid range.</TD>
+<TD>copies the range <tt>[i,j) to the storage</tt></TD>
+<TD><tt>size()</tt> is equal to the distance from <tt>i</tt> to <tt>j</tt>.  Each element is a copy of the corresponding element in the range <tt>[i,j)</tt>.</TD>
+</TR>
+<TR>
+<TD>Resize</TD>
+<TD><tt>a.resize(n, t)</tt></TD>
+<TD><tt>n &lt;= a.max_size()</tt></TD>
+<td>Modified the container so that it has exactly <tt>n</tt> elements.<br />
+The container may be reallocated if its size changes.
+Existing element values are preserved, additional elements are copies of <code>t</code>.</td>
+<TD><tt>a.size() == n</tt></TD>
+</TR>
+<TR>
+<TD>Resize</TD>
+<TD><tt>a.resize(n)</tt></TD>
+<TD><tt>n &lt;= a.max_size()</tt></TD>
+<TD>Modified the container so that it has exactly <tt>n</tt> elements.<br />
+The container may be reallocated if its size changes. Element values are uninitialised. That is,
+each element value may be a previously assigned value or default construced value for <code>T</code>.</TD>
+<TD><tt>a.size() == n</tt></TD>
+</tr>
+</table>
+<h4>Complexity guarantees</h4>
+<h4>Invariants</h4>
+<h4>Models</h4>
+<ul>
+<li><a href="unbounded_array.html">unbounded_array</a>
+<li><a href="bounded_array.html">bounded_array</a>
+</ul>
+<h4>Notes</h4>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/storage_sparse.html b/doc/storage_sparse.html
new file mode 100644
index 0000000..b4899d9
--- /dev/null
+++ b/doc/storage_sparse.html
@@ -0,0 +1,288 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Sparse Storage</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Sparse Storage</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="map_std"></a>Default Standard Map</h2>
+<h4>Description</h4>
+<p>The templated class <code>map_std&lt;I, T, ALLOC&gt;</code> provides a
+wrapper for the standard library associative container
+<code>std::map</code>. The wrapper has one simple purpose. It
+allows the definition of a default template parameter (for the
+adapted array) when declaring the sparse container types.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/storage_sparse.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    map_std&lt;int, double&gt; a (3);
+    for (unsigned i = 0; i &lt; a.size (); ++ i) {
+        a [i] = i;
+        std::cout &lt;&lt; a [i] &lt;&lt; std::endl;
+    }
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header storage_sparse.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>I</code></td>
+<td>The type of index stored in the array.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the array.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>ALLOC</code></td>
+<td>An STL Allocator</td>
+<td>std::allocator</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p>Reversible Container.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of Reversible
+Container.</p>
+<h4>Public base classes</h4>
+<p>std::map</p>
+<h2><a name="map_array"></a>Map Array</h2>
+<h4>Description</h4>
+<p>The templated class <code>map_array&lt;I, T, ALLOC&gt;</code> implements a <code>std::map</code> like associative container as a sorted array. It therefore some of the Associative Container interface without having the same semantics as an std::map.
+<p>At any time the <code>map_array</code> has a capacity up to which new element can be inserted.
+If <code>insert</code> would cause the size of the <code>map_array</code> to exceeds its capactity then it is <strong>reallocated</strong>. Iterators and reference are invalidated.
+The capacity can be directly control using the <code>reserve</code> member function.
+</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/storage_sparse.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    map_array&lt;int, double&gt; a (3);
+    for (unsigned i = 0; i &lt; a.size (); ++ i) {
+        a [i] = i;
+        std::cout &lt;&lt; a [i] &lt;&lt; std::endl;
+    }
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header storage_sparse.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>I</code></td>
+<td>The type of index stored in the array.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the array.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>ALLOC</code></td>
+<td>An STL Allocator</td>
+<td>std::allocator</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p>Reversible Container.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of Reversible
+Container.</p>
+<h4>Public base classes</h4>
+<p>None.</p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>map_array (ALLOC &amp;a = ALLOC())</code></td>
+<td>Allocates a <code>map_array</code> that holds at most zero
+elements.</td>
+</tr>
+<tr>
+<td><code>map_array (const map_array &amp;c)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>~map_array ()</code></td>
+<td>Deallocates the <code>map_array</code> itself.</td>
+</tr>
+<tr>
+<td><code>void reserve (size_type capacity)</code></td>
+<td>
+Changes the<code>map_array</code> capacity. It can hold at most<code>capacity</code> elements without reallocation. The capacity can be reduced such that <code>capacity >= size()</code>. The content of the<code>map_array</code> is preserved.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the <code>map_array</code>.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the capacity of the <code>map_array</code>.</td>
+</tr>
+<tr>
+<td><code>data_reference operator [] (index_type i)</code></td>
+<td>Returns a reference of the element that is associated with a
+particular index. If the <code>map_array</code> does not already
+contain such an element, <code>operator[]</code> inserts the
+default <code>T ()</code>.</td>
+</tr>
+<tr>
+<td><code>map_array &amp;operator = (const map_array
+&amp;a)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>map_array &amp;assign_temporary (map_array
+&amp;a)</code></td>
+<td>Assigns a temporary. May change the array <code>a</code>.</td>
+</tr>
+<tr>
+<td><code>void swap (map_array &amp;a)</code></td>
+<td>Swaps the contents of the arrays.</td>
+</tr>
+<tr>
+<td><code>std::pair<iterator, bool> insert (const value_type
+&amp;p)</code></td>
+<td>Inserts <code>p</code> into the array. The second part of the return value is <code>true</code>
+if <code>p</code> was inserted and <code>false</code> if was not inserted because it was aleady
+present.</td>
+</tr>
+<tr>
+<td><code>iterator insert (iterator it, const value_type
+&amp;p)</code></td>
+<td>Inserts <code>p</code> into the array, using <code>it</code> as
+a hint to where it will be inserted.</td>
+</tr>
+<tr>
+<td><code>void erase (iterator it)</code></td>
+<td>Erases the value at <code>it</code>.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td>Clears the array.</td>
+</tr>
+<tr>
+<td><code>const_iterator find (index_type i) const</code></td>
+<td>Finds an element whose index is <code>i</code>.</td>
+</tr>
+<tr>
+<td><code>iterator find (index_type i)</code></td>
+<td>Finds an element whose index is <code>i</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator lower_bound (index_type i)
+const</code></td>
+<td>Finds the first element whose index is not less than
+<code>i</code> .</td>
+</tr>
+<tr>
+<td><code>iterator lower_bound (index_type i)</code></td>
+<td>Finds the first element whose index is not less than
+<code>i</code> .</td>
+</tr>
+<tr>
+<td><code>const_iterator upper_bound (index_type i)
+const</code></td>
+<td>Finds the first element whose index is greater than
+<code>i</code> .</td>
+</tr>
+<tr>
+<td><code>iterator upper_bound (index_type i)</code></td>
+<td>Finds the first element whose index is greater than
+<code>i</code> .</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>map_array</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>map_array</code>.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the <code>map_array</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+<code>map_array</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>map_array</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>map_array</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the
+beginning of the reversed <code>map_array</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of
+the reversed <code>map_array</code>.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/symmetric.html b/doc/symmetric.html
new file mode 100644
index 0000000..c3693bd
--- /dev/null
+++ b/doc/symmetric.html
@@ -0,0 +1,588 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Symmetric Matrix</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Symmetric Matrix</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="symmetric_matrix"></a>Symmetric Matrix</h2>
+<h4>Description</h4>
+<p>The templated class <code>symmetric_matrix&lt;T, F1, F2,
+A&gt;</code> is the base container adaptor for symmetric matrices.
+For a <em>(n x n</em> )-dimensional symmetric matrix and <em>0
+&lt;= i &lt; n</em>, <em>0 &lt;= j &lt; n</em> holds
+<em>s</em><sub><em>i, j</em></sub> <em>= s</em><sub><em>j,
+i</em></sub>. The storage of symmetric matrices is packed.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/symmetric.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    symmetric_matrix&lt;double, lower&gt; ml (3, 3);
+    for (unsigned i = 0; i &lt; ml.size1 (); ++ i)
+        for (unsigned j = 0; j &lt;= i; ++ j)
+            ml (i, j) = 3 * i + j;
+    std::cout &lt;&lt; ml &lt;&lt; std::endl;
+    symmetric_matrix&lt;double, upper&gt; mu (3, 3);
+    for (unsigned i = 0; i &lt; mu.size1 (); ++ i)
+        for (unsigned j = i; j &lt; mu.size2 (); ++ j)
+            mu (i, j) = 3 * i + j;
+    std::cout &lt;&lt; mu &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header symmetric.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the matrix.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F1</code></td>
+<td>Functor describing the type of the symmetric matrix. <a name=
+"#symmetric_matrix_1">[1]</a></td>
+<td><code>lower</code></td>
+</tr>
+<tr>
+<td><code>F2</code></td>
+<td>Functor describing the storage organization. <a name=
+"#symmetric_matrix_2">[2]</a></td>
+<td><code>row_major</code></td>
+</tr>
+<tr>
+<td><code>A</code></td>
+<td>The type of the adapted array. <a name="#symmetric_matrix_3"
+>[3]</a></td>
+<td><code>unbounded_array&lt;T&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"container_concept.html#matrix">Matrix</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_container&lt;symmetric_matrix&lt;T, F1, F2, A&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>symmetric_matrix (size_type size)</code></td>
+<td>Allocates an uninitialized <code>symmetric_matrix</code> that
+holds <code>size</code> rows of <code>size</code> elements.</td>
+</tr>
+<tr>
+<td><code>symmetric_matrix (const symmetric_matrix
+&amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_matrix (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size, bool preserve =
+true)</code></td>
+<td>Reallocates a <code>symmetric_matrix</code> to hold
+<code>size</code> rows of <code>size</code> elements. The existing
+elements of the <code>symmetric_matrix</code> are preseved when
+specified.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns a <code>const</code> reference of the <code>j</code>
+-th element in the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>symmetric_matrix &amp;operator = (const symmetric_matrix
+&amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>symmetric_matrix &amp;assign_temporary (symmetric_matrix
+&amp;m)</code></td>
+<td>Assigns a temporary. May change the symmetric matrix
+<code>m</code> .</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_matrix &amp;operator = (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_matrix &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the symmetric matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_matrix &amp;operator += (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the symmetric matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_matrix &amp;plus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Adds a matrix expression to the symmetric matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_matrix &amp;operator -= (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the symmetric matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_matrix &amp;minus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Subtracts a matrix expression from the symmetric matrix. Left
+and right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+symmetric_matrix &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the symmetric matrix
+with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+symmetric_matrix &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the symmetric matrix
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (symmetric_matrix &amp;m)</code></td>
+<td>Swaps the contents of the symmetric matrices.</td>
+</tr>
+<tr>
+<td><code>void insert (size_type i, size_type j, const_reference
+t)</code></td>
+<td>Inserts the value <code>t</code> at the <code>j</code>-th
+element of the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void erase (size_type i, size_type j)</code></td>
+<td>Erases the value at the <code>j</code>-th elemenst of the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td>Clears the matrix.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>symmetric_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>symmetric_matrix</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="symmetric_matrix_1">[1]</a>
+Supported parameters for the type of the symmetric matrix are
+<code>lower</code> and <code>upper</code>.</p>
+<p><a name="symmetric_matrix_2">[2]</a>
+Supported parameters for the storage organization are
+<code>row_major</code> and <code>column_major</code>.</p>
+<p><a name="symmetric_matrix_3">[3]</a>
+Supported parameters for the adapted array are
+<code>unbounded_array&lt;T&gt;</code> ,
+<code>bounded_array&lt;T&gt;</code> and
+<code>std::vector&lt;T&gt;</code> .</p>
+<h2><a name="symmetric_adaptor"></a>Symmetric Adaptor</h2>
+<h4>Description</h4>
+<p>The templated class <code>symmetric_adaptor&lt;M, F&gt;</code>
+is a symmetric matrix adaptor for other matrices.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/symmetric.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    symmetric_adaptor&lt;matrix&lt;double&gt;, lower&gt; sal (m);
+    for (unsigned i = 0; i &lt; sal.size1 (); ++ i)
+        for (unsigned j = 0; j &lt;= i; ++ j)
+            sal (i, j) = 3 * i + j;
+    std::cout &lt;&lt; sal &lt;&lt; std::endl;
+    symmetric_adaptor&lt;matrix&lt;double&gt;, upper&gt; sau (m);
+    for (unsigned i = 0; i &lt; sau.size1 (); ++ i)
+        for (unsigned j = i; j &lt; sau.size2 (); ++ j)
+            sau (i, j) = 3 * i + j;
+    std::cout &lt;&lt; sau &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header symmetric.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>M</code></td>
+<td>The type of the adapted matrix.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>Functor describing the type of the symmetric adaptor. <a href=
+"#symmetric_adaptor_1">[1]</a></td>
+<td><code>lower</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;symmetric_adaptor&lt;M, F&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>symmetric_adaptor ()</code></td>
+<td>Constructs a <code>symmetric_adaptor</code> that holds zero
+rows of zero elements.</td>
+</tr>
+<tr>
+<td><code>symmetric_adaptor (matrix_type &amp;data)</code></td>
+<td>Constructs a <code>symmetric_adaptor</code> of a matrix.</td>
+</tr>
+<tr>
+<td><code>symmetric_adaptor (const symmetric_adaptor
+&amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_adaptor (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns a <code>const</code> reference of the <code>j</code>
+-th element in the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>symmetric_adaptor &amp;operator = (const
+symmetric_adaptor &amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>symmetric_adaptor &amp;assign_temporary
+(symmetric_adaptor &amp;m)</code></td>
+<td>Assigns a temporary. May change the symmetric adaptor
+<code>m</code>.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_adaptor &amp;operator = (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_adaptor &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the symmetric adaptor. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_adaptor &amp;operator += (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the symmetric adaptor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_adaptor &amp;plus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Adds a matrix expression to the symmetric adaptor. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_adaptor &amp;operator -= (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the symmetric adaptor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+symmetric_adaptor &amp;minus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Subtracts a matrix expression from the symmetric adaptor. Left
+and right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+symmetric_adaptor &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the symmetric
+adaptor with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+symmetric_adaptor &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the symmetric adaptor
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (symmetric_adaptor &amp;m)</code></td>
+<td>Swaps the contents of the symmetric adaptors.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>symmetric_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>symmetric_adaptor</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="symmetric_adaptor_1">[1]</a>
+Supported parameters for the type of the symmetric adaptor are
+<code>lower</code> and <code>upper</code>.</p>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/triangular.html b/doc/triangular.html
new file mode 100644
index 0000000..865e191
--- /dev/null
+++ b/doc/triangular.html
@@ -0,0 +1,602 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Triangular Matrix</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Triangular Matrix</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="triangular_matrix"></a>Triangular Matrix</h2>
+<h4>Description</h4>
+<p>The templated class <code>triangular_matrix&lt;T, F1, F2,
+A&gt;</code> is the base container adaptor for triangular matrices.
+For a <em>(n x n</em> )-dimensional lower triangular matrix and
+<em>0 &lt;= i &lt; n</em>,<em>0 &lt;= j &lt; n</em> holds
+<em>t</em><sub><em>i, j</em></sub> <em>= 0</em> , if <em>i &gt;
+j</em>. If furthermore holds t<sub><em>i, i</em></sub><em>= 1</em>
+the matrix is called unit lower triangular. For a <em>(n x n</em>
+)-dimensional lower triangular matrix and <em>0 &lt;= i &lt;
+n</em>,<em>0 &lt;= j &lt; n</em> holds <em>t</em><sub><em>i,
+j</em></sub> <em>= 0</em> , if <em>i &lt; j</em>. If furthermore
+holds t<sub><em>i, i</em></sub><em>= 1</em> the matrix is called
+unit lower triangular. The storage of triangular matrices is
+packed.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/triangular.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    triangular_matrix&lt;double, lower&gt; ml (3, 3);
+    for (unsigned i = 0; i &lt; ml.size1 (); ++ i)
+        for (unsigned j = 0; j &lt;= i; ++ j)
+            ml (i, j) = 3 * i + j;
+    std::cout &lt;&lt; ml &lt;&lt; std::endl;
+    triangular_matrix&lt;double, upper&gt; mu (3, 3);
+    for (unsigned i = 0; i &lt; mu.size1 (); ++ i)
+        for (unsigned j = i; j &lt; mu.size2 (); ++ j)
+            mu (i, j) = 3 * i + j;
+    std::cout &lt;&lt; mu &lt;&lt; std::endl;
+}
+</pre>
+<p>Please read the <a href="samples/ex_triangular.cpp">full triangular example</a> for more details.</p>
+
+<h4>Definition</h4>
+<p>Defined in the header triangular.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the matrix.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F1</code></td>
+<td>Functor describing the type of the triangular matrix. <a href=
+"#triangular_matrix_1">[1]</a></td>
+<td><code>lower</code></td>
+</tr>
+<tr>
+<td><code>F2</code></td>
+<td>Functor describing the storage organization. <a href=
+"#triangular_matrix_2">[2]</a></td>
+<td><code>row_major</code></td>
+</tr>
+<tr>
+<td><code>A</code></td>
+<td>The type of the adapted array. <a href=
+"#triangular_matrix_3">[3]</a></td>
+<td><code>unbounded_array&lt;T&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#matrix">Matrix</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"container_concept.html#matrix">Matrix</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_container&lt;triangular_matrix&lt;T, F1, F2, A&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>triangular_matrix ()</code></td>
+<td>Allocates an uninitialized <code>triangular_matrix</code> that
+holds zero rows of zero elements.</td>
+</tr>
+<tr>
+<td><code>triangular_matrix (size_type size1, size_type
+size2)</code></td>
+<td>Allocates an uninitialized <code>triangular_matrix</code> that
+holds <code>size1</code> rows of <code>size2</code> elements.</td>
+</tr>
+<tr>
+<td><code>triangular_matrix (const triangular_matrix
+&amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_matrix (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size1, size_type size2, bool
+preserve = true)</code></td>
+<td>Reallocates a <code>triangular_matrix</code> to hold
+<code>size1</code> rows of <code>size2</code> elements. The
+existing elements of the <code>triangular_matrix</code> are
+preseved when specified.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns a <code>const</code> reference of the <code>j</code>
+-th element in the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>triangular_matrix &amp;operator = (const
+triangular_matrix &amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>triangular_matrix &amp;assign_temporary
+(triangular_matrix &amp;m)</code></td>
+<td>Assigns a temporary. May change the triangular matrix
+<code>m</code>.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_matrix &amp;operator = (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_matrix &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the triangular matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_matrix &amp;operator += (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the triangular matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_matrix &amp;plus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Adds a matrix expression to the triangular matrix. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_matrix &amp;operator -= (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the triangular matrix.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_matrix &amp;minus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Subtracts a matrix expression from the triangular matrix. Left
+and right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+triangular_matrix &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the triangular
+matrix with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+triangular_matrix &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the triangular matrix
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (triangular_matrix &amp;m)</code></td>
+<td>Swaps the contents of the triangular matrices.</td>
+</tr>
+<tr>
+<td><code>void insert (size_type i, size_type j, const_reference
+t)</code></td>
+<td>Inserts the value <code>t</code> at the <code>j</code>-th
+element of the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void erase (size_type i, size_type j)</code></td>
+<td>Erases the value at the <code>j</code>-th elemenst of the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td>Clears the matrix.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>triangular_matrix</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>triangular_matrix</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="triangular_matrix_1">[1]</a>
+Supported parameters for the type of the triangular matrix are
+<code>lower</code> , <code>unit_lower</code>, <code>upper</code>
+and <code>unit_upper</code> .</p>
+<p><a name="triangular_matrix_2">[2]</a>
+Supported parameters for the storage organization are
+<code>row_major</code> and <code>column_major</code>.</p>
+<p><a name="triangular_matrix_3">[3]</a>
+Supported parameters for the adapted array are
+<code>unbounded_array&lt;T&gt;</code> ,
+<code>bounded_array&lt;T&gt;</code> and
+<code>std::vector&lt;T&gt;</code> .</p>
+<h2><a name="triangular_adaptor"></a>Triangular Adaptor</h2>
+<h4>Description</h4>
+<p>The templated class <code>triangular_adaptor&lt;M, F&gt;</code>
+is a triangular matrix adaptor for other matrices.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/triangular.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    matrix&lt;double&gt; m (3, 3);
+    triangular_adaptor&lt;matrix&lt;double&gt;, lower&gt; tal (m);
+    for (unsigned i = 0; i &lt; tal.size1 (); ++ i)
+        for (unsigned j = 0; j &lt;= i; ++ j)
+            tal (i, j) = 3 * i + j;
+    std::cout &lt;&lt; tal &lt;&lt; std::endl;
+    triangular_adaptor&lt;matrix&lt;double&gt;, upper&gt; tau (m);
+    for (unsigned i = 0; i &lt; tau.size1 (); ++ i)
+        for (unsigned j = i; j &lt; tau.size2 (); ++ j)
+            tau (i, j) = 3 * i + j;
+    std::cout &lt;&lt; tau &lt;&lt; std::endl;
+}
+</pre>
+<p>Please read the <a href="samples/ex_triangular.cpp">full triangular example</a> for more details.</p>
+
+<h4>Definition</h4>
+<p>Defined in the header triangular.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>M</code></td>
+<td>The type of the adapted matrix.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>Functor describing the type of the triangular adaptor. <a href=
+"#triangular_adaptor_1">[1]</a></td>
+<td><code>lower</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;triangular_adaptor&lt;M, F&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>triangular_adaptor (matrix_type &amp;data)</code></td>
+<td>Constructs a <code>triangular_adaptor</code> of a matrix.</td>
+</tr>
+<tr>
+<td><code>triangular_adaptor (const triangular_adaptor
+&amp;m)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_adaptor (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns a <code>const</code> reference of the <code>j</code>
+-th element in the <code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i, size_type
+j)</code></td>
+<td>Returns a reference of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>triangular_adaptor &amp;operator = (const
+triangular_adaptor &amp;m)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>triangular_adaptor &amp;assign_temporary
+(triangular_adaptor &amp;m)</code></td>
+<td>Assigns a temporary. May change the triangular adaptor
+<code>m</code>.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_adaptor &amp;operator = (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_adaptor &amp;assign (const matrix_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a matrix expression to the triangular adaptor. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_adaptor &amp;operator += (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Adds the matrix expression to
+the triangular adaptor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_adaptor &amp;plus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Adds a matrix expression to the triangular adaptor. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_adaptor &amp;operator -= (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the matrix expression
+from the triangular adaptor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+triangular_adaptor &amp;minus_assign (const
+matrix_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Subtracts a matrix expression from the triangular adaptor. Left
+and right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+triangular_adaptor &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the triangular
+adaptor with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+triangular_adaptor &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the triangular adaptor
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (triangular_adaptor &amp;m)</code></td>
+<td>Swaps the contents of the triangular adaptors.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 begin1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the beginning of
+the <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator1 end1 ()</code></td>
+<td>Returns a <code>iterator1</code> pointing to the end of the
+<code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 begin2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the beginning of
+the <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>iterator2 end2 ()</code></td>
+<td>Returns a <code>iterator2</code> pointing to the end of the
+<code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rbegin1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the
+beginning of the reversed <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator1 rend1 ()</code></td>
+<td>Returns a <code>reverse_iterator1</code> pointing to the end of
+the reversed <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rbegin2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the
+beginning of the reversed <code>triangular_adaptor</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator2 rend2 ()</code></td>
+<td>Returns a <code>reverse_iterator2</code> pointing to the end of
+the reversed <code>triangular_adaptor</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="triangular_adaptor_1">[1]</a>
+Supported parameters for the type of the triangular adaptor are
+<code>lower</code> , <code>unit_lower</code>, <code>upper</code>
+and <code>unit_upper</code> .</p>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/types_overview.html b/doc/types_overview.html
new file mode 100644
index 0000000..b68a7ce
--- /dev/null
+++ b/doc/types_overview.html
@@ -0,0 +1,580 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta name="GENERATOR" content="Quanta Plus" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Types Overview</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Overview of Matrix- and Vector-Types </h1>
+<div class="toc" id="toc"></div>
+
+<dl>
+<dt>Contents:</dt>
+<dd><a href="#vectors">Vectors</a></dd>
+<dd><a href="#vector_proxies">Vector Proxies</a></dd>
+<dd><a href="#matrices">Matrices</a></dd>
+<dd><a href="#matrix_proxies">Matrix Proxies</a></dd>
+<dd><a href="#storage_layout">Special Storage Layouts</a></dd>
+</dl>
+
+
+<h2>Notation</h2>
+
+<table style="border: none;" summary="notation">
+<tr><td><code>T</code></td> 
+<td>is the data type. For general linear algebra operations this will be a real type e.g. <code>double</code>, ...</td></tr>
+<tr><td><code>F</code></td> 
+<td>is the orientation type (functor), either
+<code>row_major</code> or <code>column_major</code></td></tr>
+<tr><td><code>A, IA, TA</code></td> <td>is an array storage type, e.g. <code>std::vector,
+bounded_array, unbounded_array, ...</code></td></tr>
+<tr><td><code>TRI</code></td> 
+<td>is a triangular functor: <code>lower,
+unit_lower, strict_lower, upper, unit_upper,
+strict_upper</code></td></tr>
+<tr><td><code>M, N</code></td> 
+<td>are unsigned integer sizes 
+(<code>std::size_t</code>)</td></tr>
+<tr><td><code>IB</code></td> 
+<td>is an index base
+(<code>std::size_t</code>)</td></tr>
+<tr><td><code>VEC</code></td> 
+<td>is any vector type</td></tr>
+<tr><td><code>MAT</code> </td>
+<td>is any matrix type</td></tr>
+<tr><td><code>[...]</code></td> 
+<td>denote optional arguments - for more details
+look at the section "storage layout".</td></tr>
+</table>
+
+<h2><a id="vectors">Vectors</a></h2>
+<table border="1" summary="vector types">
+<thead>
+<tr>
+<th width="30%">Definition</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>vector&lt;T [, A]&gt;<br />&nbsp;&nbsp; v(size);</code></td>
+<td>a dense vector of values of type <code>T</code> of variable
+size. A storage type <code>A</code> can be specified
+which defaults to <code>unbounded_array</code>.
+Elements are constructed by <code>A</code>, which need not initialise their value.</td>
+
+</tr>
+<tr>
+<td><code>bounded_vector&lt;T, N&gt;<br />&nbsp;&nbsp; v;</code></td>
+<td>a dense vector of values of type <code>T</code> of variable size but with maximum
+<code>N</code>. The default constructor creates <code>v</code>
+with size <code>N</code>.
+Elements are constructed by the storage type <code>bounded_array</code>, which need not initialise their value.</td>
+</tr>
+<tr>
+<td><code>c_vector&lt;T, M&gt;<br />&nbsp;&nbsp; v(size);</code></td>
+<td>a dense vector of values of type <code>T</code> with the given size.
+The data is stored as an ordinary C++ array <code>T
+data_[M]</code></td>
+</tr>
+<tr>
+<td><code>zero_vector&lt;T&gt;<br />&nbsp;&nbsp; v(size);</code></td>
+<td>the zero vector of type <code>T</code> with the given
+size.</td>
+</tr>
+<tr>
+<td><code>unit_vector&lt;T&gt;<br />&nbsp;&nbsp; v(size,&nbsp;index);</code></td>
+<td>the unit vector of type <code>T</code> with the given size. The
+vector is zero other then a single specified element.
+<br/><code>index</code> should be less than <code>size</code>.</td>
+</tr>
+<tr>
+<td><code>mapped_vector&lt;T [, S]&gt;<br />&nbsp;&nbsp; v(size);</code></td>
+<td>a sparse vector of values of type <code>T</code> of variable
+size. The sparse storage type <code>S</code> can be <code>std::map&lt;size_t,
+T&gt;</code> or <code>map_array&lt;size_t, T&gt;</code>.</td>
+</tr>
+<tr>
+<td><code>compressed_vector&lt;T [,IB, IA, TA]&gt;<br />&nbsp;&nbsp; v(size);</code></td>
+<td>a sparse vector of values of type <code>T</code> of variable
+size. The non zero values are stored as two seperate arrays - an
+index array and a value array. The index array is always sorted and
+there is at most one entry for each index.</td>
+</tr>
+<tr>
+<td><code>coordinate_vector&lt;T [,IB, IA, TA]&gt;<br />&nbsp;&nbsp; v(size);</code></td>
+<td>a sparse vector of values of type <code>T</code> of variable
+size. The non zero values are stored as two seperate arrays - an
+index array and a value array. The arrays may be out of order with
+multiple entries for each vector element. If there are multiple
+values for the same index the sum of these values is the real
+value.</td>
+</tr>
+</tbody>
+</table>
+<p><em>Note:</em> the default types are defined in
+<code>boost/numeric/ublas/fwd.hpp</code>.</p>
+
+<h2><a id="vector_proxies">Vector Proxies</a></h2>
+
+<table border="1" summary="vector proxies">
+<thead>
+<tr>
+<th width="30%">Definition</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>vector_range&lt;VEC&gt;<br />&nbsp;&nbsp; vr(v, range);</code></td>
+<td>a vector referencing a continuous subvector of elements of
+vector <code>v</code> containing all elements specified by
+<code>range</code>.</td>
+</tr>
+<tr>
+<td><code>vector_slice&lt;VEC&gt;<br />&nbsp;&nbsp; vs(v, slice);</code></td>
+<td>a vector referencing a non continuous subvector of elements of
+vector <code>v</code> containing all elements specified by
+<code>slice</code>.</td>
+</tr>
+<tr>
+<td><code>matrix_row&lt;MAT&gt;<br />&nbsp;&nbsp; vr(m, index);</code></td>
+<td>a vector referencing the <code>index</code>-th row of matrix
+<code>m</code></td>
+</tr>
+<tr>
+<td><code>matrix_column&lt;MAT&gt;<br />&nbsp;&nbsp; vc(m, index);</code></td>
+<td>a vector referencing the <code>index</code>-th column of matrix
+<code>m</code></td>
+</tr>
+</tbody>
+</table>
+
+<h2><a id="matrices">Matrices</a></h2>
+
+<table border="1" summary="matrix types">
+<thead>
+<tr>
+<th width="30%">Definition</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>matrix&lt;T [, F, A]&gt;<br />&nbsp;&nbsp; m(size1, size2);</code></td>
+<td>a dense matrix of values of type <code>T</code> of variable
+size.  A storage type <code>A</code> can be specified
+which defaults to <code>unbounded_array</code>.
+The orientation functor <code>F</code> defaults to
+<code>row_major</code>.
+Elements are constructed by <code>A</code>, which need not initialise their value.</td>
+</tr>
+<tr>
+<td><code>bounded_matrix&lt;T, M, N [, F]&gt;<br />&nbsp;&nbsp; m;</code></td>
+<td>a dense matrix of type <code>T</code> with variable size with maximum <code>M</code>-by-<code>N</code>. The orientation functor <code>F</code>
+defaults to <code>row_major</code>. The default constructor creates
+<code>m</code> with size <code>M</code>-by-<code>N</code>.
+Elements are constructed by the storage type <code>bounded_array</code>, which need not initialise their value.</td>
+</tr>
+<tr>
+<td><code>c_matrix&lt;T, M, N&gt;<br />&nbsp;&nbsp; m(size1, size2);</code></td>
+<td>a dense matrix of values of type <code>T</code> with the given size.
+The data is stored as an ordinary C++ array <code>T
+data_[N][M]</code></td>
+</tr>
+<tr>
+<td><code>vector_of_vector&lt;T [, F, A]&gt;<br />&nbsp;&nbsp; m(size1,
+size2);</code></td>
+<td>a dense matrix of values of type <code>T</code> with the given size.
+The data is stored as a vector of vectors. The orientation
+<code>F</code> defaults to <code>row_major</code>. The storage
+type <code>S</code> defaults to
+<code>unbounded_array&lt;unbounded_array&lt;T&gt;&nbsp;&gt;</code></td>
+</tr>
+<tr>
+<td><code>zero_matrix&lt;T&gt;<br />&nbsp;&nbsp; m(size1, size2);</code></td>
+<td>a zero matrix of type <code>T</code> with the given size.</td>
+</tr>
+<tr>
+<td><code>identity_matrix&lt;T&gt;<br />&nbsp;&nbsp; m(size1, size2);</code></td>
+<td>an identity matrix of type <code>T</code> with the given size.
+The values are <code>v(i,j) = (i==j)?T(1):T()</code>.</td>
+</tr>
+<tr>
+<td><code>scalar_matrix&lt;T&gt;<br />&nbsp;&nbsp; m(size1, size2,
+value);</code></td>
+<td>a matrix of type <code>T</code> with the given size that has the
+value <code>value</code> everywhere.</td>
+</tr>
+<tr>
+<td><code>triangular_matrix&lt;T [, TRI, F, A]&gt;<br />&nbsp;&nbsp;
+m(size);</code></td>
+<td>a triangular matrix of values of type <code>T</code> of
+variable size. Only the nonzero elements are stored in the given
+order <code>F</code>. ("triangular packed storage") The triangular
+type <code>F</code> defaults to <code>lower</code>, the orientation
+type <code>F</code> defaults to <code>row_major</code>.</td>
+</tr>
+<tr>
+<td><code>banded_matrix&lt;T [, F, A]&gt;<br />&nbsp;&nbsp; m(size1, size2, n_lower,
+n_upper);</code></td>
+<td>a banded matrix of values of type <code>T</code> of variable
+size with <code>n_lower</code> sub diagonals and
+<code>n_upper</code> super diagonals. Only the nonzero elements are
+stored in the given order <code>F</code>. ("packed storage")</td>
+</tr>
+<tr>
+<td><code>symmetric_matrix&lt;T [, TRI, F, A]&gt;<br />&nbsp;&nbsp;
+m(size);</code></td>
+<td>a symmetric matrix of values of type <code>T</code> of
+variable size. Only the given triangular matrix is stored in the
+given order <code>F</code>.</td>
+</tr>
+<tr>
+<td><code>hermitian_matrix&lt;T [, TRI, F, A]&gt;<br />&nbsp;&nbsp;
+m(size);</code></td>
+<td>a hermitian matrix of values of type <code>T</code> of
+variable size. Only the given triangular matrix is stored using
+the order <code>F</code>.</td>
+</tr>
+<tr>
+<td><code>mapped_matrix&lt;T, [F, S]&gt;<br />&nbsp;&nbsp; m(size1, size2 [,
+non_zeros]);</code></td>
+<td>a sparse matrix of values of type <code>T</code> of variable
+size. The sparse storage type <code>S</code> can be either <code>std::map&lt;size_t,
+std::map&lt;size_t, T&gt;&nbsp;&gt;</code> or
+<code>map_array&lt;size_t, map_array&lt;size_t,
+T&gt;&nbsp;&gt;</code>.</td>
+</tr>
+<tr>
+<td><code>sparse_vector_of_sparse_vector&lt;T, [F, C]&gt;<br />&nbsp;&nbsp; m(size1,
+size2 [, non_zeros]);</code></td>
+<td>a sparse matrix of values of type <code>T</code> of variable
+size.</td>
+</tr>
+<tr>
+<td><code>compressed_matrix&lt;T, [F, IB, IA, TA]&gt;<br />&nbsp;&nbsp; m(size1,
+size2 [, non_zeros]);</code></td>
+<td>a sparse matrix of values of type <code>T</code> of variable
+size. The values are stored in compressed row/column storage.</td>
+</tr>
+<tr>
+<td><code>coordinate_matrix&lt;T, [F, IB, IA, TA]&gt;<br />&nbsp;&nbsp; m(size1,
+size2 [, non_zeros]);</code></td>
+<td>a sparse matrix of values of type <code>T</code> of variable
+size. The values are stored in 3 parallel array as triples (i, j,
+value). More than one value for each pair of indices is possible,
+the real value is the sum of all.</td>
+</tr>
+<tr>
+<td><code>generalized_vector_of_vector&lt;T, F, A&gt;<br />&nbsp;&nbsp; m(size1,
+size2 [, non_zeros]);</code></td>
+<td>a sparse matrix of values of type <code>T</code> of variable
+size. The values are stored as a vector of sparse vectors, e.g.
+<code>generalized_vector_of_vector&lt;double, row_major,
+unbounded_array&lt;coordinate_vector&lt;double&gt;&nbsp;&gt;&nbsp;&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<p><em>Note:</em> the default types are defined in
+<code>boost/numeric/ublas/fwd.hpp</code>.</p>
+
+<h2><a id="matrix_proxies">Matrix Proxies</a></h2>
+
+<table border="1" summary="matrix proxies">
+<thead>
+<tr>
+<th width="30%">Definition</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>triangular_adaptor&lt;MAT, TRI&gt;<br />&nbsp;&nbsp; ta(m);</code></td>
+<td>a triangular matrix referencing a selection of elements of the
+matrix <code>m</code>.</td>
+</tr>
+<tr>
+<td><code>symmetric_adaptor&lt;MAT, TRI&gt;<br />&nbsp;&nbsp; sa(m);</code></td>
+<td>a symmetric matrix referencing a selection of elements of the
+matrix <code>m</code>.</td>
+</tr>
+<tr>
+<td><code>hermitian_adaptor&lt;MAT, TRI&gt;<br />&nbsp;&nbsp; ha(m);</code></td>
+<td>a hermitian matrix referencing a selection of elements of the
+matrix <code>m</code>.</td>
+</tr>
+<tr>
+<td><code>banded_adaptor&lt;MAT&gt;<br />&nbsp;&nbsp; ba(m, n_lower,
+n_upper);</code></td>
+<td>a banded matrix referencing a selection of elements of the
+matrix <code>m</code>.</td>
+</tr>
+<tr>
+<td><code>matrix_range&lt;MAT, TRI&gt;<br />&nbsp;&nbsp; mr(m, range1,
+range2);</code></td>
+<td>a matrix referencing a submatrix of elements in the matrix
+<code>m</code>.</td>
+</tr>
+<tr>
+<td><code>matrix_slice&lt;MAT, TRI&gt;<br />&nbsp;&nbsp; ms(m, slice1,
+slice2);</code></td>
+<td>a matrix referencing a non continues submatrix of elements in
+the matrix <code>m</code>.</td>
+</tr>
+</tbody>
+</table>
+
+
+
+<h2><a id="storage_layout">Special Storage Layouts</a></h2>
+
+
+<p>The library supports conventional dense, packed and basic sparse
+vector and matrix storage layouts. The description of the most
+common constructions of vectors and matrices comes next.</p>
+
+<table border="1" summary="storage layouts">
+<tbody>
+<tr>
+<th width="30%">Construction</th>
+<th>Comment</th>
+</tr>
+<tr>
+<td><code>vector&lt;T,<br />
+&nbsp;std::vector&lt;T&gt; &gt;<br />
+&nbsp;&nbsp;v (size)</code></td>
+<td>a dense vector, storage is provided by a standard
+vector.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>vector&lt;T,<br />
+&nbsp;unbounded_array&lt;T&gt; &gt;<br />
+&nbsp;&nbsp;v (size)</code></td>
+<td>a dense vector, storage is provided by a heap-based
+array.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>vector&lt;T,<br />
+&nbsp;bounded_array&lt;T, N&gt; &gt;<br />
+&nbsp;&nbsp;v (size)</code></td>
+<td>a dense vector, storage is provided by a stack-based
+array.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>mapped_vector&lt;T,<br />
+&nbsp;std::map&lt;std::size_t, T&gt; &gt;<br />
+&nbsp;&nbsp;v (size, non_zeros)</code></td>
+<td>a sparse vector, storage is provided by a standard
+map.</td>
+</tr>
+<tr>
+<td><code>mapped_vector&lt;T,<br />
+&nbsp;map_array&lt;std::size_t, T&gt; &gt;<br />
+&nbsp;&nbsp;v (size, non_zeros)</code></td>
+<td>a sparse vector, storage is provided by a map
+array.</td>
+</tr>
+<tr>
+<td><code>matrix&lt;T,<br />
+&nbsp;row_major,<br />
+&nbsp;std::vector&lt;T&gt; &gt;<br />
+&nbsp;&nbsp;m (size1, size2)</code></td>
+<td>a dense matrix, orientation is row major, storage is
+provided by a standard vector.</td>
+</tr>
+<tr>
+<td><code>matrix&lt;T,<br />
+&nbsp;column_major,<br />
+&nbsp;std::vector&lt;T&gt; &gt;<br />
+&nbsp;&nbsp;m (size1, size2)</code></td>
+<td>a dense matrix, orientation is column major, storage
+is provided by a standard vector.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>matrix&lt;T,<br />
+&nbsp;row_major,<br />
+&nbsp;unbounded_array&lt;T&gt; &gt;<br />
+&nbsp;&nbsp;m (size1, size2)</code></td>
+<td>a dense matrix, orientation is row major, storage is
+provided by a heap-based array.</td>
+</tr>
+<tr>
+<td><code>matrix&lt;T,<br />
+&nbsp;column_major,<br />
+&nbsp;unbounded_array&lt;T&gt; &gt;<br />
+&nbsp;&nbsp;m (size1, size2)</code></td>
+<td>a dense matrix, orientation is column major, storage
+is provided by a heap-based array.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>matrix&lt;T,<br />
+&nbsp;row_major,<br />
+&nbsp;bounded_array&lt;T, N1 * N2&gt; &gt;<br />
+&nbsp;&nbsp;m (size1, size2)</code></td>
+<td>a dense matrix, orientation is row major, storage is
+provided by a stack-based array.</td>
+</tr>
+<tr>
+<td><code>matrix&lt;T,<br />
+&nbsp;column_major,<br />
+&nbsp;bounded_array&lt;T, N1 * N2&gt; &gt;<br />
+&nbsp;&nbsp;m (size1, size2)</code></td>
+<td>a dense matrix, orientation is column major, storage
+is provided by a stack-based array.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>triangular_matrix&lt;T,<br />
+&nbsp;row_major, F, A&gt;<br />
+&nbsp;&nbsp;m (size)</code></td>
+<td>a packed triangular matrix, orientation is row
+major.</td>
+</tr>
+<tr>
+<td><code>triangular_matrix&lt;T,<br />
+&nbsp;column_major, F, A&gt;<br />
+&nbsp;&nbsp;m (size)</code></td>
+<td>a packed triangular matrix, orientation is column
+major.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>banded_matrix&lt;T,<br />
+&nbsp;row_major, A&gt;<br />
+&nbsp;&nbsp;m (size1, size2, lower, upper)</code></td>
+<td>a packed banded matrix, orientation is row
+major.</td>
+</tr>
+<tr>
+<td><code>banded_matrix&lt;T,<br />
+&nbsp;column_major, A&gt;<br />
+&nbsp;&nbsp;m (size1, size2, lower, upper)</code></td>
+<td>a packed banded matrix, orientation is column
+major.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>symmetric_matrix&lt;T,<br />
+&nbsp;row_major, F, A&gt;<br />
+&nbsp;&nbsp;m (size)</code></td>
+<td>a packed symmetric matrix, orientation is row
+major.</td>
+</tr>
+<tr>
+<td><code>symmetric_matrix&lt;T,<br />
+&nbsp;column_major, F, A&gt;<br />
+&nbsp;&nbsp;m (size)</code></td>
+<td>a packed symmetric matrix, orientation is column
+major.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>hermitian_matrix&lt;T,<br />
+&nbsp;row_major, F, A&gt;<br />
+&nbsp;&nbsp;m (size)</code></td>
+<td>a packed hermitian matrix, orientation is row
+major.</td>
+</tr>
+<tr>
+<td><code>hermitian_matrix&lt;T,<br />
+&nbsp;column_major, F, A&gt;<br />
+&nbsp;&nbsp;m (size)</code></td>
+<td>a packed hermitian matrix, orientation is column
+major.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>mapped_matrix&lt;T,<br />
+&nbsp;row_major,<br />
+&nbsp;std::map&lt;std::size_t, T&gt; &gt;<br />
+&nbsp;&nbsp;m (size1, size2, non_zeros)</code></td>
+<td>a sparse matrix, orientation is row major, storage
+is provided by a standard map.</td>
+</tr>
+<tr>
+<td><code>mapped_matrix&lt;T,<br />
+&nbsp;column_major,<br />
+&nbsp;std::map&lt;std::size_t, T&gt; &gt;<br />
+&nbsp;&nbsp;m (size1, size2, non_zeros)</code></td>
+<td>a sparse matrix, orientation is column major,
+storage is provided by a standard map.</td>
+</tr>
+<tr>
+<td><code>mapped_matrix&lt;T,<br />
+&nbsp;row_major,<br />
+&nbsp;map_array&lt;std::size_t, T&gt; &gt;<br />
+&nbsp;&nbsp;m (size1, size2, non_zeros)</code></td>
+<td>a sparse matrix, orientation is row major, storage
+is provided by a map array.</td>
+</tr>
+<tr>
+<td><code>mapped_matrix&lt;T,<br />
+&nbsp;column_major,<br />
+&nbsp;map_array&lt;std::size_t, T&gt; &gt;<br />
+&nbsp;&nbsp;m (size1, size2, non_zeros)</code></td>
+<td>a sparse matrix, orientation is column major,
+storage is provided by a map array.</td>
+</tr>
+<tr>
+<td><code>compressed_matrix&lt;T,<br />
+&nbsp;row_major&gt;<br />
+&nbsp;&nbsp;m (size1, size2, non_zeros)</code></td>
+<td>a compressed matrix, orientation is row major.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>compressed_matrix&lt;T,<br />
+&nbsp;column_major&gt;<br />
+&nbsp;&nbsp;m (size1, size2, non_zeros)</code></td>
+<td>a compressed matrix, orientation is column
+major.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>coordinate_matrix&lt;T,<br />
+&nbsp;row_major&gt;<br />
+&nbsp;&nbsp;m (size1, size2, non_zeros)</code></td>
+<td>a coordinate matrix, orientation is row major.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+<tr>
+<td><code>coordinate_matrix&lt;T,<br />
+&nbsp;column_major&gt;<br />
+&nbsp;&nbsp;m (size1, size2, non_zeros)</code></td>
+<td>a coordinate matrix, orientation is column
+major.<br />
+The storage layout usually is BLAS compliant.</td>
+</tr>
+</tbody>
+</table>
+
+<hr />
+<p>Copyright (&copy;) 2000-2004 Joerg Walter, Mathias Koch, Gunter
+Winkler, Michael Stevens<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/ublas.css b/doc/ublas.css
new file mode 100644
index 0000000..1531be7
--- /dev/null
+++ b/doc/ublas.css
@@ -0,0 +1,59 @@
+/*
+ *  Copyright 2000-2009 Michael Stevens, Mathias Koch, 
+ *  Joerg Walter, Gunter Winkler.
+ *
+ *  Use, modification and distribution are subject to the
+ *  Boost Software License, Version 1.0.
+ *  (See accompanying file LICENSE_1_0.txt
+ *  or copy at http://www.boost.org/LICENSE_1_0.txt).
+ */
+table {
+	border-width: medium;
+	background-color: #F8F8F8;
+	margin: 1em;
+}
+
+td {
+	padding-left: 0.5em;
+	padding-right: 0.5em;
+}
+
+th {
+	text-align: left;
+}
+
+pre.screen {
+	border: 1px solid #DCDCDC;
+	display: block;
+	font-size: 9pt;
+	margin: 1pc 4% 0;
+	padding: 0.5pc;
+}
+
+p.credit {
+	font-style: italic;
+}
+
+@media print {
+	div.toc { display: none; }
+}
+
+div.toc {
+	margin: 10px;
+	padding: 3px;
+}
+
+div#toc ul {
+	list-style: none;
+	margin: 1px;
+	padding-left: 1em;
+	margin-bottom: 0.25em;
+}
+
+div#toc ul li ul {
+	margin-bottom: 0.25em;
+}
+
+div#toc ul li ul li ul {
+	margin-bottom: 0.25em;
+}
\ No newline at end of file
diff --git a/doc/unbounded_array.html b/doc/unbounded_array.html
new file mode 100644
index 0000000..3be0730
--- /dev/null
+++ b/doc/unbounded_array.html
@@ -0,0 +1,219 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Unbounded array</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Unbounded Array Storage</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="unbounded_array"></a>Unbounded Array</h2>
+<h4>Description</h4>
+<p>The templated class <code>unbounded_array&lt;T, ALLOC&gt;</code> implements a unbounded storage array using an allocator. 
+The unbounded array is similar to a <code>std::vector</code> in that in can grow in size beyond any fixed bound. 
+However <code>unbounded_array</code> is aimed at optimal performance. Therefore <code>unbounded_array</code> does not model a 
+<code>Sequence</code> like <code>std::vector</code> does.
+<p>When resized <code>unbounded_array</code> will reallocate it's storage even if the new size requirement is smaller. It is therefore inefficient to resize a <code>unbounded_array</code></p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/storage.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    unbounded_array&lt;double&gt; a (3);
+    for (unsigned i = 0; i &lt; a.size (); ++ i) {
+        a [i] = i;
+        std::cout &lt;&lt; a [i] &lt;&lt; std::endl;
+    }
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header storage.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the array.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>ALLOC</code></td>
+<td>An STL Allocator</td>
+<td>std::allocator</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="storage_concept.html">Storage</a></p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of Storage.</p>
+<h4>Public base classes</h4>
+<p>None.</p>
+<h4>Members</h4>
+<ul>
+<li>The description does not describe what the member actually does, this can be looked up
+in the corresponding concept documentation, but instead contains a remark on the implementation of the
+member inside this model of the concept.</li>
+<li>Typography:
+<ul>
+<li>Members that are not part of the implemented concepts are <font color="blue">in blue</font>.</li>
+</ul>
+</li>
+</ul>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Where defined</th>
+<th>Description</th>
+</tr>
+<tr><td><code>value_type</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td></tr>
+<tr><td><code>pointer</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>value_type*</code></td></tr>
+<tr><td><code>const_pointer</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>const value_type*</code></td></tr>
+<tr><td><code>reference</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>value_type&amp;</code></td></tr>
+<tr><td><code>const_reference</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>const value_type&amp;</code></td></tr>
+<tr><td><code>size_type</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>Alloc::size_type</code></td></tr>
+<tr><td><code>difference_type</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>Alloc::difference_type</code></td></tr>
+<tr><td><code>iterator</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>pointer</code></td></tr>
+<tr><td><code>const_iterator</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>const_pointer</code></td></tr>
+<tr><td><code>revere_iterator</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>std::reverse_iterator&lt;iterator&gt;</code></td></tr>
+<tr><td><code>const_revere_iterator</code></td><td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td><td>Defined as <code>std::reverse_iterator&lt;const_iterator&gt;</code></td></tr>
+<tr><td><font color="blue">allocator_type</font></td><td></td><td>Defined as ALLOC</td></tr>
+<tr>
+<td><code><em>explicit</em> unbounded_array (<em>ALLOC &amp;a = ALLOC()</em>)</code></td>
+<td><a href="storage_concept.html">Storage</a></td>
+<td>Creates an <code>unbounded_array</code> that holds zero elements, using a specified allocator.</td> 
+</tr>
+<tr>
+<td><code><em>explicit</em> unbounded_array (size_type size<em>, ALLOC &amp;a = ALLOC()</em>)</code></td>
+<td><a href="storage_concept.html">Storage</a></td>
+<td>Creates a uninitialized <code>unbounded_array</code> that holds <code>size</code> elements, using a specified allocator. All the elements are default constructed.</td>
+</tr>
+<tr>
+<td><code>unbounded_array (size_type size, const T&amp; init<em>, ALLOC&amp; a = ALLOC()</em>)</code></td>
+<td><a href="storage_concept.html">Storage</a></td>
+<td>Creates an initialized <code>unbounded_array</code> that holds <code>size</code> elements, using a specified allocator. All the elements are constructed from the <code>init</code> value.</td>
+</tr>
+<tr>
+<td><code>unbounded_array (const unbounded_array &amp;a)</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>~unbounded_array ()</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Deallocates the <code>unbounded_array</code> itself.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type n)</code></td>
+<td><a href="storage_concept.html">Storage</a></td>
+<td>Reallocates an <code>unbounded_array</code> to hold <code>n</code> elements. Values are uninitialised.</td>
+</tr>
+<tr>
+<td><code>void resize(size_type n, const T&amp; t)</code></td>
+<td><a href="storage_concept.html">Storage</a></td>
+<td>Reallocates an <code>unbounded_array</code> to hold <code>n</code> elements. Values are copies of <code>t</code> 
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns the size of the <code>unbounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i) const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns a <code>const</code> reference of the <code>i</code> -th element.</td>
+</tr>
+<tr>
+<td><code>reference operator [] (size_type i)</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>unbounded_array &amp;operator = (const unbounded_array &amp;a)</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><font color="blue"><code>unbounded_array &amp;assign_temporary (unbounded_array &amp;a)</code></font></td>
+<td></td>
+<td>Assigns a temporary. May change the array <code>a</code>.</td>
+</tr>
+<tr>
+<td><code>void swap (unbounded_array &amp;a)</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Swaps the contents of the arrays.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>unbounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>unbounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the <code>unbounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td><a href="http://www.sgi.com/tech/stl/Container.html">Container</a></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+<code>unbounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/ReversibleContainer.html">Reversible Container</a></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the beginning of the reversed <code>unbounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/ReversibleContainer.html">Reversible Container</a></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the end of the reversed <code>unbounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td><a href="http://www.sgi.com/tech/stl/ReversibleContainer.html">Reversible Container</a></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the beginning of the reversed <code>unbounded_array</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td><a href="http://www.sgi.com/tech/stl/ReversibleContainer.html">Reversible Container</a></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of the reversed <code>unbounded_array</code>.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/vector.html b/doc/vector.html
new file mode 100644
index 0000000..2f9569d
--- /dev/null
+++ b/doc/vector.html
@@ -0,0 +1,755 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Vector</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Vector</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="vector"></a>Vector</h2>
+<h4>Description</h4>
+<p>The templated class <code>vector&lt;T, A&gt;</code> is the base
+container adaptor for dense vectors. For a <em>n</em>-dimensional
+vector and <em>0 &lt;= i &lt; n</em> every element
+<em>v</em><sub><em>i</em></sub> is mapped to the <em>i-</em>th
+element of the container.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector&lt;double&gt; v (3);
+    for (unsigned i = 0; i &lt; v.size (); ++ i)
+        v (i) = i;
+    std::cout &lt;&lt; v &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header vector.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the vector.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>A</code></td>
+<td>The type of the <a href="storage_concept.html">Storage</a> array. <a href="#vector_1">[1]</a></td>
+<td><code>unbounded_array&lt;T&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#vector">Vector</a>,
+<a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html">RandomAccessContainer</a>
+</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"container_concept.html#vector">Vector</a>
+and <a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html">RandomAccessContainer</a>.</p>
+<h4>Public base classes</h4>
+<p><code>vector_container&lt;vector&lt;T, A&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Where defined</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>value_type</code>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td></td>
+</tr>
+<tr>
+<td><code>reference</code>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td></td>
+</tr>
+<tr>
+<td><code>const_reference</code>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td></td>
+</tr>
+<tr>
+<td><code>size_type</code>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td></td>
+</tr>
+<tr>
+<td><code>difference_type</code>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td></td>
+</tr>
+<tr>
+<td><code>const_iterator</code>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td></td>
+</tr>
+<tr>
+<td><code>iterator</code>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td></td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator</code>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td></td>
+</tr>
+<tr>
+<td><code>reverse_iterator</code>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td></td>
+</tr>
+<tr>
+<td><code>array_type</code>
+<td><a href="container_concept.html#vector">Vector</a></td>
+<td></td>
+</tr>
+<tr>
+<td><code>vector ()</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Allocates an uninitialized <code>vector</code> that holds zero
+elements.</td>
+</tr>
+<tr>
+<td><code>vector (size_type size)</code></td>
+<td><a href="container_concept.html#vector">Vector</a></td>
+<td>Allocates an uninitialized <code>vector</code> that holds
+<code>size</code> elements.</td>
+</tr>
+<tr>
+<td><code>vector (const vector &amp;v)</code></td>
+<td></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector (const vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size, bool preserve =
+true)</code></td>
+<td><a href="container_concept.html#vector">Vector</a></td>
+<td>Reallocates a <code>vector</code> to hold <code>size</code>
+elements. The existing elements of the <code>vector</code> are
+preseved when specified.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Returns the size of the <code>vector</code>.</td>
+</tr>
+<tr>
+<td><code>size_type max_size () const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html">RandomAccessContainer</a></td>
+<td>Returns the upper bound on the size of the <code>vector</code>.</td>
+</tr>
+<tr>
+<td><code>bool empty () const</code></td>
+<td><a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html">RandomAccessContainer</a></td>
+<td>Equivilent to <code>size () == 0</code>.</td>
+</tr>
+<tr>
+<td><code>const array_type&amp; data () const</code></td>
+<td><a href="container_concept.html#vector">Vector</a></td>
+<td></td>
+</tr>
+<tr>
+<td><code>array_type&amp; data ()</code></td>
+<td><a href="container_concept.html#vector">Vector</a></td>
+<td></td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Returns a <code>const</code> reference of the <code>i</code>
+-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i)</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i) const</code></td>
+<td><a href="container_concept.html#vector">Vector</a></td>
+<td>Returns a <code>const</code> reference of the <code>i</code>
+-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator [] (size_type i)</code></td>
+<td><a href="container_concept.html#vector">Vector</a></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>vector &amp;operator = (const vector &amp;v)</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>vector &amp;assign_temporary (vector &amp;v)</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Assigns a temporary. May change the vector <code>v</code>.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector &amp;operator = (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector &amp;assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Assigns a vector expression to the vector. Left and right hand
+side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector &amp;operator += (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>A computed assignment operator. Adds the vector expression to
+the vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector &amp;plus_assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Adds a vector expression to the vector. Left and right hand
+side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector &amp;operator -= (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>A computed assignment operator. Subtracts the vector expression
+from the vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector &amp;minus_assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Subtracts a vector expression from the vector. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+vector &amp;operator *= (const AT &amp;at)</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>A computed assignment operator. Multiplies the vector with a
+scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+vector &amp;operator /= (const AT &amp;at)</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>A computed assignment operator. Divides the vector through a
+scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (vector &amp;v)</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Swaps the contents of the vectors.</td>
+</tr>
+<tr>
+<td><code>void insert_element (size_type i, const_reference t)</code></td>
+<td><a href="container_concept.html#vector">Vector</a></td>
+<td>Inserts the value <code>t</code> at the <code>i</code>-th
+element.</td>
+</tr>
+<tr>
+<td><code>void erase_element (size_type i)</code></td>
+<td><a href="container_concept.html#vector">Vector</a></td>
+<td>Erases the value at the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td><a href="container_concept.html#vector">Vector</a></td>
+<td>Clears the vector.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>vector</code>.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the <code>vector</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+<code>vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>vector</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the
+beginning of the reversed <code>vector</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td><a href="expression_concept.html#vector_expression">VectorExpression</a></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of
+the reversed <code>vector</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="vector_1">[1]</a> Common parameters
+for the Storage array are <code>unbounded_array&lt;T&gt;</code> ,
+<code>bounded_array&lt;T&gt;</code> and
+<code>std::vector&lt;T&gt;</code> .</p>
+<h2><a name="unit_vector"></a>Unit Vector</h2>
+<h4>Description</h4>
+<p>The templated class <code>unit_vector&lt;T, ALLOC&gt;</code> represents
+canonical unit vectors. For the <em>k</em>-th
+<em>n</em>-dimensional canonical unit vector and <em>0 &lt;= i &lt;
+n</em> holds <em>u</em><sup><em>k</em></sup><sub><em>i</em></sub>
+<em>= 0</em>, if <em>i &lt;&gt; k</em>, and
+<em>u</em><sup><em>k</em></sup><sub><em>i</em></sub> <em>=
+1</em>.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    for (int i = 0; i &lt; 3; ++ i) {
+        unit_vector&lt;double&gt; v (3, i);
+        std::cout &lt;&lt; v &lt;&lt; std::endl;
+    }
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header vector.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the vector.</td>
+<td><code>int</code></td>
+</tr>
+<tr>
+<td><code>ALLOC</code></td>
+<td>An STL Allocator for size_type and difference_type.</td>
+<td>std::allocator</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#vector">Vector</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of
+<a href="container_concept.html#vector">Vector</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_container&lt;unit_vector&lt;T&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>unit_vector ()</code></td>
+<td>Constructs an <code>unit_vector</code> that holds zero
+elements.</td>
+</tr>
+<tr>
+<td><code>unit_vector (size_type size, size_type index)</code></td>
+<td>Constructs the <code>index</code>-th <code>unit_vector</code>
+that holds <code>size</code> elements.</td>
+</tr>
+<tr>
+<td><code>unit_vector (const unit_vector &amp;v)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size, bool preserve =
+true)</code></td>
+<td>Resizes a <code>unit_vector</code> to hold <code>size</code>
+elements. Therefore the existing elements of the
+<code>unit_vector</code> are always preseved.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the <code>unit_vector</code>.</td>
+</tr>
+<tr>
+<td><code>size_type index () const</code></td>
+<td>Returns the index of the <code>unit_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>unit_vector &amp;operator = (const unit_vector
+&amp;v)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>unit_vector &amp;assign_temporary (unit_vector
+&amp;v)</code></td>
+<td>Assigns a temporary. May change the unit vector <code>v</code>
+.</td>
+</tr>
+<tr>
+<td><code>void swap (unit_vector &amp;v)</code></td>
+<td>Swaps the contents of the unit vectors.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>unit_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>unit_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>unit_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>unit_vector</code>.</td>
+</tr>
+</tbody>
+</table>
+<h2><a name="zero_vector"></a>Zero Vector</h2>
+<h4>Description</h4>
+<p>The templated class <code>zero_vector&lt;T, ALLOC&gt;</code> represents
+zero vectors. For a <em>n</em>-dimensional zero vector and <em>0
+&lt;= i &lt; n</em> holds <em>z</em><sub><em>i</em></sub> <em>=
+0</em>.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    zero_vector&lt;double&gt; v (3);
+    std::cout &lt;&lt; v &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header vector.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the vector.</td>
+<td><code>int</code></td>
+</tr>
+<tr>
+<td><code>ALLOC</code></td>
+<td>An STL Allocator for size_type and difference_type.</td>
+<td>std::allocator</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#vector">Vector</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of
+<a href="container_concept.html#vector">Vector</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_container&lt;zero_vector&lt;T&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>zero_vector ()</code></td>
+<td>Constructs a <code>zero_vector</code> that holds zero
+elements.</td>
+</tr>
+<tr>
+<td><code>zero_vector (size_type size)</code></td>
+<td>Constructs a <code>zero_vector</code> that holds
+<code>size</code> elements.</td>
+</tr>
+<tr>
+<td><code>zero_vector (const zero_vector &amp;v)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size, bool preserve =
+true)</code></td>
+<td>Resizes a <code>zero_vector</code> to hold <code>size</code>
+elements. Therefore the existing elements of the
+<code>zero_vector</code> are always preseved.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the <code>zero_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>zero_vector &amp;operator = (const zero_vector
+&amp;v)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>zero_vector &amp;assign_temporary (zero_vector
+&amp;v)</code></td>
+<td>Assigns a temporary. May change the zero vector <code>v</code>
+.</td>
+</tr>
+<tr>
+<td><code>void swap (zero_vector &amp;v)</code></td>
+<td>Swaps the contents of the zero vectors.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>zero_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>zero_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>zero_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>zero_vector</code>.</td>
+</tr>
+</tbody>
+</table>
+<h2><a name="scalar_vector"></a>Scalar Vector</h2>
+<h4>Description</h4>
+<p>The templated class <code>scalar_vector&lt;T, ALLOC&gt;</code>
+represents scalar vectors. For a <em>n</em>-dimensional scalar
+vector and <em>0 &lt;= i &lt; n</em> holds
+<em>z</em><sub><em>i</em></sub> <em>= s</em>.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    scalar_vector&lt;double&gt; v (3);
+    std::cout &lt;&lt; v &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header vector.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the vector.</td>
+<td><code>int</code></td>
+</tr>
+<tr>
+<td><code>ALLOC</code></td>
+<td>An STL Allocator for size_type and difference_type.</td>
+<td>std::allocator</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#vector">Vector</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of
+<a href="container_concept.html#vector">Vector</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_container&lt;scalar_vector&lt;T&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>scalar_vector ()</code></td>
+<td>Constructs a <code>scalar_vector</code> that holds zero
+elements.</td>
+</tr>
+<tr>
+<td><code>scalar_vector (size_type size, const value_type
+&amp;value)</code></td>
+<td>Constructs a <code>scalar_vector</code> that holds
+<code>size</code> elements each of the specified value.</td>
+</tr>
+<tr>
+<td><code>scalar_vector (const scalar_vector &amp;v)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size, bool preserve =
+true)</code></td>
+<td>Resizes a <code>scalar_vector</code> to hold <code>size</code>
+elements. Therefore the existing elements of the
+<code>scalar_vector</code> are always preseved.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the <code>scalar_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>scalar_vector &amp;operator = (const scalar_vector
+&amp;v)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>scalar_vector &amp;assign_temporary (scalar_vector
+&amp;v)</code></td>
+<td>Assigns a temporary. May change the scalar vector
+<code>v</code> .</td>
+</tr>
+<tr>
+<td><code>void swap (scalar_vector &amp;v)</code></td>
+<td>Swaps the contents of the scalar vectors.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>scalar_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>scalar_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>scalar_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>scalar_vector</code>.</td>
+</tr>
+</tbody>
+</table>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/vector_expression.html b/doc/vector_expression.html
new file mode 100644
index 0000000..7838007
--- /dev/null
+++ b/doc/vector_expression.html
@@ -0,0 +1,969 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Vector Expressions</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Vector Expressions</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="vector_expression"></a>Vector Expression</h2>
+<h4>Description</h4>
+<p>The templated class <code>vector_expression&lt;E&gt;</code>
+is required to be a public base of all classes which model the Vector Expression concept.</p>
+<h4>Definition</h4>
+<p>Defined in the header expression_types.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E</code></td>
+<td>The type of the vector expression.</td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p>None. <u>Not a Vector Expression</u>!
+</p>
+<h4>Type requirements</h4>
+<p>None.</p>
+<h4>Public base classes</h4>
+<p>None.</p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>const expression_type &amp;operator () ()
+const</code></td>
+<td>Returns a <code>const</code> reference of the expression.</td>
+</tr>
+<tr>
+<td><code>expression_type &amp;operator () ()</code></td>
+<td>Returns a reference of the expression.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p>The <code>range</code>, <code>slice</code> and <code>project</code> functions have been removed. Use the free functions defined in <a href="vector_proxy.html">vector proxy</a> instead.</p>
+
+<h2><a name="vector_container"></a>Vector Container</h2>
+<h4>Description</h4>
+<p>The templated class <code>vector_container&lt;C&gt;</code>
+is required to be a public base of all classes which model the Vector concept.
+This includes the class <code>vector</code> itself.</p>
+<h4>Definition</h4>
+<p>Defined in the header expression_types.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>C</code></td>
+<td>The type of the vector container.</td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p>None. <u>Not a Vector Expression OR Vector</u>!
+</p>
+<h4>Type requirements</h4>
+<p>None.</p>
+<h4>Public base classes</h4>
+<p><code>vector_expression&lt;C&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>const container_type &amp;operator () ()
+const</code></td>
+<td>Returns a <code>const</code> reference of the container.</td>
+</tr>
+<tr>
+<td><code>container_type &amp;operator () ()</code></td>
+<td>Returns a reference of the container.</td>
+</tr>
+</tbody>
+</table>
+
+<h2><a name="vector_references"></a>Vector References</h2>
+<h3>Reference</h3>
+<h4>Description</h4>
+<p>The templated class <code>vector_reference&lt;E&gt;</code>
+contains a reference to a vector expression.</p>
+<h4>Definition</h4>
+<p>Defined in the header vector_expression.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E</code></td>
+<td>The type of the vector expression.</td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_expression&lt;vector_reference&lt;E&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>vector_reference (expression_type &amp;e)</code></td>
+<td>Constructs a reference of the expression.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size)</code></td>
+<td>Resizes the expression to hold at most <code>size</code>
+elements.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the expression.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the expression.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of
+the reversed expression.</td>
+</tr>
+</tbody>
+</table>
+<h2><a name="vector_operations"></a>Vector Operations</h2>
+<h3>Unary Operation Description</h3>
+<h4>Description</h4>
+<p>The templated class <code>vector_unary&lt;E, F&gt;</code>
+describes a unary vector operation.</p>
+<h4>Definition</h4>
+<p>Defined in the header vector_expression.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E</code></td>
+<td>The type of the vector expression.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>The type of the operation.</td>
+<td>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_expression&lt;vector_unary&lt;E, F&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>vector_unary (const expression_type &amp;e)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the expression.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+</tbody>
+</table>
+<h3>Unary Operations</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class E, class F&gt;
+    struct vector_unary_traits {
+        typedef vector_unary&lt;typename E::const_closure_type, F&gt; expression_type;
+        typedef expression_type result_type;
+     };
+
+    // (- v) [i] = - v [i]
+    template&lt;class E&gt;
+     typename vector_unary_traits&lt;E, scalar_negate&lt;typename E::value_type&gt; &gt;::result_type
+    operator - (const vector_expression&lt;E&gt; &amp;e);
+
+    // (conj v) [i] = conj (v [i])
+    template&lt;class E&gt;
+     typename vector_unary_traits&lt;E, scalar_conj&lt;typename E::value_type&gt; &gt;::result_type
+    conj (const vector_expression&lt;E&gt; &amp;e);
+
+    // (real v) [i] = real (v [i])
+    template&lt;class E&gt;
+     typename vector_unary_traits&lt;E, scalar_real&lt;typename E::value_type&gt; &gt;::result_type
+    real (const vector_expression&lt;E&gt; &amp;e);
+
+    // (imag v) [i] = imag (v [i])
+    template&lt;class E&gt;
+     typename vector_unary_traits&lt;E, scalar_imag&lt;typename E::value_type&gt; &gt;::result_type
+    imag (const vector_expression&lt;E&gt; &amp;e);
+
+    // (trans v) [i] = v [i]
+    template&lt;class E&gt;
+     typename vector_unary_traits&lt;E, scalar_identity&lt;typename E::value_type&gt; &gt;::result_type
+    trans (const vector_expression&lt;E&gt; &amp;e);
+
+    // (herm v) [i] = conj (v [i])
+    template&lt;class E&gt;
+     typename vector_unary_traits&lt;E, scalar_conj&lt;typename E::value_type&gt; &gt;::result_type
+    herm (const vector_expression&lt;E&gt; &amp;e);</code>
+</pre>
+<h4>Description</h4>
+<p><code>operator -</code> computes the additive inverse of a
+vector expression. <code>conj</code> computes the complex conjugate
+of a vector expression. <code>real</code> and <code>imag</code>
+compute the real and imaginary parts of a vector expression.
+<code>trans</code> computes the transpose of a vector expression.
+<code>herm</code> computes the hermitian, i.e. the complex
+conjugate of the transpose of a vector expression.</p>
+<h4>Definition</h4>
+<p>Defined in the header vector_expression.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>E</code> is a model of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</li>
+</ul>
+<h4>Preconditions</h4>
+<p>None.</p>
+<h4>Complexity</h4>
+<p>Linear depending from the size of the vector expression.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector&lt;std::complex&lt;double&gt; &gt; v (3);
+    for (unsigned i = 0; i &lt; v.size (); ++ i)
+        v (i) = std::complex&lt;double&gt; (i, i);
+
+    std::cout &lt;&lt; - v &lt;&lt; std::endl;
+    std::cout &lt;&lt; conj (v) &lt;&lt; std::endl;
+    std::cout &lt;&lt; real (v) &lt;&lt; std::endl;
+    std::cout &lt;&lt; imag (v) &lt;&lt; std::endl;
+    std::cout &lt;&lt; trans (v) &lt;&lt; std::endl;
+    std::cout &lt;&lt; herm (v) &lt;&lt; std::endl;
+}
+</pre>
+<h3>Binary Operation Description</h3>
+<h4>Description</h4>
+<p>The templated class <code>vector_binary&lt;E1, E2, F&gt;</code>
+describes a binary vector operation.</p>
+<h4>Definition</h4>
+<p>Defined in the header vector_expression.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E1</code></td>
+<td>The type of the first vector expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>E2</code></td>
+<td>The type of the second vector expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>The type of the operation.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_expression&lt;vector_binary&lt;E1, E2, F&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>vector_binary (const expression1_type &amp;e1, const
+expression2_type &amp;e2)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the expression.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+</tbody>
+</table>
+<h3>Binary Operations</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class E1, class E2, class F&gt;
+    struct vector_binary_traits {
+        typedef vector_binary&lt;typename E1::const_closure_type,
+                               typename E2::const_closure_type, F&gt; expression_type;
+        typedef expression_type result_type;
+     };
+
+    // (v1 + v2) [i] = v1 [i] + v2 [i]
+    template&lt;class E1, class E2&gt;
+    typename vector_binary_traits&lt;E1, E2, scalar_plus&lt;typename E1::value_type,
+                                                       typename E2::value_type&gt; &gt;::result_type
+    operator + (const vector_expression&lt;E1&gt; &amp;e1,
+                 const vector_expression&lt;E2&gt; &amp;e2);
+
+    // (v1 - v2) [i] = v1 [i] - v2 [i]
+    template&lt;class E1, class E2&gt;
+    typename vector_binary_traits&lt;E1, E2, scalar_minus&lt;typename E1::value_type,
+                                                        typename E2::value_type&gt; &gt;::result_type
+    operator - (const vector_expression&lt;E1&gt; &amp;e1,
+                 const vector_expression&lt;E2&gt; &amp;e2);</code>
+</pre>
+<h4>Description</h4>
+<p><code>operator +</code> computes the sum of two vector
+expressions. <code>operator -</code> computes the difference of two
+vector expressions.</p>
+<h4>Definition</h4>
+<p>Defined in the header vector_expression.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>E1</code> is a model of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</li>
+<li><code>E2</code> is a model of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</li>
+</ul>
+<h4>Preconditions</h4>
+<ul>
+<li><code>e1 ().size () == e2 ().size ()</code></li>
+</ul>
+<h4>Complexity</h4>
+<p>Linear depending from the size of the vector expressions.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector&lt;double&gt; v1 (3), v2 (3);
+    for (unsigned i = 0; i &lt; std::min (v1.size (), v2.size ()); ++ i)
+        v1 (i) = v2 (i) = i;
+
+    std::cout &lt;&lt; v1 + v2 &lt;&lt; std::endl;
+    std::cout &lt;&lt; v1 - v2 &lt;&lt; std::endl;
+}
+</pre>
+<h3>Binary Outer Operation Description</h3>
+<h4>Description</h4>
+<p>The templated class <code>vector_matrix_binary&lt;E1, E2,
+F&gt;</code> describes a binary outer vector operation.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E1</code></td>
+<td>The type of the first vector expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>E2</code></td>
+<td>The type of the second vector expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>The type of the operation.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#matrix_expression">Matrix Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#matrix_expression">Matrix Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>matrix_expression&lt;vector_matrix_binary&lt;E1, E2, F&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>vector_matrix_binary (const expression1_type &amp;e1,
+const expression2_type &amp;e2)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>size_type size1 () const</code></td>
+<td>Returns the number of rows.</td>
+</tr>
+<tr>
+<td><code>size_type size2 () const</code></td>
+<td>Returns the number of columns.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i, size_type j)
+const</code></td>
+<td>Returns the value of the <code>j</code>-th element in the
+<code>i</code>-th row.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 begin1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the
+beginning of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator1 end1 () const</code></td>
+<td>Returns a <code>const_iterator1</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 begin2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the
+beginning of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator2 end2 () const</code></td>
+<td>Returns a <code>const_iterator2</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator1 rend1 () const</code></td>
+<td>Returns a <code>const_reverse_iterator1</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator2 rend2 () const</code></td>
+<td>Returns a <code>const_reverse_iterator2</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+</tbody>
+</table>
+<h3>Binary Outer Operations</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class E1, class E2, class F&gt;
+    struct vector_matrix_binary_traits {
+        typedef vector_matrix_binary&lt;typename E1::const_closure_type,
+                                      typename E2::const_closure_type, F&gt; expression_type;
+        typedef expression_type result_type;
+     };
+
+    // (outer_prod (v1, v2)) [i] [j] = v1 [i] * v2 [j]
+    template&lt;class E1, class E2&gt;
+    typename vector_matrix_binary_traits&lt;E1, E2, scalar_multiplies&lt;typename E1::value_type, typename E2::value_type&gt; &gt;::result_type
+    outer_prod (const vector_expression&lt;E1&gt; &amp;e1,
+                 const vector_expression&lt;E2&gt; &amp;e2);</code>
+</pre>
+<h4>Description</h4>
+<p><code>outer_prod</code> computes the outer product of two vector
+expressions.</p>
+<h4>Definition</h4>
+<p>Defined in the header matrix_expression.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>E1</code> is a model of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</li>
+<li><code>E2</code> is a model of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</li>
+</ul>
+<h4>Preconditions</h4>
+<p>None.</p>
+<h4>Complexity</h4>
+<p>Quadratic depending from the size of the vector expressions.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/matrix.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector&lt;double&gt; v1 (3), v2 (3);
+    for (unsigned i = 0; i &lt; std::min (v1.size (), v2.size ()); ++ i)
+        v1 (i) = v2 (i) = i;
+
+    std::cout &lt;&lt; outer_prod (v1, v2) &lt;&lt; std::endl;
+}
+</pre>
+<h3>Scalar Vector Operation Description</h3>
+<h4>Description</h4>
+<p>The templated classes <code>vector_binary_scalar1&lt;E1, E2,
+F&gt;</code> and <code>vector_binary_scalar2&lt;E1, E2,
+F&gt;</code> describe binary operations between a scalar and a
+vector.</p>
+<h4>Definition</h4>
+<p>Defined in the header vector_expression.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>E1/E2</code></td>
+<td>The type of the scalar expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>E2/E1</code></td>
+<td>The type of the vector expression.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>F</code></td>
+<td>The type of the operation.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_expression&lt;vector_binary_scalar1&lt;E1, E2,
+F&gt; &gt;</code> and
+<code>vector_expression&lt;vector_binary_scalar2&lt;E1, E2, F&gt;
+&gt;</code> resp.</p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>vector_binary_scalar1 (const expression1_type &amp;e1,
+const expression2_type &amp;e2)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>vector_binary_scalar2 (const expression1_type &amp;e1,
+const expression2_type &amp;e2)</code></td>
+<td>Constructs a description of the expression.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the expression.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the expression.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed expression.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed expression.</td>
+</tr>
+</tbody>
+</table>
+<h3>Scalar Vector Operations</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class T1, class E2, class F&gt;
+    struct vector_binary_scalar1_traits {
+        typedef vector_binary_scalar1&lt;scalar_const_reference&lt;T1&gt;,
+                                      typename E2::const_closure_type, F&gt; expression_type;
+        typedef expression_type result_type;
+    };
+
+    // (t * v) [i] = t * v [i]
+    template&lt;class T1, class E2&gt;
+    typename vector_binary_scalar1_traits&lt;T1, E2, scalar_multiplies&lt;T1, typename E2::value_type&gt; &gt;::result_type
+    operator * (const T1 &amp;e1,
+                const vector_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class E1, class T2, class F&gt;
+    struct vector_binary_scalar2_traits {
+        typedef vector_binary_scalar2&lt;typename E1::const_closure_type,
+                                      scalar_const_reference&lt;T2&gt;, F&gt; expression_type;
+        typedef expression_type result_type;
+    };
+
+    // (v * t) [i] = v [i] * t
+    template&lt;class E1, class T2&gt;
+    typename vector_binary_scalar2_traits&lt;E1, T2, scalar_multiplies&lt;typename E1::value_type, T2&gt; &gt;::result_type
+    operator * (const vector_expression&lt;E1&gt; &amp;e1,
+                const T2 &amp;e2);
+
+    // (v / t) [i] = v [i] / t
+    template&lt;class E1, class T2&gt;
+    typename vector_binary_scalar2_traits&lt;E1, T2, scalar_divides&lt;typename E1::value_type, T2&gt; &gt;::result_type
+    operator / (const vector_expression&lt;E1&gt; &amp;e1,
+                const T2 &amp;e2);</code>
+</pre>
+<h4>Description</h4>
+<p><code>operator *</code> computes the product of a scalar and a
+vector expression. <code>operator /</code> multiplies the vector
+with the reciprocal of the scalar.</p>
+<h4>Definition</h4>
+<p>Defined in the header vector_expression.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>T1/T2</code> is a model of <a href=
+"expression_concept.html#scalar_expression">Scalar Expression</a> .</li>
+<li><code>E2/E1</code> is a model of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</li>
+</ul>
+<h4>Preconditions</h4>
+<p>None.</p>
+<h4>Complexity</h4>
+<p>Linear depending from the size of the vector expression.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector&lt;double&gt; v (3);
+    for (unsigned i = 0; i &lt; v.size (); ++ i)
+        v (i) = i;
+
+    std::cout &lt;&lt; 2.0 * v &lt;&lt; std::endl;
+    std::cout &lt;&lt; v * 2.0 &lt;&lt; std::endl;
+}
+</pre>
+<h2><a name="vector_reductions"></a>Vector Reductions</h2>
+<h3>Unary Reductions</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class E, class F&gt;
+    struct vector_scalar_unary_traits {
+         typedef typename F::result_type result_type;
+    };
+
+    // sum v = sum (v [i])
+    template&lt;class E&gt;
+    typename vector_scalar_unary_traits&lt;E, vector_sum&lt;typename E::value_type&gt; &gt;::result_type
+    sum (const vector_expression&lt;E&gt; &amp;e);
+
+    // norm_1 v = sum (abs (v [i]))
+    template&lt;class E&gt;
+    typename vector_scalar_unary_traits&lt;E, vector_norm_1&lt;typename E::value_type&gt; &gt;::result_type
+    norm_1 (const vector_expression&lt;E&gt; &amp;e);
+
+    // norm_2 v = sqrt (sum (v [i] * v [i]))
+    template&lt;class E&gt;
+    typename vector_scalar_unary_traits&lt;E, vector_norm_2&lt;typename E::value_type&gt; &gt;::result_type
+    norm_2 (const vector_expression&lt;E&gt; &amp;e);
+
+    // norm_inf v = max (abs (v [i]))
+    template&lt;class E&gt;
+    typename vector_scalar_unary_traits&lt;E, vector_norm_inf&lt;typename E::value_type&gt; &gt;::result_type
+    norm_inf (const vector_expression&lt;E&gt; &amp;e);
+
+    // index_norm_inf v = min (i: abs (v [i]) == max (abs (v [i])))
+    template&lt;class E&gt;
+    typename vector_scalar_unary_traits&lt;E, vector_index_norm_inf&lt;typename E::value_type&gt; &gt;::result_type
+    index_norm_inf (const vector_expression&lt;E&gt; &amp;e);</code>
+</pre>
+<h4>Description</h4>
+<p><code>sum</code> computes the sum of the vector expression's
+elements. <code>norm_1</code>, <code>norm_2</code> and
+<code>norm_inf</code> compute the corresponding
+<em>||.||</em><sub><em>1</em></sub>,
+<em>||.||</em><sub><em>2</em></sub> and
+<em>||.||</em><sub><em>inf</em></sub> vector norms.
+<code>index_norm_1</code> computes the index of the vector
+expression's first element having maximal absolute value.</p>
+<h4>Definition</h4>
+<p>Defined in the header vector_expression.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>E</code> is a model of <a href=
+"#vector_expression">Vector Expression</a> .</li>
+</ul>
+<h4>Preconditions</h4>
+<p>None.</p>
+<h4>Complexity</h4>
+<p>Linear depending from the size of the vector expression.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector&lt;double&gt; v (3);
+    for (unsigned i = 0; i &lt; v.size (); ++ i)
+        v (i) = i;
+
+    std::cout &lt;&lt; sum (v) &lt;&lt; std::endl;
+    std::cout &lt;&lt; norm_1 (v) &lt;&lt; std::endl;
+    std::cout &lt;&lt; norm_2 (v) &lt;&lt; std::endl;
+    std::cout &lt;&lt; norm_inf (v) &lt;&lt; std::endl;
+    std::cout &lt;&lt; index_norm_inf (v) &lt;&lt; std::endl;
+}
+</pre>
+<h3>Binary Reductions</h3>
+<h4>Prototypes</h4>
+<pre>
+<code>template&lt;class E1, class E2, class F&gt;
+    struct vector_scalar_binary_traits {
+        typedef typename F::result_type result_type;
+    };
+
+    // inner_prod (v1, v2) = sum (v1 [i] * v2 [i])
+    template&lt;class E1, class E2&gt;
+    typename vector_scalar_binary_traits&lt;E1, E2, vector_inner_prod&lt;typename E1::value_type,
+                                                                   typename E2::value_type,
+                                                                   typename promote_traits&lt;typename E1::value_type,
+                                                                                           typename E2::value_type&gt;::promote_type&gt; &gt;::result_type
+    inner_prod (const vector_expression&lt;E1&gt; &amp;e1,
+                const vector_expression&lt;E2&gt; &amp;e2);
+
+    template&lt;class E1, class E2&gt;
+    typename vector_scalar_binary_traits&lt;E1, E2, vector_inner_prod&lt;typename E1::value_type,
+                                                                   typename E2::value_type,
+                                                                   typename type_traits&lt;typename promote_traits&lt;typename E1::value_type,
+                                                                                                                typename E2::value_type&gt;::promote_type&gt;::precision_type&gt; &gt;::result_type
+    prec_inner_prod (const vector_expression&lt;E1&gt; &amp;e1,
+                     const vector_expression&lt;E2&gt; &amp;e2);</code>
+</pre>
+<h4>Description</h4>
+<p><code>inner_prod</code> computes the inner product of the vector
+expressions. <code>prec_inner_prod</code> computes the double
+precision inner product of the vector expressions<code>.</code></p>
+<h4>Definition</h4>
+<p>Defined in the header vector_expression.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>E1</code> is a model of <a href=
+"#vector_expression">Vector Expression</a> .</li>
+<li><code>E2</code> is a model of <a href=
+"#vector_expression">Vector Expression</a> .</li>
+</ul>
+<h4>Preconditions</h4>
+<ul>
+<li><code>e1 ().size () == e2 ().size ()</code></li>
+</ul>
+<h4>Complexity</h4>
+<p>Linear depending from the size of the vector expressions.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector&lt;double&gt; v1 (3), v2 (3);
+    for (unsigned i = 0; i &lt; std::min (v1.size (), v2.size ()); ++ i)
+        v1 (i) = v2 (i) = i;
+
+    std::cout &lt;&lt; inner_prod (v1, v2) &lt;&lt; std::endl;
+}
+</pre>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/vector_proxy.html b/doc/vector_proxy.html
new file mode 100644
index 0000000..a8a7376
--- /dev/null
+++ b/doc/vector_proxy.html
@@ -0,0 +1,527 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+<title>Vector Proxies</title>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Vector Proxies</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="vector_range"></a>Vector Range</h2>
+<h4>Description</h4>
+<p>The templated class <code>vector_range&lt;V&gt;</code> allows
+addressing a sub-range of a vector's element.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+#include &lt;boost/numeric/ublas/vector_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector&lt;double&gt; v (3);
+    vector_range&lt;vector&lt;double&gt; &gt; vr (v, range (0, 3));
+    for (unsigned i = 0; i &lt; vr.size (); ++ i)
+        vr (i) = i;
+    std::cout &lt;&lt; vr &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header vector_proxy.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>V</code></td>
+<td>The type of vector referenced.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</p>
+<p>If the specified range falls outside that of the index range of
+the vector, then the <code>vector_range</code> is not a well formed
+Vector Expression. That is, access to an element which is outside
+of index range of the vector is <i>undefined</i>.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_expression&lt;vector_range&lt;V&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>vector_range (vector_type &amp;data, const range
+&amp;r)</code></td>
+<td>Constructs a sub vector.</td>
+</tr>
+<tr>
+<td><code>size_type start () const</code></td>
+<td>Returns the start of the sub vector.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the sub vector.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator [] (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>vector_range &amp;operator = (const vector_range
+&amp;vr)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>vector_range &amp;assign_temporary (vector_range
+&amp;vr)</code></td>
+<td>Assigns a temporary. May change the vector range
+<code>vr</code> .</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector_range &amp;operator = (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector_range &amp;assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a vector expression to the sub vector. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector_range &amp;operator += (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Adds the vector expression to
+the sub vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector_range &amp;plus_assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Adds a vector expression to the sub vector. Left and right hand
+side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector_range &amp;operator -= (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the vector expression
+from the sub vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector_range &amp;minus_assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Subtracts a vector expression from the sub vector. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+vector_range &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the sub vector with
+a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+vector_range &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the sub vector through
+a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (vector_range &amp;vr)</code></td>
+<td>Swaps the contents of the sub vectors.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the <code>vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+<code>vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the
+beginning of the reversed <code>vector_range</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of
+the reversed <code>vector_range</code>.</td>
+</tr>
+</tbody>
+</table>
+<h3>Simple Projections</h3>
+<h4>Description</h4>
+<p>The free <code>subrange</code> functions support the construction
+of vector ranges.</p>
+<h4>Prototypes</h4>
+<pre><code>
+    template&lt;class V&gt;
+    vector_range&lt;V&gt; subrange (V &amp;data,
+       V::size_type start, V::size_type stop);
+    template&lt;class V&gt;
+    const vector_range&lt;const V&gt; subrange (const V &amp;data,
+       V::size_type start, V::size_type stop);
+</code></pre>
+<h3>Generic Projections</h3>
+<h4>Description</h4>
+<p>The free <code>project</code> functions support the construction
+of vector ranges. Existing <code>matrix_range</code>'s can be composed with a further range. The resulting range is computed using this existing range's <code>compose</code> function.</p>
+<h4>Prototypes</h4>
+<pre><code>
+    template&lt;class V&gt;
+    vector_range&lt;V&gt; project (V &amp;data, const range &amp;r);
+    template&lt;class V&gt;
+    const vector_range&lt;const V&gt; project (const V &amp;data, const range &amp;r);
+    template&lt;class V&gt;
+    vector_range&lt;V&gt; project (vector_range&lt;V&gt; &amp;data, const range &amp;r);
+    template&lt;class V&gt;
+    const vector_range&lt;V&gt; project (const vector_range&lt;V&gt; &amp;data, const range &amp;r);
+</code></pre>
+<h4>Definition</h4>
+<p>Defined in the header vector_proxy.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>V</code> is a model of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</li>
+</ul>
+<h4>Complexity</h4>
+<p>Linear depending from the size of the range.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+#include &lt;boost/numeric/ublas/vector_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector&lt;double&gt; v (3);
+    for (int i = 0; i &lt; 3; ++ i)
+        project (v, range (0, 3)) (i) = i;
+    std::cout &lt;&lt; project (v, range (0, 3)) &lt;&lt; std::endl;
+}
+</pre>
+<h2><a name="vector_slice"></a>Vector Slice</h2>
+<h4>Description</h4>
+<p>The templated class <code>vector_slice&lt;V&gt;</code> allows
+addressing a slice of a vector.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+#include &lt;boost/numeric/ublas/vector_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector&lt;double&gt; v (3);
+    vector_slice&lt;vector&lt;double&gt; &gt; vs (v, slice (0, 1, 3));
+    for (unsigned i = 0; i &lt; vs.size (); ++ i)
+        vs (i) = i;
+    std::cout &lt;&lt; vs &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header vector_proxy.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>V</code></td>
+<td>The type of vector referenced.</td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="expression_concept.html#vector_expression">Vector Expression</a>
+.</p>
+<p>If the specified slice falls outside that of the index range of
+the vector, then the <code>vector_slice</code> is not a well formed
+Vector Expression. That is, access to an element which is outside
+of index range of the vector is <i>undefined</i>.</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_expression&lt;vector_slice&lt;V&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>vector_slice (vector_type &amp;data, const slice
+&amp;s)</code></td>
+<td>Constructs a sub vector.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the sub vector.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator [] (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>vector_slice &amp;operator = (const vector_slice
+&amp;vs)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>vector_slice &amp;assign_temporary (vector_slice
+&amp;vs)</code></td>
+<td>Assigns a temporary. May change the vector slice
+<code>vs</code> .</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector_slice &amp;operator = (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector_slice &amp;assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a vector expression to the sub vector. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector_slice &amp;operator += (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Adds the vector expression to
+the sub vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector_slice &amp;plus_assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Adds a vector expression to the sub vector. Left and right hand
+side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector_slice &amp;operator -= (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the vector expression
+from the sub vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+vector_slice &amp;minus_assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Subtracts a vector expression from the sub vector. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+vector_slice &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the sub vector with
+a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+vector_slice &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the sub vector through
+a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (vector_slice &amp;vs)</code></td>
+<td>Swaps the contents of the sub vectors.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the <code>vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+<code>vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the
+beginning of the reversed <code>vector_slice</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of
+the reversed <code>vector_slice</code>.</td>
+</tr>
+</tbody>
+</table>
+<h3>Simple Projections</h3>
+<h4>Description</h4>
+<p>The free <code>subslice</code> functions support the construction
+of vector slices.</p>
+<h4>Prototypes</h4>
+<pre><code>
+    template&lt;class V&gt;
+    vector_slice&lt;V&gt; subslice (V &amp;data,
+       V::size_type start, V::difference_type stride, V::size_type size);
+    template&lt;class V&gt;
+    const vector_slice&lt;const V&gt; subslice (const V &amp;data,
+       V::size_type start, V::difference_type stride, V::size_type size);
+</code></pre>
+<h3>Generic Projections</h3>
+<h4>Description</h4>
+<p>The free <code>project</code> functions support the construction
+of vector slices. Existing <code>vector_slice</code>'s can be composed with a further range or slices. The resulting slice is computed using this existing slices's <code>compose</code> function.</p>
+<h4>Prototypes</h4>
+<pre><code>
+    template&lt;class V&gt;
+    vector_slice&lt;V&gt; project (V &amp;data, const slice &amp;s);
+    template&lt;class V&gt;
+    const vector_slice&lt;const V&gt; project (const V &amp;data, const slice &amp;s);
+    template&lt;class V&gt;
+    vector_slice&lt;V&gt; project (vector_slice&lt;V&gt; &amp;data, const range &amp;r);
+    template&lt;class V&gt;
+    const vector_slice&lt;V&gt; project (const vector_slice&lt;V&gt; &amp;data, const range &amp;r);
+    template&lt;class V&gt;
+    vector_slice&lt;V&gt; project (vector_slice&lt;V&gt; &amp;data, const slice &amp;s);
+    template&lt;class V&gt;
+    const vector_slice&lt;V&gt; project (const vector_slice&lt;V&gt; &amp;data, const slice &amp;s);
+</code></pre>
+<h4>Definition</h4>
+<p>Defined in the header vector_proxy.hpp.</p>
+<h4>Type requirements</h4>
+<ul>
+<li><code>V</code> is a model of <a href=
+"expression_concept.html#vector_expression">Vector Expression</a> .</li>
+</ul>
+<h4>Complexity</h4>
+<p>Linear depending from the size of the slice.</p>
+<h4>Examples</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector.hpp&gt;
+#include &lt;boost/numeric/ublas/vector_proxy.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    vector&lt;double&gt; v (3);
+    for (int i = 0; i &lt; 3; ++ i)
+        project (v, slice (0, 1, 3)) (i) = i;
+    std::cout &lt;&lt; project (v, slice (0, 1, 3)) &lt;&lt; std::endl;
+}
+</pre>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>
diff --git a/doc/vector_sparse.html b/doc/vector_sparse.html
new file mode 100644
index 0000000..32279b0
--- /dev/null
+++ b/doc/vector_sparse.html
@@ -0,0 +1,800 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator" content=
+"HTML Tidy for Linux/x86 (vers 1st March 2004), see www.w3.org" />
+<meta http-equiv="Content-Type" content=
+"text/html; charset=us-ascii" />
+<link href="ublas.css" type="text/css" />
+<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
+<link rel="stylesheet" href="ublas.css" type="text/css" />
+<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
+<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
+</head>
+<body>
+<h1><img src="../../../../boost.png" align="middle" />Sparse Vector</h1>
+<div class="toc" id="toc"></div>
+<h2><a name="mapped_vector"></a>Mapped Vector</h2>
+<h4>Description</h4>
+<p>The templated class <code>mapped_vector&lt;T, A&gt;</code> is
+the base container adaptor for sparse vectors using element maps. For a
+<em>n</em>-dimensional sparse vector and <em>0 &lt;= i &lt; n</em>
+the non-zero elements <em>v</em><sub><em>i</em></sub> are mapped to
+consecutive elements of the associative container, i.e. for
+elements <em>k</em> =
+<em>v</em><sub><em>i</em></sub><sub><sub><em>1</em></sub></sub>and
+<em>k + 1 =
+v</em><sub><em>i</em></sub><sub><sub><em>2</em></sub></sub>of the
+container holds <em>i</em><sub><em>1</em></sub> <em>&lt;
+i</em><sub><em>2</em></sub>.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector_sparse.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    mapped_vector&lt;double&gt; v (3, 3);
+    for (unsigned i = 0; i &lt; v.size (); ++ i)
+        v (i) = i;
+    std::cout &lt;&lt; v &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header vector_sparse.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the mapped vector.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>A</code></td>
+<td>The type of the adapted array. <a href=
+"#mapped_vector_1">[1]</a></td>
+<td><code>map_std&lt;std::size_t, T&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#vector">Vector</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"container_concept.html#vector">Vector</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_container&lt;mapped_vector&lt;T, A&gt;
+&gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>mapped_vector ()</code></td>
+<td>Allocates a <code>mapped_vector</code> that holds zero
+elements.</td>
+</tr>
+<tr>
+<td><code>mapped_vector (size_type size, size_type
+non_zeros = 0)</code></td>
+<td>Allocates a <code>mapped_vector</code> that holds at most
+<code>size</code> elements.</td>
+</tr>
+<tr>
+<td><code>mapped_vector (const mapped_vector &amp;v)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_vector (size_type non_zeros, const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size, bool
+preserve = true)</code></td>
+<td>Reallocates a <code>mapped_vector</code> to hold at most
+<code>size</code> elements. The existing elements of the
+<code>mapped_vector</code> are preseved when specified.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the <code>mapped_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator [] (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>mapped_vector &amp;operator = (const mapped_vector
+&amp;v)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>mapped_vector &amp;assign_temporary (mapped_vector
+&amp;v)</code></td>
+<td>Assigns a temporary. May change the mapped vector
+<code>v</code> .</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_vector &amp;operator = (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_vector &amp;assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a vector expression to the mapped vector. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_vector &amp;operator += (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Adds the vector expression to
+the mapped vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_vector &amp;plus_assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Adds a vector expression to the mapped vector. Left and right
+hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_vector &amp;operator -= (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the vector expression
+from the mapped vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+mapped_vector &amp;minus_assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Subtracts a vector expression from the mapped vector. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+mapped_vector &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the mapped vector
+with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+mapped_vector &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the mapped vector
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (mapped_vector &amp;v)</code></td>
+<td>Swaps the contents of the mapped vectors.</td>
+</tr>
+<tr>
+<td><code>true_reference insert_element (size_type i, const_reference t)</code></td>
+<td>Inserts the value <code>t</code> at the <code>i</code>-th
+element. Duplicates elements are not allowed.</td>
+</tr>
+<tr>
+<td><code>void erase_element (size_type i)</code></td>
+<td>Erases the value at the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td>Clears the mapped vector.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>mapped_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>mapped_vector</code>.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the <code>mapped_vector</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+<code>mapped_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>mapped_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>mapped_vector</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the
+beginning of the reversed <code>mapped_vector</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of
+the reversed <code>mapped_vector</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="mapped_vector_1">[1]</a> Supported
+parameters for the adapted array are
+<code>map_array&lt;std::size_t, T&gt;</code> and
+<code>map_std&lt;std::size_t, T&gt;</code>. The latter is
+equivalent to <code>std::map&lt;std::size_t, T&gt;</code>.</p>
+<h2><a name="compressed_vector"></a>Compressed Vector</h2>
+<h4>Description</h4>
+<p>The templated class <code>compressed_vector&lt;T, IB, IA,
+TA&gt;</code> is the base container adaptor for compressed vectors.
+For a <em>n</em>-dimensional compressed vector and <em>0 &lt;= i
+&lt; n</em> the non-zero elements <em>v</em><sub><em>i</em></sub>
+are mapped to consecutive elements of the index and value
+container, i.e. for elements <em>k</em> =
+<em>v</em><sub><em>i</em></sub><sub><sub><em>1</em></sub></sub>and
+<em>k + 1 =
+v</em><sub><em>i</em></sub><sub><sub><em>2</em></sub></sub>of these
+containers holds <em>i</em><sub><em>1</em></sub> <em>&lt;
+i</em><sub><em>2</em></sub>.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector_sparse.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    compressed_vector&lt;double&gt; v (3, 3);
+    for (unsigned i = 0; i &lt; v.size (); ++ i)
+        v (i) = i;
+    std::cout &lt;&lt; v &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header vector_sparse.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the compressed vector.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>IB</code></td>
+<td>The index base of the compressed vector. <a href=
+"#compressed_vector_1">[1]</a></td>
+<td><code>0</code></td>
+</tr>
+<tr>
+<td><code>IA</code></td>
+<td>The type of the adapted array for indices. <a href=
+"#compressed_vector_2">[2]</a></td>
+<td><code>unbounded_array&lt;std::size_t&gt;</code></td>
+</tr>
+<tr>
+<td><code>TA</code></td>
+<td>The type of the adapted array for values. <a href=
+"#compressed_vector_2">[2]</a></td>
+<td><code>unbounded_array&lt;T&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#vector">Vector</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"container_concept.html#vector">Vector</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_container&lt;compressed_vector&lt;T, IB, IA,
+TA&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>compressed_vector ()</code></td>
+<td>Allocates a <code>compressed_vector</code> that holds zero
+elements.</td>
+</tr>
+<tr>
+<td><code>compressed_vector (size_type size, size_type
+non_zeros)</code></td>
+<td>Allocates a <code>compressed_vector</code> that holds at most
+<code>size</code> elements.</td>
+</tr>
+<tr>
+<td><code>compressed_vector (const compressed_vector
+&amp;v)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_vector (size_type non_zeros, const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size, bool
+preserve = true)</code></td>
+<td>Reallocates a <code>compressed_vector</code> to hold at most
+<code>size</code> elements. The existing elements of the
+<code>compress_vector</code> are preseved when specified.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the <code>compressed_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator [] (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>compressed_vector &amp;operator = (const
+compressed_vector &amp;v)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>compressed_vector &amp;assign_temporary
+(compressed_vector &amp;v)</code></td>
+<td>Assigns a temporary. May change the compressed vector
+<code>v</code>.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_vector &amp;operator = (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_vector &amp;assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a vector expression to the compressed vector. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_vector &amp;operator += (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Adds the vector expression to
+the compressed vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_vector &amp;plus_assign (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Adds a vector expression to the compressed vector. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_vector &amp;operator -= (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the vector expression
+from the compressed vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+compressed_vector &amp;minus_assign (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Subtracts a vector expression from the compressed vector. Left
+and right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+compressed_vector &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the compressed
+vector with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+compressed_vector &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the compressed vector
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (compressed_vector &amp;v)</code></td>
+<td>Swaps the contents of the compressed vectors.</td>
+</tr>
+<tr>
+<td><code>true_reference insert_element (size_type i, const_reference t)</code></td>
+<td>Inserts the value <code>t</code> at the <code>i</code>-th
+element. Duplicates elements are not allowed.</td>
+</tr>
+<tr>
+<td><code>void erase_element (size_type i)</code></td>
+<td>Erases the value at the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td>Clears the compressed vector.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>compressed_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>compressed_vector</code>.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the <code>compressed_vector</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+<code>compressed_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>compressed_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>compressed_vector</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the
+beginning of the reversed <code>compressed_vector</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of
+the reversed <code>compressed_vector</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="compressed_vector_1">[1]</a>
+Supported parameters for the index base are <code>0</code> and
+<code>1</code> at least.</p>
+<p><a name="compressed_vector_2">[2]</a>
+Supported parameters for the adapted array are
+<code>unbounded_array&lt;&gt;</code> ,
+<code>bounded_array&lt;&gt;</code> and
+<code>std::vector&lt;&gt;</code> .</p>
+<h2><a name="coordinate_vector"></a>Coordinate Vector</h2>
+<h4>Description</h4>
+<p>The templated class <code>coordinate_vector&lt;T, IB, IA,
+TA&gt;</code> is the base container adaptor for compressed vectors.
+For a <em>n</em>-dimensional sorted coordinate vector and <em>0
+&lt;= i &lt; n</em> the non-zero elements
+<em>v</em><sub><em>i</em></sub> are mapped to consecutive elements
+of the index and value container, i.e. for elements <em>k</em> =
+<em>v</em><sub><em>i</em></sub><sub><sub><em>1</em></sub></sub>and
+<em>k + 1 =
+v</em><sub><em>i</em></sub><sub><sub><em>2</em></sub></sub>of these
+containers holds <em>i</em><sub><em>1</em></sub> <em>&lt;
+i</em><sub><em>2</em></sub>.</p>
+<h4>Example</h4>
+<pre>
+#include &lt;boost/numeric/ublas/vector_sparse.hpp&gt;
+#include &lt;boost/numeric/ublas/io.hpp&gt;
+
+int main () {
+    using namespace boost::numeric::ublas;
+    coordinate_vector&lt;double&gt; v (3, 3);
+    for (unsigned i = 0; i &lt; v.size (); ++ i)
+        v (i) = i;
+    std::cout &lt;&lt; v &lt;&lt; std::endl;
+}
+</pre>
+<h4>Definition</h4>
+<p>Defined in the header vector_sparse.hpp.</p>
+<h4>Template parameters</h4>
+<table border="1" summary="parameters">
+<tbody>
+<tr>
+<th>Parameter</th>
+<th>Description</th>
+<th>Default</th>
+</tr>
+<tr>
+<td><code>T</code></td>
+<td>The type of object stored in the coordinate vector.</td>
+<td></td>
+</tr>
+<tr>
+<td><code>IB</code></td>
+<td>The index base of the coordinate vector. <a href=
+"#coordinate_vector_1">[1]</a></td>
+<td><code>0</code></td>
+</tr>
+<tr>
+<td><code>IA</code></td>
+<td>The type of the adapted array for indices. <a href=
+"#coordinate_vector_2">[2]</a></td>
+<td><code>unbounded_array&lt;std::size_t&gt;</code></td>
+</tr>
+<tr>
+<td><code>TA</code></td>
+<td>The type of the adapted array for values. <a href=
+"#coordinate_vector_2">[2]</a></td>
+<td><code>unbounded_array&lt;T&gt;</code></td>
+</tr>
+</tbody>
+</table>
+<h4>Model of</h4>
+<p><a href="container_concept.html#vector">Vector</a> .</p>
+<h4>Type requirements</h4>
+<p>None, except for those imposed by the requirements of <a href=
+"container_concept.html#vector">Vector</a> .</p>
+<h4>Public base classes</h4>
+<p><code>vector_container&lt;coordinate_vector&lt;T, IB, IA,
+TA&gt; &gt;</code></p>
+<h4>Members</h4>
+<table border="1" summary="members">
+<tbody>
+<tr>
+<th>Member</th>
+<th>Description</th>
+</tr>
+<tr>
+<td><code>coordinate_vector ()</code></td>
+<td>Allocates a <code>coordinate_vector</code> that holds zero
+elements.</td>
+</tr>
+<tr>
+<td><code>coordinate_vector (size_type size, size_type
+non_zeros)</code></td>
+<td>Allocates a <code>coordinate_vector</code> that holds at most
+<code>size</code> elements.</td>
+</tr>
+<tr>
+<td><code>coordinate_vector (const coordinate_vector
+&amp;v)</code></td>
+<td>The copy constructor.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_vector (size_type non_zeros, const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended copy constructor.</td>
+</tr>
+<tr>
+<td><code>void resize (size_type size, bool
+preserve = true)</code></td>
+<td>Reallocates a <code>coordinate_vector</code> to hold at most
+<code>size</code> elements. The existing elements of the
+<code>coordinate_vector</code> are preseved when specified.</td>
+</tr>
+<tr>
+<td><code>size_type size () const</code></td>
+<td>Returns the size of the <code>coordinate_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reference operator () (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator () (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>const_reference operator [] (size_type i)
+const</code></td>
+<td>Returns the value of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>reference operator [] (size_type i)</code></td>
+<td>Returns a reference of the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>coordinate_vector &amp;operator = (const
+coordinate_vector &amp;v)</code></td>
+<td>The assignment operator.</td>
+</tr>
+<tr>
+<td><code>coordinate_vector &amp;assign_temporary
+(coordinate_vector &amp;v)</code></td>
+<td>Assigns a temporary. May change the coordinate vector
+<code>v</code>.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_vector &amp;operator = (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>The extended assignment operator.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_vector &amp;assign (const vector_expression&lt;AE&gt;
+&amp;ae)</code></td>
+<td>Assigns a vector expression to the coordinate vector. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_vector &amp;operator += (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Adds the vector expression to
+the coordinate vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_vector &amp;plus_assign (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Adds a vector expression to the coordinate vector. Left and
+right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_vector &amp;operator -= (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>A computed assignment operator. Subtracts the vector expression
+from the coordinate vector.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AE&gt;<br />
+coordinate_vector &amp;minus_assign (const
+vector_expression&lt;AE&gt; &amp;ae)</code></td>
+<td>Subtracts a vector expression from the coordinate vector. Left
+and right hand side of the assignment should be independent.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+coordinate_vector &amp;operator *= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Multiplies the coordinate
+vector with a scalar.</td>
+</tr>
+<tr>
+<td><code>template&lt;class AT&gt;<br />
+coordinate_vector &amp;operator /= (const AT &amp;at)</code></td>
+<td>A computed assignment operator. Divides the coordinate vector
+through a scalar.</td>
+</tr>
+<tr>
+<td><code>void swap (coordinate_vector &amp;v)</code></td>
+<td>Swaps the contents of the coordinate vectors.</td>
+</tr>
+<tr>
+<td><code>true_reference insert_element (size_type i, const_reference t)</code></td>
+<td>Inserts the value <code>t</code> at the <code>i</code>-th
+element. Duplicates elements are not allowed.</td>
+</tr>
+<tr>
+<td><code>void append_element (size_type i, size_type j, const_reference t)</code></td>
+<td>Appends the value <code>t</code> at the <code>i</code>-th element.
+Duplicate elements can be appended to a <code>coordinate_vector</code>. They are merged into a single
+arithmetically summed element by the <code>sort</code> function.</td>
+</tr>
+<tr>
+<td><code>void erase_element (size_type i)</code></td>
+<td>Erases the value at the <code>i</code>-th element.</td>
+</tr>
+<tr>
+<td><code>void clear ()</code></td>
+<td>Clears the coordinate vector.</td>
+</tr>
+<tr>
+<td><code>const_iterator begin () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the beginning
+of the <code>coordinate_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_iterator end () const</code></td>
+<td>Returns a <code>const_iterator</code> pointing to the end of
+the <code>coordinate_vector</code>.</td>
+</tr>
+<tr>
+<td><code>iterator begin ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the beginning of
+the <code>coordinate_vector</code>.</td>
+</tr>
+<tr>
+<td><code>iterator end ()</code></td>
+<td>Returns a <code>iterator</code> pointing to the end of the
+<code>coordinate_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rbegin () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+beginning of the reversed <code>coordinate_vector</code>.</td>
+</tr>
+<tr>
+<td><code>const_reverse_iterator rend () const</code></td>
+<td>Returns a <code>const_reverse_iterator</code> pointing to the
+end of the reversed <code>coordinate_vector</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rbegin ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the
+beginning of the reversed <code>coordinate_vector</code>.</td>
+</tr>
+<tr>
+<td><code>reverse_iterator rend ()</code></td>
+<td>Returns a <code>reverse_iterator</code> pointing to the end of
+the reversed <code>coordinate_vector</code>.</td>
+</tr>
+</tbody>
+</table>
+<h4>Notes</h4>
+<p><a name="coordinate_vector_1">[1]</a>
+Supported parameters for the index base are <code>0</code> and
+<code>1</code> at least.</p>
+<p><a name="coordinate_vector_2">[2]</a>
+Supported parameters for the adapted array are
+<code>unbounded_array&lt;&gt;</code> ,
+<code>bounded_array&lt;&gt;</code> and
+<code>std::vector&lt;&gt;</code> .</p>
+<hr />
+<p>Copyright (&copy;) 2000-2002 Joerg Walter, Mathias Koch<br />
+   Use, modification and distribution are subject to the
+   Boost Software License, Version 1.0.
+   (See accompanying file LICENSE_1_0.txt
+   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
+      http://www.boost.org/LICENSE_1_0.txt
+   </a>).
+</p>
+<script type="text/javascript">
+(function($) {
+    $('#toc').toc();
+})(jQuery);
+</script>
+</body>
+</html>