<!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> > <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 Page</span></a></li> <li><a href="pages.html"><span>Related 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 List</span></a></li> <li><a href="globals.html"><span>File 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 <jlblanco@ctima.uma.es> |</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 <http://www.gnu.org/licenses/>. |</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 <<a class="code" href="utils__defs_8h.html">mrpt/utils/utils_defs.h</a>></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: "M(2,3)=8;".</span> <a name="l00039"></a>00039 <span class="comment"> *</span> <a name="l00040"></a>00040 <span class="comment"> * This class doesn't implement math operations since it'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 "exists(i,j)" 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 "Doesn't check bounds" 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><<span class="keyword">class</span> T> <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<std::pair<size_t,size_t></a>,T> <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'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->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>=mRows||c>=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">"Out of range"</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& <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>=mRows||c>=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">"Out of range"</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<T></a> &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>=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">"Out of range"</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<size_t,size_t> &index=it->first; <a name="l00142"></a>00142 <span class="keywordflow">if</span> (index.first<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<index.second;i++) vec[i]=T(); <a name="l00145"></a>00145 vec[index.second]=it->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<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<T></a> &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>=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">"Out of range"</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<size_t,size_t> &index=it->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<index.first;i++) vec[i]=T(); <a name="l00168"></a>00168 vec[index.first]=it->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<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& 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> <<span class="keyword">class</span> MATRIX_LIKE> <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 "m" 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& 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<mat.getRowCount();nr++) <a name="l00187"></a>00187 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> nc=0;nc<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's a const_iterator, so that the usar isn'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's a const_iterator, so that the usar isn'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's a const_reverse_iterator, so that the usar isn'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's the upper limit of the matrix since it's a reverse iterator. Also, it's a const_reverse_iterator, so that the usar isn'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'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'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<T></a> &vec,<span class="keyword">const</span> T& 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>=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">"Out of range"</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">"Wrong-sized vector"</span>); <a name="l00231"></a>00231 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0;i<N;i++) { <a name="l00232"></a>00232 <span class="keyword">const</span> T &obj=vec[i]; <a name="l00233"></a>00233 pair<size_t,size_t> 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'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<T></a> &vec,<span class="keyword">const</span> T& 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>=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">"Out of range"</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">"Wrong-sized vector"</span>); <a name="l00249"></a>00249 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0;i<N;i++) { <a name="l00250"></a>00250 <span class="keyword">const</span> T &obj=vec[i]; <a name="l00251"></a>00251 pair<size_t,size_t> 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<0||mColumns<0) throw std::logic_error("Invalid range"); // This case never happens!</span> <a name="l00261"></a>00261 <span class="keywordflow">if</span> (mRows==nRows && 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<pair<size_t,size_t></a> > 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<size_t,size_t> &i=it->first; <a name="l00267"></a>00267 <span class="keywordflow">if</span> (i.first>=nRows||i.second>=nCols) toErase.push_back(it->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><pair<size_t,size_t> >::<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<T></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>=mRows||lastColumn>=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">"Out of range"</span>); <a name="l00279"></a>00279 <span class="keywordflow">if</span> (firstRow>lastRow||firstColumn>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">"Invalid size"</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<T></a> res=<a class="code" href="classmrpt_1_1math_1_1_c_sparse_matrix_template.html">CSparseMatrixTemplate<T></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<size_t,size_t> &i=it->first; <a name="l00284"></a>00284 <span class="keywordflow">if</span> (i.first>=firstRow&&i.first<=lastRow&&i.second>=firstColumn&&i.second<=lastColumn) res(i.first-firstRow,i.second-firstColumn)=it->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<T></a> &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->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>=mRows||nCol>=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">"Out of range"</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>=mRows||nCol>=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">"Out of range"</span>); <a name="l00331"></a>00331 <span class="keywordflow">return</span> objectList.count(make_pair(nRow,nCol))>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'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'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<std::pair<size_t,size_t></a> > 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->second==nullObject) nulls.push_back(it->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><std::pair<size_t,size_t> >::<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>=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><<span class="keyword">class</span> T> <a name="l00355"></a>00355 <span class="keyword">class </span>CSparseSymmetricalMatrix : <span class="keyword">public</span> CSparseMatrixTemplate<T> { <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><T>() { } <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> &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><T>(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<T></a> &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><T>(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<T>::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<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<T>::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<T>::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<T>::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->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& <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<r) std::swap(r,c); <span class="comment">// Symmetrical matrix</span> <a name="l00374"></a>00374 <span class="keywordflow">if</span> (r>=<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<T>::mRows</a>||c>=<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<T>::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">"Out of range"</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<T>::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>