Sophie

Sophie

distrib > Fedora > 16 > i386 > by-pkgid > 4bc66056a634db26a1f4d0845dc41ca6 > files > 2135

mrpt-doc-0.9.5-0.1.20110925svn2670.fc16.i686.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>CSparseMatrixTemplate.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<div align="left"><a href="http://www.mrpt.org/">Main MRPT website</a> &gt; <b>C++ reference</b> </div>
<div align="right">
<a href="index.html"><img border="0" src="mrpt_logo.png" alt="MRPT logo"></a>
</div>
<!-- Generated by Doxygen 1.7.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
          <div class="left">
            <form id="FSearchBox" action="search.php" method="get">
              <img id="MSearchSelect" src="search/mag.png" alt=""/>
              <input type="text" id="MSearchField" name="query" value="Search" size="20" accesskey="S" 
                     onfocus="searchBox.OnSearchFieldFocus(true)" 
                     onblur="searchBox.OnSearchFieldFocus(false)"/>
            </form>
          </div><div class="right"></div>
        </div>
      </li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
<div class="header">
  <div class="headertitle">
<div class="title">CSparseMatrixTemplate.h</div>  </div>
</div>
<div class="contents">
<a href="_c_sparse_matrix_template_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* +---------------------------------------------------------------------------+</span>
<a name="l00002"></a>00002 <span class="comment">   |          The Mobile Robot Programming Toolkit (MRPT) C++ library          |</span>
<a name="l00003"></a>00003 <span class="comment">   |                                                                           |</span>
<a name="l00004"></a>00004 <span class="comment">   |                       http://www.mrpt.org/                                |</span>
<a name="l00005"></a>00005 <span class="comment">   |                                                                           |</span>
<a name="l00006"></a>00006 <span class="comment">   |   Copyright (C) 2005-2011  University of Malaga                           |</span>
<a name="l00007"></a>00007 <span class="comment">   |                                                                           |</span>
<a name="l00008"></a>00008 <span class="comment">   |    This software was written by the Machine Perception and Intelligent    |</span>
<a name="l00009"></a>00009 <span class="comment">   |      Robotics Lab, University of Malaga (Spain).                          |</span>
<a name="l00010"></a>00010 <span class="comment">   |    Contact: Jose-Luis Blanco  &lt;jlblanco@ctima.uma.es&gt;                     |</span>
<a name="l00011"></a>00011 <span class="comment">   |                                                                           |</span>
<a name="l00012"></a>00012 <span class="comment">   |  This file is part of the MRPT project.                                   |</span>
<a name="l00013"></a>00013 <span class="comment">   |                                                                           |</span>
<a name="l00014"></a>00014 <span class="comment">   |     MRPT is free software: you can redistribute it and/or modify          |</span>
<a name="l00015"></a>00015 <span class="comment">   |     it under the terms of the GNU General Public License as published by  |</span>
<a name="l00016"></a>00016 <span class="comment">   |     the Free Software Foundation, either version 3 of the License, or     |</span>
<a name="l00017"></a>00017 <span class="comment">   |     (at your option) any later version.                                   |</span>
<a name="l00018"></a>00018 <span class="comment">   |                                                                           |</span>
<a name="l00019"></a>00019 <span class="comment">   |   MRPT is distributed in the hope that it will be useful,                 |</span>
<a name="l00020"></a>00020 <span class="comment">   |     but WITHOUT ANY WARRANTY; without even the implied warranty of        |</span>
<a name="l00021"></a>00021 <span class="comment">   |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         |</span>
<a name="l00022"></a>00022 <span class="comment">   |     GNU General Public License for more details.                          |</span>
<a name="l00023"></a>00023 <span class="comment">   |                                                                           |</span>
<a name="l00024"></a>00024 <span class="comment">   |     You should have received a copy of the GNU General Public License     |</span>
<a name="l00025"></a>00025 <span class="comment">   |     along with MRPT.  If not, see &lt;http://www.gnu.org/licenses/&gt;.         |</span>
<a name="l00026"></a>00026 <span class="comment">   |                                                                           |</span>
<a name="l00027"></a>00027 <span class="comment">   +---------------------------------------------------------------------------+ */</span>
<a name="l00028"></a>00028 <span class="preprocessor">#ifndef CSparseMatrixTemplate_H</span>
<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#define CSparseMatrixTemplate_H</span>
<a name="l00030"></a>00030 <span class="preprocessor"></span>
<a name="l00031"></a>00031 <span class="preprocessor">#include &lt;<a class="code" href="utils__defs_8h.html">mrpt/utils/utils_defs.h</a>&gt;</span>
<a name="l00032"></a>00032 
<a name="l00033"></a>00033 <span class="keyword">namespace </span>mrpt  {
<a name="l00034"></a>00034 <span class="keyword">namespace </span>math  {
<a name="l00035"></a>00035     <span class="keyword">using namespace </span>std;
<a name="l00036"></a>00036 <span class="comment"></span>
<a name="l00037"></a>00037 <span class="comment">    /** A sparse matrix container (with cells of any type), with iterators.</span>
<a name="l00038"></a>00038 <span class="comment">      *  This class stores only those elements created by assigning them a value, for example: &quot;M(2,3)=8;&quot;.</span>
<a name="l00039"></a>00039 <span class="comment">      *</span>
<a name="l00040"></a>00040 <span class="comment">      *  This class doesn&#39;t implement math operations since it&#39;s a generic sparse container, but it can be</span>
<a name="l00041"></a>00041 <span class="comment">      *   used to initialize the contents of a CSparse library-based matrix of type mrpt::math::CSparseMatrix.</span>
<a name="l00042"></a>00042 <span class="comment">      *</span>
<a name="l00043"></a>00043 <span class="comment">      *  Note that reading non-existing cell elements will return the default value (0 for numbers)</span>
<a name="l00044"></a>00044 <span class="comment">      *   and that cell will remain non-created in the matrix.</span>
<a name="l00045"></a>00045 <span class="comment">      *</span>
<a name="l00046"></a>00046 <span class="comment">      *  There is an additional method &quot;exists(i,j)&quot; to check whether a given element exists in the matrix.</span>
<a name="l00047"></a>00047 <span class="comment">      *</span>
<a name="l00048"></a>00048 <span class="comment">      *  \sa mrpt::math::CSparseMatrix, CSparseSymmetricalMatrix</span>
<a name="l00049"></a>00049 <span class="comment">      *  \note Methods marked as &quot;Doesn&#39;t check bounds&quot; mean that if an access to an element out of the matrix size is tried, an empty element will be assumed, but this will not raise any invalid memory access.</span>
<a name="l00050"></a>00050 <span class="comment">      * \ingroup mrpt_base_grp</span>
<a name="l00051"></a>00051 <span class="comment">      */</span>
<a name="l00052"></a>00052         <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;
<a name="l00053"></a>00053         <span class="keyword">class </span>CSparseMatrixTemplate     {
<a name="l00054"></a>00054                 <span class="comment">//Public typedefs</span>
<a name="l00055"></a>00055         <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00056"></a>00056 <span class="comment">                /**</span>
<a name="l00057"></a>00057 <span class="comment">                  * Internal map type, used to store the actual matrix.</span>
<a name="l00058"></a>00058 <span class="comment">                  */</span>
<a name="l00059"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#ae991e80973496a1069f6711688c25441">00059</a>                 <span class="keyword">typedef</span> <span class="keyword">typename</span> std<a class="code" href="classstd_1_1map.html" title="STL class.">::map&lt;std::pair&lt;size_t,size_t&gt;</a>,T&gt; <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#ae991e80973496a1069f6711688c25441" title="Internal map type, used to store the actual matrix.">SparseMatrixMap</a>;<span class="comment"></span>
<a name="l00060"></a>00060 <span class="comment">                /**</span>
<a name="l00061"></a>00061 <span class="comment">                  * Const iterator to move through the matrix.</span>
<a name="l00062"></a>00062 <span class="comment">                  * \sa CSparseMatrixTemplate::const_reverse_iterator</span>
<a name="l00063"></a>00063 <span class="comment">                  */</span>
<a name="l00064"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#af0e5e1da6f543184aa09325ff6c358f3">00064</a>                 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstd_1_1map.html">SparseMatrixMap</a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#af0e5e1da6f543184aa09325ff6c358f3" title="Const iterator to move through the matrix.">::const_iterator</a> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#af0e5e1da6f543184aa09325ff6c358f3" title="Const iterator to move through the matrix.">const_iterator</a>;<span class="comment"></span>
<a name="l00065"></a>00065 <span class="comment">                /**</span>
<a name="l00066"></a>00066 <span class="comment">                  * Const reverse iterator to move through the matrix.</span>
<a name="l00067"></a>00067 <span class="comment">                  * \sa CSparseMatrixTemplate::const_iterator</span>
<a name="l00068"></a>00068 <span class="comment">                  */</span>
<a name="l00069"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a74ec9d443954f17d0b81fab52062c581">00069</a>                 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstd_1_1map.html">SparseMatrixMap</a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a74ec9d443954f17d0b81fab52062c581" title="Const reverse iterator to move through the matrix.">::const_reverse_iterator</a> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a74ec9d443954f17d0b81fab52062c581" title="Const reverse iterator to move through the matrix.">const_reverse_iterator</a>;
<a name="l00070"></a>00070         <span class="keyword">protected</span>:<span class="comment"></span>
<a name="l00071"></a>00071 <span class="comment">                /**</span>
<a name="l00072"></a>00072 <span class="comment">                  * Size of the matrix.</span>
<a name="l00073"></a>00073 <span class="comment">                  */</span>
<a name="l00074"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a8812d55d240256f30291d41d525cac4e">00074</a>                 <span class="keywordtype">size_t</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a8812d55d240256f30291d41d525cac4e" title="Size of the matrix.">mRows</a>,mColumns;<span class="comment"></span>
<a name="l00075"></a>00075 <span class="comment">                /**</span>
<a name="l00076"></a>00076 <span class="comment">                  * Actual matrix.</span>
<a name="l00077"></a>00077 <span class="comment">                  */</span>
<a name="l00078"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a979feefa0822dc5d62e36d7dd0905e92">00078</a>                 <a class="code" href="classstd_1_1map.html">SparseMatrixMap</a> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a979feefa0822dc5d62e36d7dd0905e92" title="Actual matrix.">objectList</a>;
<a name="l00079"></a>00079         <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00080"></a>00080 <span class="comment">                /**</span>
<a name="l00081"></a>00081 <span class="comment">                  * Basic constructor with no data. Size is set to (0,0).</span>
<a name="l00082"></a>00082 <span class="comment">                  */</span>
<a name="l00083"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a09b312cf33892c92155be7e189bb7d87">00083</a>                 <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a09b312cf33892c92155be7e189bb7d87" title="Basic constructor with no data.">CSparseMatrixTemplate</a>():mRows(0),mColumns(0)    {}<span class="comment"></span>
<a name="l00084"></a>00084 <span class="comment">                /**</span>
<a name="l00085"></a>00085 <span class="comment">                  * Constructor with default size.</span>
<a name="l00086"></a>00086 <span class="comment">                  */</span>
<a name="l00087"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a37725f74e077b0b08197ba9bfd8caa7e">00087</a>                 <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a37725f74e077b0b08197ba9bfd8caa7e" title="Constructor with default size.">CSparseMatrixTemplate</a>(<span class="keywordtype">size_t</span> nR,<span class="keywordtype">size_t</span> nC):mRows(nR),mColumns(nC)       {}<span class="comment"></span>
<a name="l00088"></a>00088 <span class="comment">                /**</span>
<a name="l00089"></a>00089 <span class="comment">                  * Element access operator. Doesn&#39;t check bounds.</span>
<a name="l00090"></a>00090 <span class="comment">                  */</span>
<a name="l00091"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#aac4a1df049c41beee37e236c22ee0d2b">00091</a>                 <span class="keyword">inline</span> T <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#aac4a1df049c41beee37e236c22ee0d2b" title="Element access operator.">operator()</a>(<span class="keywordtype">size_t</span> r,<span class="keywordtype">size_t</span> c)<span class="keyword"> const    </span>{
<a name="l00092"></a>00092                         <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#af0e5e1da6f543184aa09325ff6c358f3" title="Const iterator to move through the matrix.">const_iterator</a> it=objectList.find(make_pair(r,c));
<a name="l00093"></a>00093                         <span class="keywordflow">if</span> (it==objectList.end()) <span class="keywordflow">return</span> T();
<a name="l00094"></a>00094                         <span class="keywordflow">else</span> <span class="keywordflow">return</span> it-&gt;second;
<a name="l00095"></a>00095                 }
<a name="l00096"></a>00096 <span class="comment"></span>
<a name="l00097"></a>00097 <span class="comment">                /** Element access operator. Checks bounds.</span>
<a name="l00098"></a>00098 <span class="comment">                  */</span>
<a name="l00099"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a815eb2e7018bf6784cdaa2931d26f658">00099</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a815eb2e7018bf6784cdaa2931d26f658" title="Element access operator.">exists</a>(<span class="keywordtype">size_t</span> r,<span class="keywordtype">size_t</span> c)<span class="keyword"> const     </span>{
<a name="l00100"></a>00100 <span class="preprocessor">#if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)</span>
<a name="l00101"></a>00101 <span class="preprocessor"></span>                        <span class="keywordflow">if</span> (r&gt;=mRows||c&gt;=mColumns) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Out of range&quot;</span>);
<a name="l00102"></a>00102 <span class="preprocessor">#endif</span>
<a name="l00103"></a>00103 <span class="preprocessor"></span>                        <span class="keywordflow">return</span> (objectList.find(make_pair(r,c)) != objectList.end());
<a name="l00104"></a>00104                 }
<a name="l00105"></a>00105 <span class="comment"></span>
<a name="l00106"></a>00106 <span class="comment">                /**</span>
<a name="l00107"></a>00107 <span class="comment">                  * Reference access operator. Checks for bounds.</span>
<a name="l00108"></a>00108 <span class="comment">                  */</span>
<a name="l00109"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#acde6c0d038c8aa821e13d8ddb22e55ee">00109</a>                 <span class="keyword">inline</span> T&amp; <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#acde6c0d038c8aa821e13d8ddb22e55ee" title="Reference access operator.">operator()</a>(<span class="keywordtype">size_t</span> r,<span class="keywordtype">size_t</span> c) {
<a name="l00110"></a>00110 <span class="preprocessor">#if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)</span>
<a name="l00111"></a>00111 <span class="preprocessor"></span>                        <span class="keywordflow">if</span> (r&gt;=mRows||c&gt;=mColumns) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Out of range&quot;</span>);
<a name="l00112"></a>00112 <span class="preprocessor">#endif</span>
<a name="l00113"></a>00113 <span class="preprocessor"></span>                        <span class="keywordflow">return</span> objectList[make_pair(r,c)];
<a name="l00114"></a>00114                 }<span class="comment"></span>
<a name="l00115"></a>00115 <span class="comment">                /**</span>
<a name="l00116"></a>00116 <span class="comment">                  * Returns the amount of rows in this matrix.</span>
<a name="l00117"></a>00117 <span class="comment">                  * \sa getColCount,getRow</span>
<a name="l00118"></a>00118 <span class="comment">                  */</span>
<a name="l00119"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a791dd49435a4bed1d3c340939807697c">00119</a>                 <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a791dd49435a4bed1d3c340939807697c" title="Returns the amount of rows in this matrix.">getRowCount</a>()<span class="keyword"> const       </span>{
<a name="l00120"></a>00120                         <span class="keywordflow">return</span> mRows;
<a name="l00121"></a>00121                 }<span class="comment"></span>
<a name="l00122"></a>00122 <span class="comment">                /**</span>
<a name="l00123"></a>00123 <span class="comment">                  * Returns the amount of columns in this matrix.</span>
<a name="l00124"></a>00124 <span class="comment">                  * \sa getRowCount</span>
<a name="l00125"></a>00125 <span class="comment">                  */</span>
<a name="l00126"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#ad3d8491c5a4dfb46dabf00be2e595d16">00126</a>                 <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#ad3d8491c5a4dfb46dabf00be2e595d16" title="Returns the amount of columns in this matrix.">getColCount</a>()<span class="keyword"> const       </span>{
<a name="l00127"></a>00127                         <span class="keywordflow">return</span> mColumns;
<a name="l00128"></a>00128                 }<span class="comment"></span>
<a name="l00129"></a>00129 <span class="comment">                /**</span>
<a name="l00130"></a>00130 <span class="comment">                  * Extracts a full row from the matrix.</span>
<a name="l00131"></a>00131 <span class="comment">                  * \sa getRowCount,getColumn,setRow</span>
<a name="l00132"></a>00132 <span class="comment">                  * \throw std::logic_error on out of range.</span>
<a name="l00133"></a>00133 <span class="comment">                  */</span>
<a name="l00134"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a71ee65d3839b50f9e2aa4779d7d97ef6">00134</a>                 <span class="keywordtype">void</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a71ee65d3839b50f9e2aa4779d7d97ef6" title="Extracts a full row from the matrix.">getRow</a>(<span class="keywordtype">size_t</span> nRow,<a class="code" href="classstd_1_1vector.html">std::vector&lt;T&gt;</a> &amp;vec)<span class="keyword"> const      </span>{
<a name="l00135"></a>00135 <span class="preprocessor">#if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)</span>
<a name="l00136"></a>00136 <span class="preprocessor"></span>                        <span class="keywordflow">if</span> (nRow&gt;=mRows) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Out of range&quot;</span>);
<a name="l00137"></a>00137 <span class="preprocessor">#endif</span>
<a name="l00138"></a>00138 <span class="preprocessor"></span>                        vec.resize(mColumns);
<a name="l00139"></a>00139                         <span class="keywordtype">size_t</span> nextIndex=0;
<a name="l00140"></a>00140                         <span class="keywordflow">for</span> (<span class="keyword">typename</span> <a class="code" href="eigen__plugins_8h.html#a8dbda719917732693c56cee228465ed9">SparseMatrixMap::const_iterator</a> it=objectList.begin();it!=objectList.end();++it)  {
<a name="l00141"></a>00141                                 <span class="keyword">const</span> pair&lt;size_t,size_t&gt; &amp;index=it-&gt;first;
<a name="l00142"></a>00142                                 <span class="keywordflow">if</span> (index.first&lt;nRow) <span class="keywordflow">continue</span>;
<a name="l00143"></a>00143                                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (index.first==nRow)     {
<a name="l00144"></a>00144                                         <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=nextIndex;i&lt;index.second;i++) vec[i]=T();
<a name="l00145"></a>00145                                         vec[index.second]=it-&gt;second;
<a name="l00146"></a>00146                                         nextIndex=index.second+1;
<a name="l00147"></a>00147                                 }       <span class="keywordflow">else</span>    {
<a name="l00148"></a>00148                                         <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=nextIndex;i&lt;mColumns;i++) vec[i]=T();
<a name="l00149"></a>00149                                         <span class="keywordflow">break</span>;
<a name="l00150"></a>00150                                 }
<a name="l00151"></a>00151                         }
<a name="l00152"></a>00152                 }<span class="comment"></span>
<a name="l00153"></a>00153 <span class="comment">                /**</span>
<a name="l00154"></a>00154 <span class="comment">                  * Extracts a full column from the matrix.</span>
<a name="l00155"></a>00155 <span class="comment">                  * \sa getColCount,getRow,setColumn</span>
<a name="l00156"></a>00156 <span class="comment">                  * \throw std::logic_error on out of range.</span>
<a name="l00157"></a>00157 <span class="comment">                  */</span>
<a name="l00158"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a9948c63043409dbf87c717eb9eac7085">00158</a>                 <span class="keywordtype">void</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a9948c63043409dbf87c717eb9eac7085" title="Extracts a full column from the matrix.">getColumn</a>(<span class="keywordtype">size_t</span> nCol,<a class="code" href="classstd_1_1vector.html">std::vector&lt;T&gt;</a> &amp;vec)<span class="keyword"> const   </span>{
<a name="l00159"></a>00159 <span class="preprocessor">#if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)</span>
<a name="l00160"></a>00160 <span class="preprocessor"></span>                        <span class="keywordflow">if</span> (nCol&gt;=mColumns) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Out of range&quot;</span>);
<a name="l00161"></a>00161 <span class="preprocessor">#endif</span>
<a name="l00162"></a>00162 <span class="preprocessor"></span>                        vec.resize(mRows);
<a name="l00163"></a>00163                         <span class="keywordtype">size_t</span> nextIndex=0;
<a name="l00164"></a>00164                         <span class="keywordflow">for</span> (<span class="keyword">typename</span> <a class="code" href="eigen__plugins_8h.html#a8dbda719917732693c56cee228465ed9">SparseMatrixMap::const_iterator</a> it=objectList.begin();it!=objectList.end();++it)  {
<a name="l00165"></a>00165                                 <span class="keyword">const</span> pair&lt;size_t,size_t&gt; &amp;index=it-&gt;first;
<a name="l00166"></a>00166                                 <span class="keywordflow">if</span> (index.second==nCol) {
<a name="l00167"></a>00167                                         <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=nextIndex;i&lt;index.first;i++) vec[i]=T();
<a name="l00168"></a>00168                                         vec[index.first]=it-&gt;second;
<a name="l00169"></a>00169                                         nextIndex=index.first+1;
<a name="l00170"></a>00170                                 }
<a name="l00171"></a>00171                         }
<a name="l00172"></a>00172                         <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=nextIndex;i&lt;mRows;i++) vec[i]=T();
<a name="l00173"></a>00173                 }<span class="comment"></span>
<a name="l00174"></a>00174 <span class="comment">                /**</span>
<a name="l00175"></a>00175 <span class="comment">                  * Inserts an element into the matrix.</span>
<a name="l00176"></a>00176 <span class="comment">                  * \sa operator()(size_t,size_t)</span>
<a name="l00177"></a>00177 <span class="comment">                  */</span>
<a name="l00178"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a19eef345122d0fdae2e2023a21d39d7f">00178</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a19eef345122d0fdae2e2023a21d39d7f" title="Inserts an element into the matrix.">insert</a>(<span class="keywordtype">size_t</span> row,<span class="keywordtype">size_t</span> column,<span class="keyword">const</span> T&amp; obj)       {
<a name="l00179"></a>00179                         operator()(row,column)=obj;
<a name="l00180"></a>00180                 }
<a name="l00181"></a>00181 <span class="comment"></span>
<a name="l00182"></a>00182 <span class="comment">                /** Inserts submatrix at a given location */</span>
<a name="l00183"></a>00183                 <span class="keyword">template</span> &lt;<span class="keyword">class</span> MATRIX_LIKE&gt;
<a name="l00184"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a968bcd8ff0c21e113c614b7c2655b551">00184</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="eigen__plugins_8h.html#a7ef3e78b94ad34d5dbbd1813f8ee52c5" title="Insert matrix &quot;m&quot; into this matrix at indices (r,c), that is, (*this)(r,c)=m(0,0) and so on...">insertMatrix</a>(<span class="keywordtype">size_t</span> row,<span class="keywordtype">size_t</span> column,<span class="keyword">const</span> MATRIX_LIKE&amp; mat)
<a name="l00185"></a>00185                 {
<a name="l00186"></a>00186                         <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> nr=0;nr&lt;mat.getRowCount();nr++)
<a name="l00187"></a>00187                                 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> nc=0;nc&lt;mat.getColCount();nc++)
<a name="l00188"></a>00188                                         <span class="keyword">operator</span>()(row+nr,column+nc)=mat(nr,nc);
<a name="l00189"></a>00189                 }
<a name="l00190"></a>00190 
<a name="l00191"></a>00191                 <span class="comment">//Public interface only supports const iterators. This way, no user of this class will be able to freely modify it contents.</span><span class="comment"></span>
<a name="l00192"></a>00192 <span class="comment">                /**</span>
<a name="l00193"></a>00193 <span class="comment">                  * Returns an iterator which points to the starting point of the matrix. It&#39;s a const_iterator, so that the usar isn&#39;t able to modify the matrix content into an invalid state.</span>
<a name="l00194"></a>00194 <span class="comment">                  * \sa end,rbegin,rend</span>
<a name="l00195"></a>00195 <span class="comment">                  */</span>
<a name="l00196"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#afcf8eb5ac80e0f37ad19adca335faf6d">00196</a>                 <span class="keyword">inline</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#af0e5e1da6f543184aa09325ff6c358f3" title="Const iterator to move through the matrix.">const_iterator</a> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#afcf8eb5ac80e0f37ad19adca335faf6d" title="Returns an iterator which points to the starting point of the matrix.">begin</a>()<span class="keyword"> const     </span>{
<a name="l00197"></a>00197                         <span class="keywordflow">return</span> objectList.begin();
<a name="l00198"></a>00198                 }<span class="comment"></span>
<a name="l00199"></a>00199 <span class="comment">                /**</span>
<a name="l00200"></a>00200 <span class="comment">                  * Returns an iterator which points to the end of the matrix. It&#39;s a const_iterator, so that the usar isn&#39;t able to modify the matrix content into an invalid state.</span>
<a name="l00201"></a>00201 <span class="comment">                  * \sa begin,rbegin,rend</span>
<a name="l00202"></a>00202 <span class="comment">                  */</span>
<a name="l00203"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#ad22beed94e2b53572d00cae7c4fbb65c">00203</a>                 <span class="keyword">inline</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#af0e5e1da6f543184aa09325ff6c358f3" title="Const iterator to move through the matrix.">const_iterator</a> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#ad22beed94e2b53572d00cae7c4fbb65c" title="Returns an iterator which points to the end of the matrix.">end</a>()<span class="keyword"> const       </span>{
<a name="l00204"></a>00204                         <span class="keywordflow">return</span> objectList.end();
<a name="l00205"></a>00205                 }<span class="comment"></span>
<a name="l00206"></a>00206 <span class="comment">                /**</span>
<a name="l00207"></a>00207 <span class="comment">                  * Returns an iterator which points to the end of the matrix, and can be used to move backwards. It&#39;s a const_reverse_iterator, so that the usar isn&#39;t able to modify the matrix content into an invalid state.</span>
<a name="l00208"></a>00208 <span class="comment">                  * \sa begin,end,rend</span>
<a name="l00209"></a>00209 <span class="comment">                  */</span>
<a name="l00210"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#acbd5ef9fea5f7b9da6b162333aa1e551">00210</a>                 <span class="keyword">inline</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a74ec9d443954f17d0b81fab52062c581" title="Const reverse iterator to move through the matrix.">const_reverse_iterator</a> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#acbd5ef9fea5f7b9da6b162333aa1e551" title="Returns an iterator which points to the end of the matrix, and can be used to move backwards...">rbegin</a>()<span class="keyword"> const    </span>{
<a name="l00211"></a>00211                         <span class="keywordflow">return</span> objectList.rbegin();
<a name="l00212"></a>00212                 }<span class="comment"></span>
<a name="l00213"></a>00213 <span class="comment">                /**</span>
<a name="l00214"></a>00214 <span class="comment">                  * Returns an iterator which points to the starting point of the matrix, although it&#39;s the upper limit of the matrix since it&#39;s a reverse iterator. Also, it&#39;s a const_reverse_iterator, so that the usar isn&#39;t able to modify the matrix content into an invalid state.</span>
<a name="l00215"></a>00215 <span class="comment">                  * \sa begin,end,rbegin</span>
<a name="l00216"></a>00216 <span class="comment">                  */</span>
<a name="l00217"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#ab15f7a77373e4fe825a27c9866b2bce2">00217</a>                 <span class="keyword">inline</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a74ec9d443954f17d0b81fab52062c581" title="Const reverse iterator to move through the matrix.">const_reverse_iterator</a> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#ab15f7a77373e4fe825a27c9866b2bce2" title="Returns an iterator which points to the starting point of the matrix, although it&#39;s the upper limit o...">rend</a>()<span class="keyword"> const      </span>{
<a name="l00218"></a>00218                         <span class="keywordflow">return</span> objectList.rend();
<a name="l00219"></a>00219                 }<span class="comment"></span>
<a name="l00220"></a>00220 <span class="comment">                /**</span>
<a name="l00221"></a>00221 <span class="comment">                  * Inserts a full row into the matrix. The third argument is used to specify a null object (which won&#39;t be inserted, since the matrix is sparse).</span>
<a name="l00222"></a>00222 <span class="comment">                  * \sa getRow</span>
<a name="l00223"></a>00223 <span class="comment">                  * \throw std::logic_error on out of range or wrong sized vector.</span>
<a name="l00224"></a>00224 <span class="comment">                  */</span>
<a name="l00225"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#ad01eb9cffa35cdc51de6e311d437773b">00225</a>                 <span class="keywordtype">void</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#ad01eb9cffa35cdc51de6e311d437773b" title="Inserts a full row into the matrix.">setRow</a>(<span class="keywordtype">size_t</span> nRow,<span class="keyword">const</span> <a class="code" href="classstd_1_1vector.html">std::vector&lt;T&gt;</a> &amp;vec,<span class="keyword">const</span> T&amp; nullObject=T())      {
<a name="l00226"></a>00226 <span class="preprocessor">#if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)</span>
<a name="l00227"></a>00227 <span class="preprocessor"></span>                        <span class="keywordflow">if</span> (nRow&gt;=mRows) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Out of range&quot;</span>);
<a name="l00228"></a>00228 <span class="preprocessor">#endif</span>
<a name="l00229"></a>00229 <span class="preprocessor"></span>                        <span class="keywordtype">size_t</span> N=vec.size();
<a name="l00230"></a>00230                         <span class="keywordflow">if</span> (N!=mColumns) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Wrong-sized vector&quot;</span>);
<a name="l00231"></a>00231                         <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0;i&lt;N;i++)        {
<a name="l00232"></a>00232                                 <span class="keyword">const</span> T &amp;obj=vec[i];
<a name="l00233"></a>00233                                 pair&lt;size_t,size_t&gt; index=make_pair(nRow,i);
<a name="l00234"></a>00234                                 <span class="keywordflow">if</span> (obj==nullObject) objectList.erase(index);
<a name="l00235"></a>00235                                 <span class="keywordflow">else</span> objectList[index]=obj;
<a name="l00236"></a>00236                         }
<a name="l00237"></a>00237                 }<span class="comment"></span>
<a name="l00238"></a>00238 <span class="comment">                /**</span>
<a name="l00239"></a>00239 <span class="comment">                  * Inserts a full column into the matrix. The third argument is used to specify a null object (which won&#39;t be inserted, since the matrix is sparse).</span>
<a name="l00240"></a>00240 <span class="comment">                  * \sa getColumn</span>
<a name="l00241"></a>00241 <span class="comment">                  * \throw std::logic_error on out of range or wrong sized vector.</span>
<a name="l00242"></a>00242 <span class="comment">                  */</span>
<a name="l00243"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a1a19635a67a1e5f04939fc2c596c03b0">00243</a>                 <span class="keywordtype">void</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a1a19635a67a1e5f04939fc2c596c03b0" title="Inserts a full column into the matrix.">setColumn</a>(<span class="keywordtype">size_t</span> nCol,<span class="keyword">const</span> <a class="code" href="classstd_1_1vector.html">std::vector&lt;T&gt;</a> &amp;vec,<span class="keyword">const</span> T&amp; nullObject=T())   {
<a name="l00244"></a>00244 <span class="preprocessor">#if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)</span>
<a name="l00245"></a>00245 <span class="preprocessor"></span>                        <span class="keywordflow">if</span> (nCol&gt;=mColumns) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Out of range&quot;</span>);
<a name="l00246"></a>00246 <span class="preprocessor">#endif</span>
<a name="l00247"></a>00247 <span class="preprocessor"></span>                        <span class="keywordtype">size_t</span> N=vec.size();
<a name="l00248"></a>00248                         <span class="keywordflow">if</span> (N!=mRows) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Wrong-sized vector&quot;</span>);
<a name="l00249"></a>00249                         <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0;i&lt;N;i++)        {
<a name="l00250"></a>00250                                 <span class="keyword">const</span> T &amp;obj=vec[i];
<a name="l00251"></a>00251                                 pair&lt;size_t,size_t&gt; index=make_pair(i,nCol);
<a name="l00252"></a>00252                                 <span class="keywordflow">if</span> (obj==nullObject) objectList.erase(index);
<a name="l00253"></a>00253                                 <span class="keywordflow">else</span> objectList[index]=obj;
<a name="l00254"></a>00254                         }
<a name="l00255"></a>00255                 }<span class="comment"></span>
<a name="l00256"></a>00256 <span class="comment">                /**</span>
<a name="l00257"></a>00257 <span class="comment">                  * Changes the size of the matrix.</span>
<a name="l00258"></a>00258 <span class="comment">                  */</span>
<a name="l00259"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a5082b1f2bb5aec9b1f8b7ce5371bc7c3">00259</a>                 <span class="keywordtype">void</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a5082b1f2bb5aec9b1f8b7ce5371bc7c3" title="Changes the size of the matrix.">resize</a>(<span class="keywordtype">size_t</span> nRows,<span class="keywordtype">size_t</span> nCols)  {
<a name="l00260"></a>00260                         <span class="comment">// if (mRows&lt;0||mColumns&lt;0) throw std::logic_error(&quot;Invalid range&quot;); // This case never happens!</span>
<a name="l00261"></a>00261                         <span class="keywordflow">if</span> (mRows==nRows &amp;&amp; mColumns==nCols) <span class="keywordflow">return</span>;
<a name="l00262"></a>00262                         mRows=nRows;
<a name="l00263"></a>00263                         mColumns=nCols;
<a name="l00264"></a>00264                         std<a class="code" href="classstd_1_1vector.html" title="STL class.">::vector&lt;pair&lt;size_t,size_t&gt;</a> &gt; toErase;
<a name="l00265"></a>00265                         <span class="keywordflow">for</span> (<a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#af0e5e1da6f543184aa09325ff6c358f3" title="Const iterator to move through the matrix.">const_iterator</a> it=objectList.begin();it!=objectList.end();++it)    {
<a name="l00266"></a>00266                                 <span class="keyword">const</span> pair&lt;size_t,size_t&gt; &amp;i=it-&gt;first;
<a name="l00267"></a>00267                                 <span class="keywordflow">if</span> (i.first&gt;=nRows||i.second&gt;=nCols) toErase.push_back(it-&gt;first);
<a name="l00268"></a>00268                         }
<a name="l00269"></a>00269                         <span class="keywordflow">for</span> (<a class="code" href="classstd_1_1vector.html" title="STL class.">std::vector</a>&lt;pair&lt;size_t,size_t&gt; &gt;::<a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#af0e5e1da6f543184aa09325ff6c358f3" title="Const iterator to move through the matrix.">const_iterator</a> it=toErase.begin();it!=toErase.end();++it) objectList.erase(*it);
<a name="l00270"></a>00270                 }<span class="comment"></span>
<a name="l00271"></a>00271 <span class="comment">                /**</span>
<a name="l00272"></a>00272 <span class="comment">                  * Extracts a submatrix form the matrix.</span>
<a name="l00273"></a>00273 <span class="comment">                  * \sa operator()(size_t,size_t)</span>
<a name="l00274"></a>00274 <span class="comment">                  * \throw std::logic_error on invalid bounds.</span>
<a name="l00275"></a>00275 <span class="comment">                  */</span>
<a name="l00276"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#ac44e151c4b80333b0abd0679a8330f66">00276</a>                 <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html">CSparseMatrixTemplate&lt;T&gt;</a> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#ac44e151c4b80333b0abd0679a8330f66" title="Extracts a submatrix form the matrix.">operator()</a>(<span class="keywordtype">size_t</span> firstRow,<span class="keywordtype">size_t</span> lastRow,<span class="keywordtype">size_t</span> firstColumn,<span class="keywordtype">size_t</span> lastColumn)<span class="keyword"> const  </span>{
<a name="l00277"></a>00277 <span class="preprocessor">#if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)</span>
<a name="l00278"></a>00278 <span class="preprocessor"></span>                        <span class="keywordflow">if</span> (lastRow&gt;=mRows||lastColumn&gt;=mColumns) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Out of range&quot;</span>);
<a name="l00279"></a>00279                         <span class="keywordflow">if</span> (firstRow&gt;lastRow||firstColumn&gt;lastColumn) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Invalid size&quot;</span>);
<a name="l00280"></a>00280 <span class="preprocessor">#endif</span>
<a name="l00281"></a>00281 <span class="preprocessor"></span>                        <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html">CSparseMatrixTemplate&lt;T&gt;</a> res=<a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html">CSparseMatrixTemplate&lt;T&gt;</a>(lastRow+1-firstRow,lastColumn+1-firstColumn);
<a name="l00282"></a>00282                         <span class="keywordflow">for</span> (<span class="keyword">typename</span> <a class="code" href="eigen__plugins_8h.html#a8dbda719917732693c56cee228465ed9">SparseMatrixMap::const_iterator</a> it=<a class="code" href="eigen__plugins_8h.html#ab295fd8164bf1b1acecbcb29520d62b7">begin</a>();it!=<a class="code" href="eigen__plugins_8h.html#ade5b39864c905cbb824d0ff6eb0d888c">end</a>();++it)        {
<a name="l00283"></a>00283                                 <span class="keyword">const</span> pair&lt;size_t,size_t&gt; &amp;i=it-&gt;first;
<a name="l00284"></a>00284                                 <span class="keywordflow">if</span> (i.first&gt;=firstRow&amp;&amp;i.first&lt;=lastRow&amp;&amp;i.second&gt;=firstColumn&amp;&amp;i.second&lt;=lastColumn) res(i.first-firstRow,i.second-firstColumn)=it-&gt;second;
<a name="l00285"></a>00285                         }
<a name="l00286"></a>00286                         <span class="keywordflow">return</span> res;
<a name="l00287"></a>00287                 }<span class="comment"></span>
<a name="l00288"></a>00288 <span class="comment">                /**</span>
<a name="l00289"></a>00289 <span class="comment">                  * Gets a vector containing all the elements of the matrix, ignoring their position.</span>
<a name="l00290"></a>00290 <span class="comment">                  */</span>
<a name="l00291"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a2bab052b274c109beb22dae88d33d5e8">00291</a>                 <span class="keywordtype">void</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a2bab052b274c109beb22dae88d33d5e8" title="Gets a vector containing all the elements of the matrix, ignoring their position.">getAsVector</a>(<a class="code" href="classstd_1_1vector.html">std::vector&lt;T&gt;</a> &amp;vec)<span class="keyword"> const     </span>{
<a name="l00292"></a>00292                         <span class="keywordtype">size_t</span> N=objectList.size();
<a name="l00293"></a>00293                         vec.resize(0);
<a name="l00294"></a>00294                         vec.reserve(N);
<a name="l00295"></a>00295                         <span class="keywordflow">for</span> (<a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#af0e5e1da6f543184aa09325ff6c358f3" title="Const iterator to move through the matrix.">const_iterator</a> it=objectList.begin();it!=objectList.end();++it) vec.push_back(it-&gt;second);
<a name="l00296"></a>00296                 }<span class="comment"></span>
<a name="l00297"></a>00297 <span class="comment">                /**</span>
<a name="l00298"></a>00298 <span class="comment">                  * Gets the amount of non-null elements inside the matrix.</span>
<a name="l00299"></a>00299 <span class="comment">                  * \sa getNullElements,isNull,isNotNull</span>
<a name="l00300"></a>00300 <span class="comment">                  */</span>
<a name="l00301"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a5d0fa6333648b6433ebd9b62172c968b">00301</a>                 <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a5d0fa6333648b6433ebd9b62172c968b" title="Gets the amount of non-null elements inside the matrix.">getNonNullElements</a>()<span class="keyword"> const        </span>{
<a name="l00302"></a>00302                         <span class="keywordflow">return</span> objectList.size();
<a name="l00303"></a>00303                 }<span class="comment"></span>
<a name="l00304"></a>00304 <span class="comment">                /** Are there no elements set to !=0 ?</span>
<a name="l00305"></a>00305 <span class="comment">                  * \sa getNullElements,isNull,isNotNull</span>
<a name="l00306"></a>00306 <span class="comment">                  */</span>
<a name="l00307"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a6b717486d2d69655b30d110db4165bd7">00307</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a6b717486d2d69655b30d110db4165bd7" title="Are there no elements set to !=0 ?">empty</a>()<span class="keyword"> const       </span>{ <span class="keywordflow">return</span> objectList.empty(); }
<a name="l00308"></a>00308 <span class="comment"></span>
<a name="l00309"></a>00309 <span class="comment">                /**</span>
<a name="l00310"></a>00310 <span class="comment">                  * Gets the amount of null elements inside the matrix.</span>
<a name="l00311"></a>00311 <span class="comment">                  * \sa getNonNullElements,isNull,isNotNull</span>
<a name="l00312"></a>00312 <span class="comment">                  */</span>
<a name="l00313"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a71e8ea88fef40c9ce94fb840e8c76f2a">00313</a>                 <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a71e8ea88fef40c9ce94fb840e8c76f2a" title="Gets the amount of null elements inside the matrix.">getNullElements</a>()<span class="keyword"> const   </span>{
<a name="l00314"></a>00314                         <span class="keywordflow">return</span> mRows*mColumns-getNonNullElements();
<a name="l00315"></a>00315                 }<span class="comment"></span>
<a name="l00316"></a>00316 <span class="comment">                /**</span>
<a name="l00317"></a>00317 <span class="comment">                  * Checks whether an element of the matrix is the default object.</span>
<a name="l00318"></a>00318 <span class="comment">                  * \sa getNonNullElements,getNullElements,isNotNull</span>
<a name="l00319"></a>00319 <span class="comment">                  * \throw std::logic_error on out of range</span>
<a name="l00320"></a>00320 <span class="comment">                  */</span>
<a name="l00321"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#abbba59026b3c0708a9dc2ce1d052d107">00321</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#abbba59026b3c0708a9dc2ce1d052d107" title="Checks whether an element of the matrix is the default object.">isNull</a>(<span class="keywordtype">size_t</span> nRow,<span class="keywordtype">size_t</span> nCol)<span class="keyword"> const       </span>{
<a name="l00322"></a>00322                         <span class="keywordflow">if</span> (nRow&gt;=mRows||nCol&gt;=mColumns) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Out of range&quot;</span>);
<a name="l00323"></a>00323                         <span class="keywordflow">return</span> objectList.count(make_pair(nRow,nCol))==0;
<a name="l00324"></a>00324                 }<span class="comment"></span>
<a name="l00325"></a>00325 <span class="comment">                /**</span>
<a name="l00326"></a>00326 <span class="comment">                  * Checks whether an element of the matrix is not the default object.</span>
<a name="l00327"></a>00327 <span class="comment">                  * \sa getNonNullElements,getNullElements,isNull</span>
<a name="l00328"></a>00328 <span class="comment">                  */</span>
<a name="l00329"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a5111f7b0acb99ab99c4e798cb73b6cf8">00329</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a5111f7b0acb99ab99c4e798cb73b6cf8" title="Checks whether an element of the matrix is not the default object.">isNotNull</a>(<span class="keywordtype">size_t</span> nRow,<span class="keywordtype">size_t</span> nCol)<span class="keyword"> const    </span>{
<a name="l00330"></a>00330                         <span class="keywordflow">if</span> (nRow&gt;=mRows||nCol&gt;=mColumns) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Out of range&quot;</span>);
<a name="l00331"></a>00331                         <span class="keywordflow">return</span> objectList.count(make_pair(nRow,nCol))&gt;0;
<a name="l00332"></a>00332                 }<span class="comment"></span>
<a name="l00333"></a>00333 <span class="comment">                /**</span>
<a name="l00334"></a>00334 <span class="comment">                  * Completely removes all elements, although maintaining the matrix&#39;s size.</span>
<a name="l00335"></a>00335 <span class="comment">                  */</span>
<a name="l00336"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a731b30d399c81cc6261bcca28ed60b7f">00336</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#a731b30d399c81cc6261bcca28ed60b7f" title="Completely removes all elements, although maintaining the matrix&#39;s size.">clear</a>()     {
<a name="l00337"></a>00337                         objectList.clear();
<a name="l00338"></a>00338                 }<span class="comment"></span>
<a name="l00339"></a>00339 <span class="comment">                /**</span>
<a name="l00340"></a>00340 <span class="comment">                  * Checks each non-null elements against the basic objects, erasing unnecesary references to it.</span>
<a name="l00341"></a>00341 <span class="comment">                  */</span>
<a name="l00342"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#afcf0a2e922398169f5cc92c7520b0832">00342</a>                 <span class="keywordtype">void</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#afcf0a2e922398169f5cc92c7520b0832" title="Checks each non-null elements against the basic objects, erasing unnecesary references to it...">purge</a>(T nullObject=T())    {
<a name="l00343"></a>00343                         std<a class="code" href="classstd_1_1vector.html" title="STL class.">::vector&lt;std::pair&lt;size_t,size_t&gt;</a> &gt; nulls;
<a name="l00344"></a>00344                         <span class="keywordflow">for</span> (<a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#af0e5e1da6f543184aa09325ff6c358f3" title="Const iterator to move through the matrix.">const_iterator</a> it=<a class="code" href="eigen__plugins_8h.html#ab295fd8164bf1b1acecbcb29520d62b7">begin</a>();it!=<a class="code" href="eigen__plugins_8h.html#ade5b39864c905cbb824d0ff6eb0d888c">end</a>();++it) <span class="keywordflow">if</span> (it-&gt;second==nullObject) nulls.push_back(it-&gt;first);
<a name="l00345"></a>00345                         <span class="keywordflow">for</span> (<a class="code" href="classstd_1_1vector.html" title="STL class.">std::vector</a>&lt;std::pair&lt;size_t,size_t&gt; &gt;::<a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html#af0e5e1da6f543184aa09325ff6c358f3" title="Const iterator to move through the matrix.">const_iterator</a> it=nulls.begin();it!=nulls.end();++it) objectList.erase(*it);
<a name="l00346"></a>00346                 }
<a name="l00347"></a>00347         }; <span class="comment">// end of sparse matrix</span>
<a name="l00348"></a>00348 <span class="comment"></span>
<a name="l00349"></a>00349 <span class="comment">    /** A sparse matrix container for square symmetrical content around the main diagonal.</span>
<a name="l00350"></a>00350 <span class="comment">      *  This class saves half of the space with respect to CSparseMatrixTemplate since only those entries (c,r) such as c&gt;=r are really stored,</span>
<a name="l00351"></a>00351 <span class="comment">      *   but both (c,r) and (r,c) can be retrieved or set and both redirect to the same internal cell container.</span>
<a name="l00352"></a>00352 <span class="comment">      *  \sa CSparseMatrixTemplate</span>
<a name="l00353"></a>00353 <span class="comment">      */</span>
<a name="l00354"></a>00354         <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;
<a name="l00355"></a>00355         <span class="keyword">class </span>CSparseSymmetricalMatrix : <span class="keyword">public</span> CSparseMatrixTemplate&lt;T&gt; {
<a name="l00356"></a>00356                 <span class="keyword">public</span>:
<a name="l00357"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#ae756095647b8f7098429862aea17bce5">00357</a>                 <a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#ae756095647b8f7098429862aea17bce5">CSparseSymmetricalMatrix</a>() : <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html" title="A sparse matrix container (with cells of any type), with iterators.">CSparseMatrixTemplate</a>&lt;T&gt;() { }
<a name="l00358"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#aaf7d77ce54d291694d192e6be8550078">00358</a>                 <span class="keyword">explicit</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#aaf7d77ce54d291694d192e6be8550078">CSparseSymmetricalMatrix</a>(<span class="keyword">const</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html" title="A sparse matrix container for square symmetrical content around the main diagonal.">CSparseSymmetricalMatrix</a> &amp;o) : <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html" title="A sparse matrix container (with cells of any type), with iterators.">CSparseMatrixTemplate</a>&lt;T&gt;(o) { }
<a name="l00359"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#af5a33edbc9596de75496e0825eec09dc">00359</a>                 <span class="keyword">explicit</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#af5a33edbc9596de75496e0825eec09dc">CSparseSymmetricalMatrix</a>(<span class="keyword">const</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html">CSparseMatrixTemplate&lt;T&gt;</a> &amp;o) : <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html" title="A sparse matrix container (with cells of any type), with iterators.">CSparseMatrixTemplate</a>&lt;T&gt;(o) { }
<a name="l00360"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#a9f73696c968ea5c12963f3e6f9ba4f47">00360</a>                 <span class="keyword">virtual</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#a9f73696c968ea5c12963f3e6f9ba4f47">~CSparseSymmetricalMatrix</a>() { }
<a name="l00361"></a>00361 
<a name="l00362"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#aee0c0f407c67443f3d2cb2e1af697239">00362</a>                 <span class="keywordtype">void</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#aee0c0f407c67443f3d2cb2e1af697239">resize</a>(<span class="keywordtype">size_t</span> matrixSize) {
<a name="l00363"></a>00363                         <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html" title="A sparse matrix container (with cells of any type), with iterators.">CSparseMatrixTemplate&lt;T&gt;::resize</a>(matrixSize,matrixSize);
<a name="l00364"></a>00364                 }
<a name="l00365"></a>00365 
<a name="l00366"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#a384f17f143b017df9e351fc287c3fc0f">00366</a>                 <span class="keyword">inline</span> T <a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#a384f17f143b017df9e351fc287c3fc0f" title="Element access operator.">operator()</a>(<span class="keywordtype">size_t</span> r,<span class="keywordtype">size_t</span> c)<span class="keyword"> const    </span>{
<a name="l00367"></a>00367                         <span class="keywordflow">if</span> (c&lt;r) std::swap(r,c); <span class="comment">// Symmetrical matrix</span>
<a name="l00368"></a>00368                         <span class="keyword">typename</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html" title="A sparse matrix container (with cells of any type), with iterators.">CSparseMatrixTemplate&lt;T&gt;::const_iterator</a> it=<a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html" title="A sparse matrix container (with cells of any type), with iterators.">CSparseMatrixTemplate&lt;T&gt;::objectList</a>.find(make_pair(r,c));
<a name="l00369"></a>00369                         <span class="keywordflow">if</span> (it==<a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html" title="A sparse matrix container (with cells of any type), with iterators.">CSparseMatrixTemplate&lt;T&gt;::objectList</a>.<a class="code" href="eigen__plugins_8h.html#ade5b39864c905cbb824d0ff6eb0d888c">end</a>()) <span class="keywordflow">return</span> T();
<a name="l00370"></a>00370                         <span class="keywordflow">else</span> <span class="keywordflow">return</span> it-&gt;second;
<a name="l00371"></a>00371                 }
<a name="l00372"></a><a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#ae86e074b3c8947fa9d0956d6813645e5">00372</a>                 <span class="keyword">inline</span> T&amp; <a class="code" href="classmrpt_1_1math_1_1_c_sparse_symmetrical_matrix.html#ae86e074b3c8947fa9d0956d6813645e5" title="Reference access operator.">operator()</a>(<span class="keywordtype">size_t</span> r,<span class="keywordtype">size_t</span> c) {
<a name="l00373"></a>00373                         <span class="keywordflow">if</span> (c&lt;r) std::swap(r,c); <span class="comment">// Symmetrical matrix</span>
<a name="l00374"></a>00374                         <span class="keywordflow">if</span> (r&gt;=<a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html" title="A sparse matrix container (with cells of any type), with iterators.">CSparseMatrixTemplate&lt;T&gt;::mRows</a>||c&gt;=<a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html" title="A sparse matrix container (with cells of any type), with iterators.">CSparseMatrixTemplate&lt;T&gt;::mColumns</a>) <span class="keywordflow">throw</span> <a class="code" href="classstd_1_1logic__error.html" title="STL class.">std::logic_error</a>(<span class="stringliteral">&quot;Out of range&quot;</span>);
<a name="l00375"></a>00375                         <span class="keywordflow">return</span> <a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html" title="A sparse matrix container (with cells of any type), with iterators.">CSparseMatrixTemplate&lt;T&gt;::objectList</a>[make_pair(r,c)];
<a name="l00376"></a>00376                 }
<a name="l00377"></a>00377 
<a name="l00378"></a>00378         }; <span class="comment">// end of CSparseSymmetricalMatrix</span>
<a name="l00379"></a>00379 
<a name="l00380"></a>00380 }
<a name="l00381"></a>00381 }
<a name="l00382"></a>00382 <span class="preprocessor">#endif</span>
</pre></div></div>
</div>
<br><hr><br> <table border="0" width="100%"> <tr> <td> Page generated by <a href="http://www.doxygen.org" target="_blank">Doxygen 1.7.5</a> for MRPT 0.9.5 SVN: at Sun Sep 25 17:20:18 UTC 2011</td><td></td> <td width="100"> </td> <td width="150">  </td></tr> </table>  </body></html>