<!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>The MRPT project: SparseMatrix.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.2 --> <script type="text/javascript"><!-- var searchBox = new SearchBox("searchBox", "search",false,'Search'); --></script> <div class="navigation" id="top"> <div 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 id="searchli"> <div id="MSearchBox" class="MSearchBoxInactive"> <span 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> </span><span class="right"></span> </div> </li> </ul> </div> <div 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"> <h1>SparseMatrix.h</h1> </div> </div> <div class="contents"> <a href="_sparse_matrix_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// This file is part of Eigen, a lightweight C++ template library</span> <a name="l00002"></a>00002 <span class="comment">// for linear algebra.</span> <a name="l00003"></a>00003 <span class="comment">//</span> <a name="l00004"></a>00004 <span class="comment">// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr></span> <a name="l00005"></a>00005 <span class="comment">//</span> <a name="l00006"></a>00006 <span class="comment">// Eigen is free software; you can redistribute it and/or</span> <a name="l00007"></a>00007 <span class="comment">// modify it under the terms of the GNU Lesser General Public</span> <a name="l00008"></a>00008 <span class="comment">// License as published by the Free Software Foundation; either</span> <a name="l00009"></a>00009 <span class="comment">// version 3 of the License, or (at your option) any later version.</span> <a name="l00010"></a>00010 <span class="comment">//</span> <a name="l00011"></a>00011 <span class="comment">// Alternatively, you can redistribute it and/or</span> <a name="l00012"></a>00012 <span class="comment">// modify it under the terms of the GNU General Public License as</span> <a name="l00013"></a>00013 <span class="comment">// published by the Free Software Foundation; either version 2 of</span> <a name="l00014"></a>00014 <span class="comment">// the License, or (at your option) any later version.</span> <a name="l00015"></a>00015 <span class="comment">//</span> <a name="l00016"></a>00016 <span class="comment">// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY</span> <a name="l00017"></a>00017 <span class="comment">// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS</span> <a name="l00018"></a>00018 <span class="comment">// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the</span> <a name="l00019"></a>00019 <span class="comment">// GNU General Public License for more details.</span> <a name="l00020"></a>00020 <span class="comment">//</span> <a name="l00021"></a>00021 <span class="comment">// You should have received a copy of the GNU Lesser General Public</span> <a name="l00022"></a>00022 <span class="comment">// License and a copy of the GNU General Public License along with</span> <a name="l00023"></a>00023 <span class="comment">// Eigen. If not, see <http://www.gnu.org/licenses/>.</span> <a name="l00024"></a>00024 <a name="l00025"></a>00025 <span class="preprocessor">#ifndef EIGEN_SPARSEMATRIX_H</span> <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define EIGEN_SPARSEMATRIX_H</span> <a name="l00027"></a>00027 <span class="preprocessor"></span><span class="comment"></span> <a name="l00028"></a>00028 <span class="comment">/** \ingroup Sparse_Module</span> <a name="l00029"></a>00029 <span class="comment"> *</span> <a name="l00030"></a>00030 <span class="comment"> * \class SparseMatrix</span> <a name="l00031"></a>00031 <span class="comment"> *</span> <a name="l00032"></a>00032 <span class="comment"> * \brief The main sparse matrix class</span> <a name="l00033"></a>00033 <span class="comment"> *</span> <a name="l00034"></a>00034 <span class="comment"> * This class implements a sparse matrix using the very common compressed row/column storage</span> <a name="l00035"></a>00035 <span class="comment"> * scheme.</span> <a name="l00036"></a>00036 <span class="comment"> *</span> <a name="l00037"></a>00037 <span class="comment"> * \param _Scalar the scalar type, i.e. the type of the coefficients</span> <a name="l00038"></a>00038 <span class="comment"> * \param _Options Union of bit flags controlling the storage scheme. Currently the only possibility</span> <a name="l00039"></a>00039 <span class="comment"> * is RowMajor. The default is 0 which means column-major.</span> <a name="l00040"></a>00040 <span class="comment"> * \param _Index the type of the indices. Default is \c int.</span> <a name="l00041"></a>00041 <span class="comment"> *</span> <a name="l00042"></a>00042 <span class="comment"> * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme.</span> <a name="l00043"></a>00043 <span class="comment"> *</span> <a name="l00044"></a>00044 <span class="comment"> */</span> <a name="l00045"></a>00045 <a name="l00046"></a>00046 <span class="keyword">namespace </span>internal { <a name="l00047"></a>00047 <span class="keyword">template</span><<span class="keyword">typename</span> _Scalar, <span class="keywordtype">int</span> _Options, <span class="keyword">typename</span> _Index> <a name="l00048"></a><a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html">00048</a> <span class="keyword">struct </span>traits<<a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a><_Scalar, _Options, _Index> > <a name="l00049"></a>00049 { <a name="l00050"></a><a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a2cbdfff8c5ac52de631367a83e1a375e">00050</a> <span class="keyword">typedef</span> _Scalar <a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a2cbdfff8c5ac52de631367a83e1a375e">Scalar</a>; <a name="l00051"></a><a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a2755f7be38db175f4e4d24ac60d617d1">00051</a> <span class="keyword">typedef</span> _Index <a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a2755f7be38db175f4e4d24ac60d617d1">Index</a>; <a name="l00052"></a><a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a52c60205ec00de3fdd73a1617c45fbbc">00052</a> <span class="keyword">typedef</span> Sparse <a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a52c60205ec00de3fdd73a1617c45fbbc">StorageKind</a>; <a name="l00053"></a><a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a4b283a58697bcfe325652d6a766a2af4">00053</a> <span class="keyword">typedef</span> <a class="code" href="struct_matrix_xpr.html" title="The type used to identify a matrix expression.">MatrixXpr</a> <a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a4b283a58697bcfe325652d6a766a2af4">XprKind</a>; <a name="l00054"></a>00054 <span class="keyword">enum</span> { <a name="l00055"></a><a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a1d633255e8a628631cf88fa6de8bc0c3a3479b6e867aea2e778abca64caa6cf49">00055</a> RowsAtCompileTime = <a class="code" href="_constants_8h.html#adc9da5be31bdce40c25a92c27999c0e3" title="This value means that a quantity is not known at compile-time, and that instead the value is stored i...">Dynamic</a>, <a name="l00056"></a><a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a1d633255e8a628631cf88fa6de8bc0c3a4b11b6b6bd4d54b3d547f562ab9288d1">00056</a> ColsAtCompileTime = <a class="code" href="_constants_8h.html#adc9da5be31bdce40c25a92c27999c0e3" title="This value means that a quantity is not known at compile-time, and that instead the value is stored i...">Dynamic</a>, <a name="l00057"></a><a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a1d633255e8a628631cf88fa6de8bc0c3af26bf2a1792a297aac9a72b8c60de017">00057</a> MaxRowsAtCompileTime = <a class="code" href="_constants_8h.html#adc9da5be31bdce40c25a92c27999c0e3" title="This value means that a quantity is not known at compile-time, and that instead the value is stored i...">Dynamic</a>, <a name="l00058"></a><a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a1d633255e8a628631cf88fa6de8bc0c3ad1c6b54f5ad4cf32b04f3ea1725bfb46">00058</a> MaxColsAtCompileTime = <a class="code" href="_constants_8h.html#adc9da5be31bdce40c25a92c27999c0e3" title="This value means that a quantity is not known at compile-time, and that instead the value is stored i...">Dynamic</a>, <a name="l00059"></a><a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a1d633255e8a628631cf88fa6de8bc0c3a0f0ee5ccca4701e27ebf5ffd56d521f6">00059</a> Flags = _Options | <a class="code" href="_constants_8h.html#ade73e088e9921d459e89667b7c96cadb">NestByRefBit</a> | <a class="code" href="group__flags.html#ga64e21b7543bdedce27f013512a4403a3" title="Means the expression has a coeffRef() method, i.e.">LvalueBit</a>, <a name="l00060"></a><a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a1d633255e8a628631cf88fa6de8bc0c3acbdd4bcfe72b4ca99c12784a2c3bda34">00060</a> CoeffReadCost = <a class="code" href="struct_num_traits.html" title="Holds information about the various numeric (i.e.">NumTraits<Scalar>::ReadCost</a>, <a name="l00061"></a><a class="code" href="structinternal_1_1traits_3_01_sparse_matrix_3_01___scalar_00_01___options_00_01___index_01_4_01_4.html#a1d633255e8a628631cf88fa6de8bc0c3aedc3221bea124fc6c5d1dd17ba0a0847">00061</a> SupportedAccessPatterns = <a class="code" href="_sparse_util_8h.html#a261fdd53c867f5f29679505ce6d1867c">InnerRandomAccessPattern</a> <a name="l00062"></a>00062 }; <a name="l00063"></a>00063 }; <a name="l00064"></a>00064 } <span class="comment">// end namespace internal</span> <a name="l00065"></a>00065 <a name="l00066"></a>00066 <span class="keyword">template</span><<span class="keyword">typename</span> _Scalar, <span class="keywordtype">int</span> _Options, <span class="keyword">typename</span> _Index> <a name="l00067"></a><a class="code" href="class_sparse_matrix.html">00067</a> <span class="keyword">class </span><a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a> <a name="l00068"></a>00068 : <span class="keyword">public</span> <a class="code" href="class_sparse_matrix_base.html" title="Base class of any sparse matrices or sparse expressions.">SparseMatrixBase</a><SparseMatrix<_Scalar, _Options, _Index> > <a name="l00069"></a>00069 { <a name="l00070"></a>00070 <span class="keyword">public</span>: <a name="l00071"></a>00071 <a class="code" href="_sparse_util_8h.html#a936f4ca73ea9a70e080520f8c7c4fa03">EIGEN_SPARSE_PUBLIC_INTERFACE</a>(<a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a>) <a name="l00072"></a>00072 <span class="keyword">using</span> Base::operator=; <a name="l00073"></a>00073 <a class="code" href="_sparse_util_8h.html#aa49d12e32c9621b2130abc38a317e7b8">EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR</a>(<a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a>, +=) <a name="l00074"></a>00074 <a class="code" href="_sparse_util_8h.html#aa49d12e32c9621b2130abc38a317e7b8">EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR</a>(<a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a>, -=) <a name="l00075"></a>00075 <span class="comment">// FIXME: why are these operator already alvailable ???</span> <a name="l00076"></a>00076 <span class="comment">// EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(SparseMatrix, *=)</span> <a name="l00077"></a>00077 <span class="comment">// EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(SparseMatrix, /=)</span> <a name="l00078"></a>00078 <a name="l00079"></a><a class="code" href="class_sparse_matrix.html#a55d9682b19bf142c7e4af3a76da03cc8">00079</a> typedef <a class="code" href="class_mapped_sparse_matrix.html" title="Sparse matrix.">MappedSparseMatrix</a><<a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>,<a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701adb11b5d4625dc81c28848af1ec6dac18" title="This stores expression Flags flags which may or may not be inherited by new expressions constructed f...">Flags</a>> <a class="code" href="class_mapped_sparse_matrix.html" title="Sparse matrix.">Map</a>; <a name="l00080"></a>00080 using <a class="code" href="class_sparse_matrix_base.html#a1115fc94453a8d25338195b7a630cbf9">Base</a>::<a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a>; <a name="l00081"></a><a class="code" href="class_sparse_matrix.html#aee1c8820e2b1f316ceed7a8f54099c00">00081</a> typedef <a class="code" href="class_compressed_storage.html" title="Stores a sparse set of values as a list of values and a list of indices.">CompressedStorage</a><Scalar,<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a>> <a class="code" href="class_compressed_storage.html">Storage</a>; <a name="l00082"></a>00082 enum { <a name="l00083"></a><a class="code" href="class_sparse_matrix.html#a21ded6b8e704b166577fdf12a2e34945ac911f0217a58b12e211ab3daa6184c63">00083</a> <a class="code" href="class_sparse_matrix.html#a21ded6b8e704b166577fdf12a2e34945ac911f0217a58b12e211ab3daa6184c63">Options</a> = _Options <a name="l00084"></a>00084 }; <a name="l00085"></a>00085 <a name="l00086"></a>00086 <span class="keyword">protected</span>: <a name="l00087"></a>00087 <a name="l00088"></a><a class="code" href="class_sparse_matrix.html#ac0da011e8297c7267705900d45892aa5">00088</a> <span class="keyword">typedef</span> <a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix<Scalar,(Flags&~RowMajorBit)|(IsRowMajor?RowMajorBit:0)></a> <a class="code" href="class_sparse_matrix.html#ac0da011e8297c7267705900d45892aa5">TransposedSparseMatrix</a>; <a name="l00089"></a>00089 <a name="l00090"></a><a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">00090</a> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>; <a name="l00091"></a><a class="code" href="class_sparse_matrix.html#a4e48d9cd903fd687b6c288d9c8b4d4e1">00091</a> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#a4e48d9cd903fd687b6c288d9c8b4d4e1">m_innerSize</a>; <a name="l00092"></a><a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">00092</a> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a>* <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>; <a name="l00093"></a><a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">00093</a> <a class="code" href="class_compressed_storage.html">CompressedStorage<Scalar,Index></a> <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>; <a name="l00094"></a>00094 <a name="l00095"></a>00095 <span class="keyword">public</span>: <a name="l00096"></a>00096 <a name="l00097"></a><a class="code" href="class_sparse_matrix.html#a08ea96e4a43cad89fe8803b17b3a200a">00097</a> <span class="keyword">inline</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#a08ea96e4a43cad89fe8803b17b3a200a">rows</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? <a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a> : <a class="code" href="class_sparse_matrix.html#a4e48d9cd903fd687b6c288d9c8b4d4e1">m_innerSize</a>; } <a name="l00098"></a><a class="code" href="class_sparse_matrix.html#a0db0dfa1ad560120debf4ac2b1de51de">00098</a> <span class="keyword">inline</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#a0db0dfa1ad560120debf4ac2b1de51de">cols</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? <a class="code" href="class_sparse_matrix.html#a4e48d9cd903fd687b6c288d9c8b4d4e1">m_innerSize</a> : <a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>; } <a name="l00099"></a>00099 <a name="l00100"></a><a class="code" href="class_sparse_matrix.html#a9ff57888bd1954bfe67e2972a0dcaefa">00100</a> <span class="keyword">inline</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#a9ff57888bd1954bfe67e2972a0dcaefa">innerSize</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a4e48d9cd903fd687b6c288d9c8b4d4e1">m_innerSize</a>; } <a name="l00101"></a><a class="code" href="class_sparse_matrix.html#a4469108db20a12c3791e76bb6931dbfd">00101</a> <span class="keyword">inline</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#a4469108db20a12c3791e76bb6931dbfd">outerSize</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>; } <a name="l00102"></a><a class="code" href="class_sparse_matrix.html#a9f9cb117050cdd0122ccf52a1db17be5">00102</a> <span class="keyword">inline</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#a9f9cb117050cdd0122ccf52a1db17be5">innerNonZeros</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> j)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[j+1]-<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[j]; } <a name="l00103"></a>00103 <a name="l00104"></a><a class="code" href="class_sparse_matrix.html#a91cdd6245a07406d15a34b56b7bf95d2">00104</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>* <a class="code" href="class_sparse_matrix.html#a91cdd6245a07406d15a34b56b7bf95d2">_valuePtr</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(0); } <a name="l00105"></a><a class="code" href="class_sparse_matrix.html#add8b25ec1b52fd048f7d3d507337bd25">00105</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>* <a class="code" href="class_sparse_matrix.html#add8b25ec1b52fd048f7d3d507337bd25">_valuePtr</a>() { <span class="keywordflow">return</span> &<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(0); } <a name="l00106"></a>00106 <a name="l00107"></a><a class="code" href="class_sparse_matrix.html#af1b1f6920f2002ea76ec7bb0ce662f74">00107</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a>* <a class="code" href="class_sparse_matrix.html#af1b1f6920f2002ea76ec7bb0ce662f74">_innerIndexPtr</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(0); } <a name="l00108"></a><a class="code" href="class_sparse_matrix.html#a6d83d0e72ca97b63cd04859c7555f4cb">00108</a> <span class="keyword">inline</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a>* <a class="code" href="class_sparse_matrix.html#a6d83d0e72ca97b63cd04859c7555f4cb">_innerIndexPtr</a>() { <span class="keywordflow">return</span> &<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(0); } <a name="l00109"></a>00109 <a name="l00110"></a><a class="code" href="class_sparse_matrix.html#a6b49f2197f3c7ad618e030b8fc602845">00110</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a>* <a class="code" href="class_sparse_matrix.html#a6b49f2197f3c7ad618e030b8fc602845">_outerIndexPtr</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>; } <a name="l00111"></a><a class="code" href="class_sparse_matrix.html#afc3f91ed6e8b71dc017b4c835f0b0500">00111</a> <span class="keyword">inline</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a>* <a class="code" href="class_sparse_matrix.html#afc3f91ed6e8b71dc017b4c835f0b0500">_outerIndexPtr</a>() { <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>; } <a name="l00112"></a>00112 <a name="l00113"></a><a class="code" href="class_sparse_matrix.html#a29763545859ceac7193ecb453df1c024">00113</a> <span class="keyword">inline</span> <a class="code" href="class_compressed_storage.html">Storage</a>& <a class="code" href="class_sparse_matrix.html#a29763545859ceac7193ecb453df1c024">data</a>() { <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>; } <a name="l00114"></a><a class="code" href="class_sparse_matrix.html#a989f15106080f7e0f34e35460246f06d">00114</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="class_compressed_storage.html">Storage</a>& <a class="code" href="class_sparse_matrix.html#a989f15106080f7e0f34e35460246f06d">data</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>; } <a name="l00115"></a>00115 <a name="l00116"></a><a class="code" href="class_sparse_matrix.html#a6ab3eea75a241abc52a98e196e0125dc">00116</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a> <a class="code" href="class_sparse_matrix.html#a6ab3eea75a241abc52a98e196e0125dc">coeff</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a69b30d59e93b1dffa5234bdfbc98d286">row</a>, <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a8afce4f24094824bd538a3bc1b83b84f">col</a>)<span class="keyword"> const</span> <a name="l00117"></a>00117 <span class="keyword"> </span>{ <a name="l00118"></a>00118 <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> outer = <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? row : <a class="code" href="class_sparse_matrix_base.html#a8afce4f24094824bd538a3bc1b83b84f">col</a>; <a name="l00119"></a>00119 <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> inner = <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? col : <a class="code" href="class_sparse_matrix_base.html#a69b30d59e93b1dffa5234bdfbc98d286">row</a>; <a name="l00120"></a>00120 <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a4da5ec68b431743f05d00eba6de70b62" title="Like at(), but the search is performed in the range [start,end)">atInRange</a>(<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer], <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1], inner); <a name="l00121"></a>00121 } <a name="l00122"></a>00122 <a name="l00123"></a><a class="code" href="class_sparse_matrix.html#ad9e3ea3bbb6b618642e1082c9d804549">00123</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>& <a class="code" href="class_sparse_matrix.html#ad9e3ea3bbb6b618642e1082c9d804549">coeffRef</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a69b30d59e93b1dffa5234bdfbc98d286">row</a>, <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a8afce4f24094824bd538a3bc1b83b84f">col</a>) <a name="l00124"></a>00124 { <a name="l00125"></a>00125 <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> outer = <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? row : <a class="code" href="class_sparse_matrix_base.html#a8afce4f24094824bd538a3bc1b83b84f">col</a>; <a name="l00126"></a>00126 <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> inner = <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? col : <a class="code" href="class_sparse_matrix_base.html#a69b30d59e93b1dffa5234bdfbc98d286">row</a>; <a name="l00127"></a>00127 <a name="l00128"></a>00128 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> start = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer]; <a name="l00129"></a>00129 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="eigen__plugins_8h.html#ade5b39864c905cbb824d0ff6eb0d888c">end</a> = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]; <a name="l00130"></a>00130 <a class="code" href="_macros_8h.html#acaa7ba89800cfe18d5fd6eed620aea9c">eigen_assert</a>(end>=start && <span class="stringliteral">"you probably called coeffRef on a non finalized matrix"</span>); <a name="l00131"></a>00131 <a class="code" href="_macros_8h.html#acaa7ba89800cfe18d5fd6eed620aea9c">eigen_assert</a>(end>start && <span class="stringliteral">"coeffRef cannot be called on a zero coefficient"</span>); <a name="l00132"></a>00132 <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> p = <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a6be9c866ca0010771566ef28aea11a8e">searchLowerIndex</a>(start,end-1,inner); <a name="l00133"></a>00133 <a class="code" href="_macros_8h.html#acaa7ba89800cfe18d5fd6eed620aea9c">eigen_assert</a>((p<end) && (<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(p)==inner) && <span class="stringliteral">"coeffRef cannot be called on a zero coefficient"</span>); <a name="l00134"></a>00134 <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(p); <a name="l00135"></a>00135 } <a name="l00136"></a>00136 <a name="l00137"></a>00137 <span class="keyword">public</span>: <a name="l00138"></a>00138 <a name="l00139"></a>00139 <span class="keyword">class </span><a class="code" href="class_inner_iterator.html" title="An InnerIterator allows to loop over the element of a sparse (or dense) matrix or expression...">InnerIterator</a>; <a name="l00140"></a>00140 <span class="comment"></span> <a name="l00141"></a>00141 <span class="comment"> /** Removes all non zeros */</span> <a name="l00142"></a><a class="code" href="class_sparse_matrix.html#a6bef67522cafc4ed9f2e3e13d9cb44b4">00142</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_sparse_matrix.html#a6bef67522cafc4ed9f2e3e13d9cb44b4" title="Removes all non zeros.">setZero</a>() <a name="l00143"></a>00143 { <a name="l00144"></a>00144 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#aecb4867a0f73fd3ff9c24ea4d8923ad8">clear</a>(); <a name="l00145"></a>00145 memset(<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>, 0, (<a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>+1)*<span class="keyword">sizeof</span>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a>)); <a name="l00146"></a>00146 } <a name="l00147"></a>00147 <span class="comment"></span> <a name="l00148"></a>00148 <span class="comment"> /** \returns the number of non zero coefficients */</span> <a name="l00149"></a><a class="code" href="class_sparse_matrix.html#ae299bfb1b1df485fce0d23784f601d91">00149</a> <span class="keyword">inline</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#ae299bfb1b1df485fce0d23784f601d91">nonZeros</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a><span class="keyword">></span>(<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()); } <a name="l00150"></a>00150 <span class="comment"></span> <a name="l00151"></a>00151 <span class="comment"> /** Preallocates \a reserveSize non zeros */</span> <a name="l00152"></a><a class="code" href="class_sparse_matrix.html#a98df4a9eaaecc472b7e7732ba3accf46">00152</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_sparse_matrix.html#a98df4a9eaaecc472b7e7732ba3accf46" title="Preallocates reserveSize non zeros.">reserve</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> reserveSize) <a name="l00153"></a>00153 { <a name="l00154"></a>00154 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a9a2e7bb3746af16a7ab5b923f61d24f6">reserve</a>(reserveSize); <a name="l00155"></a>00155 } <a name="l00156"></a>00156 <a name="l00157"></a>00157 <span class="comment">//--- low level purely coherent filling ---</span> <a name="l00158"></a>00158 <span class="comment"></span> <a name="l00159"></a>00159 <span class="comment"> /** \returns a reference to the non zero coefficient at position \a row, \a col assuming that:</span> <a name="l00160"></a>00160 <span class="comment"> * - the nonzero does not already exist</span> <a name="l00161"></a>00161 <span class="comment"> * - the new coefficient is the last one according to the storage order</span> <a name="l00162"></a>00162 <span class="comment"> *</span> <a name="l00163"></a>00163 <span class="comment"> * Before filling a given inner vector you must call the statVec(Index) function.</span> <a name="l00164"></a>00164 <span class="comment"> *</span> <a name="l00165"></a>00165 <span class="comment"> * After an insertion session, you should call the finalize() function.</span> <a name="l00166"></a>00166 <span class="comment"> *</span> <a name="l00167"></a>00167 <span class="comment"> * \sa insert, insertBackByOuterInner, startVec */</span> <a name="l00168"></a><a class="code" href="class_sparse_matrix.html#ae8425277266cce89c948f0cb7888c421">00168</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>& <a class="code" href="class_sparse_matrix.html#ae8425277266cce89c948f0cb7888c421">insertBack</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a69b30d59e93b1dffa5234bdfbc98d286">row</a>, <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a8afce4f24094824bd538a3bc1b83b84f">col</a>) <a name="l00169"></a>00169 { <a name="l00170"></a>00170 <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#ac06680baf5b4f7c344f841e50b1d70a0">insertBackByOuterInner</a>(<a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a>?row:col, <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a>?col:row); <a name="l00171"></a>00171 } <a name="l00172"></a>00172 <span class="comment"></span> <a name="l00173"></a>00173 <span class="comment"> /** \sa insertBack, startVec */</span> <a name="l00174"></a><a class="code" href="class_sparse_matrix.html#ac06680baf5b4f7c344f841e50b1d70a0">00174</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>& <a class="code" href="class_sparse_matrix.html#ac06680baf5b4f7c344f841e50b1d70a0">insertBackByOuterInner</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> outer, <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> inner) <a name="l00175"></a>00175 { <a name="l00176"></a>00176 <a class="code" href="_macros_8h.html#acaa7ba89800cfe18d5fd6eed620aea9c">eigen_assert</a>(<span class="keywordtype">size_t</span>(<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]) == <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>() && <span class="stringliteral">"Invalid ordered insertion (invalid outer index)"</span>); <a name="l00177"></a>00177 <a class="code" href="_macros_8h.html#acaa7ba89800cfe18d5fd6eed620aea9c">eigen_assert</a>( (<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]-<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer]==0 || <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()-1)<inner) && <span class="stringliteral">"Invalid ordered insertion (invalid inner index)"</span>); <a name="l00178"></a>00178 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> p = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]; <a name="l00179"></a>00179 ++<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]; <a name="l00180"></a>00180 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a0fadaaf875137eeeb2d24c91c05bd0fd">append</a>(0, inner); <a name="l00181"></a>00181 <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(p); <a name="l00182"></a>00182 } <a name="l00183"></a>00183 <span class="comment"></span> <a name="l00184"></a>00184 <span class="comment"> /** \warning use it only if you know what you are doing */</span> <a name="l00185"></a><a class="code" href="class_sparse_matrix.html#a37bba4989f9f319ba970ed70ca060f0f">00185</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>& <a class="code" href="class_sparse_matrix.html#a37bba4989f9f319ba970ed70ca060f0f">insertBackByOuterInnerUnordered</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> outer, <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> inner) <a name="l00186"></a>00186 { <a name="l00187"></a>00187 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> p = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]; <a name="l00188"></a>00188 ++<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]; <a name="l00189"></a>00189 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a0fadaaf875137eeeb2d24c91c05bd0fd">append</a>(0, inner); <a name="l00190"></a>00190 <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(p); <a name="l00191"></a>00191 } <a name="l00192"></a>00192 <span class="comment"></span> <a name="l00193"></a>00193 <span class="comment"> /** \sa insertBack, insertBackByOuterInner */</span> <a name="l00194"></a><a class="code" href="class_sparse_matrix.html#a6d7ae0f615e3a89b45a6fb4ddc112338">00194</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_sparse_matrix.html#a6d7ae0f615e3a89b45a6fb4ddc112338">startVec</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> outer) <a name="l00195"></a>00195 { <a name="l00196"></a>00196 <a class="code" href="_macros_8h.html#acaa7ba89800cfe18d5fd6eed620aea9c">eigen_assert</a>(<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer]==<span class="keywordtype">int</span>(<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()) && <span class="stringliteral">"You must call startVec for each inner vector sequentially"</span>); <a name="l00197"></a>00197 <a class="code" href="_macros_8h.html#acaa7ba89800cfe18d5fd6eed620aea9c">eigen_assert</a>(<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]==0 && <span class="stringliteral">"You must call startVec for each inner vector sequentially"</span>); <a name="l00198"></a>00198 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1] = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer]; <a name="l00199"></a>00199 } <a name="l00200"></a>00200 <a name="l00201"></a>00201 <span class="comment">//---</span> <a name="l00202"></a>00202 <span class="comment"></span> <a name="l00203"></a>00203 <span class="comment"> /** \returns a reference to a novel non zero coefficient with coordinates \a row x \a col.</span> <a name="l00204"></a>00204 <span class="comment"> * The non zero coefficient must \b not already exist.</span> <a name="l00205"></a>00205 <span class="comment"> *</span> <a name="l00206"></a>00206 <span class="comment"> * \warning This function can be extremely slow if the non zero coefficients</span> <a name="l00207"></a>00207 <span class="comment"> * are not inserted in a coherent order.</span> <a name="l00208"></a>00208 <span class="comment"> *</span> <a name="l00209"></a>00209 <span class="comment"> * After an insertion session, you should call the finalize() function.</span> <a name="l00210"></a>00210 <span class="comment"> */</span> <a name="l00211"></a><a class="code" href="class_sparse_matrix.html#ad8b095f6726570d7372929c60b554d07">00211</a> <a class="code" href="_macros_8h.html#aa715c1fe854205b27e962ee7d7e06faf">EIGEN_DONT_INLINE</a> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>& <a class="code" href="class_sparse_matrix.html#ad8b095f6726570d7372929c60b554d07">insert</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a69b30d59e93b1dffa5234bdfbc98d286">row</a>, <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a8afce4f24094824bd538a3bc1b83b84f">col</a>) <a name="l00212"></a>00212 { <a name="l00213"></a>00213 <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> outer = <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? row : <a class="code" href="class_sparse_matrix_base.html#a8afce4f24094824bd538a3bc1b83b84f">col</a>; <a name="l00214"></a>00214 <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> inner = <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? col : <a class="code" href="class_sparse_matrix_base.html#a69b30d59e93b1dffa5234bdfbc98d286">row</a>; <a name="l00215"></a>00215 <a name="l00216"></a>00216 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> previousOuter = outer; <a name="l00217"></a>00217 <span class="keywordflow">if</span> (<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]==0) <a name="l00218"></a>00218 { <a name="l00219"></a>00219 <span class="comment">// we start a new inner vector</span> <a name="l00220"></a>00220 <span class="keywordflow">while</span> (previousOuter>=0 && <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[previousOuter]==0) <a name="l00221"></a>00221 { <a name="l00222"></a>00222 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[previousOuter] = <span class="keyword">static_cast<</span><a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a><span class="keyword">></span>(<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()); <a name="l00223"></a>00223 --previousOuter; <a name="l00224"></a>00224 } <a name="l00225"></a>00225 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1] = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer]; <a name="l00226"></a>00226 } <a name="l00227"></a>00227 <a name="l00228"></a>00228 <span class="comment">// here we have to handle the tricky case where the outerIndex array</span> <a name="l00229"></a>00229 <span class="comment">// starts with: [ 0 0 0 0 0 1 ...] and we are inserting in, e.g.,</span> <a name="l00230"></a>00230 <span class="comment">// the 2nd inner vector...</span> <a name="l00231"></a>00231 <span class="keywordtype">bool</span> isLastVec = (!(previousOuter==-1 && <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()!=0)) <a name="l00232"></a>00232 && (size_t(<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]) == <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()); <a name="l00233"></a>00233 <a name="l00234"></a>00234 <span class="keywordtype">size_t</span> startId = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer]; <a name="l00235"></a>00235 <span class="comment">// FIXME let's make sure sizeof(long int) == sizeof(size_t)</span> <a name="l00236"></a>00236 <span class="keywordtype">size_t</span> p = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]; <a name="l00237"></a>00237 ++<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]; <a name="l00238"></a>00238 <a name="l00239"></a>00239 <span class="keywordtype">float</span> reallocRatio = 1; <a name="l00240"></a>00240 <span class="keywordflow">if</span> (<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a7947dc70ad0e4938d0d50519f9351cf4">allocatedSize</a>()<=<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()) <a name="l00241"></a>00241 { <a name="l00242"></a>00242 <span class="comment">// if there is no preallocated memory, let's reserve a minimum of 32 elements</span> <a name="l00243"></a>00243 <span class="keywordflow">if</span> (<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()==0) <a name="l00244"></a>00244 { <a name="l00245"></a>00245 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a9a2e7bb3746af16a7ab5b923f61d24f6">reserve</a>(32); <a name="l00246"></a>00246 } <a name="l00247"></a>00247 <span class="keywordflow">else</span> <a name="l00248"></a>00248 { <a name="l00249"></a>00249 <span class="comment">// we need to reallocate the data, to reduce multiple reallocations</span> <a name="l00250"></a>00250 <span class="comment">// we use a smart resize algorithm based on the current filling ratio</span> <a name="l00251"></a>00251 <span class="comment">// in addition, we use float to avoid integers overflows</span> <a name="l00252"></a>00252 <span class="keywordtype">float</span> nnzEstimate = float(<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer])*float(<a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>)/float(outer+1); <a name="l00253"></a>00253 reallocRatio = (nnzEstimate-float(<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()))/float(<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()); <a name="l00254"></a>00254 <span class="comment">// furthermore we bound the realloc ratio to:</span> <a name="l00255"></a>00255 <span class="comment">// 1) reduce multiple minor realloc when the matrix is almost filled</span> <a name="l00256"></a>00256 <span class="comment">// 2) avoid to allocate too much memory when the matrix is almost empty</span> <a name="l00257"></a>00257 reallocRatio = std::min(std::max(reallocRatio,1.5f),8.f); <a name="l00258"></a>00258 } <a name="l00259"></a>00259 } <a name="l00260"></a>00260 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a9af0087ac21df447128a46b80631c8c1">resize</a>(<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()+1,reallocRatio); <a name="l00261"></a>00261 <a name="l00262"></a>00262 <span class="keywordflow">if</span> (!isLastVec) <a name="l00263"></a>00263 { <a name="l00264"></a>00264 <span class="keywordflow">if</span> (previousOuter==-1) <a name="l00265"></a>00265 { <a name="l00266"></a>00266 <span class="comment">// oops wrong guess.</span> <a name="l00267"></a>00267 <span class="comment">// let's correct the outer offsets</span> <a name="l00268"></a>00268 <span class="keywordflow">for</span> (<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> k=0; k<=(outer+1); ++k) <a name="l00269"></a>00269 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[k] = 0; <a name="l00270"></a>00270 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> k=outer+1; <a name="l00271"></a>00271 <span class="keywordflow">while</span>(<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[k]==0) <a name="l00272"></a>00272 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[k++] = 1; <a name="l00273"></a>00273 <span class="keywordflow">while</span> (k<=<a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a> && <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[k]!=0) <a name="l00274"></a>00274 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[k++]++; <a name="l00275"></a>00275 p = 0; <a name="l00276"></a>00276 --k; <a name="l00277"></a>00277 k = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[k]-1; <a name="l00278"></a>00278 <span class="keywordflow">while</span> (k>0) <a name="l00279"></a>00279 { <a name="l00280"></a>00280 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(k) = <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(k-1); <a name="l00281"></a>00281 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(k) = <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(k-1); <a name="l00282"></a>00282 k--; <a name="l00283"></a>00283 } <a name="l00284"></a>00284 } <a name="l00285"></a>00285 <span class="keywordflow">else</span> <a name="l00286"></a>00286 { <a name="l00287"></a>00287 <span class="comment">// we are not inserting into the last inner vec</span> <a name="l00288"></a>00288 <span class="comment">// update outer indices:</span> <a name="l00289"></a>00289 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> j = outer+2; <a name="l00290"></a>00290 <span class="keywordflow">while</span> (j<=<a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a> && <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[j]!=0) <a name="l00291"></a>00291 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[j++]++; <a name="l00292"></a>00292 --j; <a name="l00293"></a>00293 <span class="comment">// shift data of last vecs:</span> <a name="l00294"></a>00294 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> k = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[j]-1; <a name="l00295"></a>00295 <span class="keywordflow">while</span> (k>=<a class="code" href="class_sparse_matrix_base.html#ae1d069410cb392f19d4a8e3f0d3e2276">Index</a>(p)) <a name="l00296"></a>00296 { <a name="l00297"></a>00297 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(k) = <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(k-1); <a name="l00298"></a>00298 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(k) = <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(k-1); <a name="l00299"></a>00299 k--; <a name="l00300"></a>00300 } <a name="l00301"></a>00301 } <a name="l00302"></a>00302 } <a name="l00303"></a>00303 <a name="l00304"></a>00304 <span class="keywordflow">while</span> ( (p > startId) && (<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(p-1) > inner) ) <a name="l00305"></a>00305 { <a name="l00306"></a>00306 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(p) = <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(p-1); <a name="l00307"></a>00307 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(p) = <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(p-1); <a name="l00308"></a>00308 --p; <a name="l00309"></a>00309 } <a name="l00310"></a>00310 <a name="l00311"></a>00311 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(p) = inner; <a name="l00312"></a>00312 <span class="keywordflow">return</span> (<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(p) = 0); <a name="l00313"></a>00313 } <a name="l00314"></a>00314 <a name="l00315"></a>00315 <a name="l00316"></a>00316 <a name="l00317"></a>00317 <span class="comment"></span> <a name="l00318"></a>00318 <span class="comment"> /** Must be called after inserting a set of non zero entries.</span> <a name="l00319"></a>00319 <span class="comment"> */</span> <a name="l00320"></a><a class="code" href="class_sparse_matrix.html#a083a756f5485e97716e292b83a88f2dd">00320</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_sparse_matrix.html#a083a756f5485e97716e292b83a88f2dd" title="Must be called after inserting a set of non zero entries.">finalize</a>() <a name="l00321"></a>00321 { <a name="l00322"></a>00322 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a9fb852284f288cfb1e8476da3a49f519">size</a> = <span class="keyword">static_cast<</span><a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a><span class="keyword">></span>(<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()); <a name="l00323"></a>00323 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> i = <a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>; <a name="l00324"></a>00324 <span class="comment">// find the last filled column</span> <a name="l00325"></a>00325 <span class="keywordflow">while</span> (i>=0 && <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[i]==0) <a name="l00326"></a>00326 --i; <a name="l00327"></a>00327 ++i; <a name="l00328"></a>00328 <span class="keywordflow">while</span> (i<=<a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>) <a name="l00329"></a>00329 { <a name="l00330"></a>00330 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[i] = <a class="code" href="class_sparse_matrix_base.html#a9fb852284f288cfb1e8476da3a49f519">size</a>; <a name="l00331"></a>00331 ++i; <a name="l00332"></a>00332 } <a name="l00333"></a>00333 } <a name="l00334"></a>00334 <span class="comment"></span> <a name="l00335"></a>00335 <span class="comment"> /** Suppress all nonzeros which are smaller than \a reference under the tolerence \a epsilon */</span> <a name="l00336"></a><a class="code" href="class_sparse_matrix.html#ab1a845800981098a42abc5f42fdf4ae9">00336</a> <span class="keywordtype">void</span> <a class="code" href="class_sparse_matrix.html#ab1a845800981098a42abc5f42fdf4ae9" title="Suppress all nonzeros which are smaller than reference under the tolerence epsilon.">prune</a>(<a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a> reference, RealScalar epsilon = <a class="code" href="struct_num_traits.html" title="Holds information about the various numeric (i.e.">NumTraits<RealScalar>::dummy_precision</a>()) <a name="l00337"></a>00337 { <a name="l00338"></a>00338 <a class="code" href="class_sparse_matrix.html#ab1a845800981098a42abc5f42fdf4ae9" title="Suppress all nonzeros which are smaller than reference under the tolerence epsilon.">prune</a>(<a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html">default_prunning_func</a>(reference,epsilon)); <a name="l00339"></a>00339 } <a name="l00340"></a>00340 <span class="comment"></span> <a name="l00341"></a>00341 <span class="comment"> /** Suppress all nonzeros which do not satisfy the predicate \a keep.</span> <a name="l00342"></a>00342 <span class="comment"> * The functor type \a KeepFunc must implement the following function:</span> <a name="l00343"></a>00343 <span class="comment"> * \code</span> <a name="l00344"></a>00344 <span class="comment"> * bool operator() (const Index& row, const Index& col, const Scalar& value) const;</span> <a name="l00345"></a>00345 <span class="comment"> * \endcode</span> <a name="l00346"></a>00346 <span class="comment"> * \sa prune(Scalar,RealScalar)</span> <a name="l00347"></a>00347 <span class="comment"> */</span> <a name="l00348"></a>00348 <span class="keyword">template</span><<span class="keyword">typename</span> KeepFunc> <a name="l00349"></a><a class="code" href="class_sparse_matrix.html#ab2c4a2d8b3ae772204f488aecb015729">00349</a> <span class="keywordtype">void</span> <a class="code" href="class_sparse_matrix.html#ab1a845800981098a42abc5f42fdf4ae9" title="Suppress all nonzeros which are smaller than reference under the tolerence epsilon.">prune</a>(<span class="keyword">const</span> KeepFunc& keep = KeepFunc()) <a name="l00350"></a>00350 { <a name="l00351"></a>00351 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> k = 0; <a name="l00352"></a>00352 <span class="keywordflow">for</span>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> j=0; j<<a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>; ++j) <a name="l00353"></a>00353 { <a name="l00354"></a>00354 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> previousStart = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[j]; <a name="l00355"></a>00355 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[j] = k; <a name="l00356"></a>00356 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="eigen__plugins_8h.html#ade5b39864c905cbb824d0ff6eb0d888c">end</a> = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[j+1]; <a name="l00357"></a>00357 <span class="keywordflow">for</span>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> i=previousStart; i<<a class="code" href="eigen__plugins_8h.html#ade5b39864c905cbb824d0ff6eb0d888c">end</a>; ++i) <a name="l00358"></a>00358 { <a name="l00359"></a>00359 <span class="keywordflow">if</span>(keep(<a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a>?j:<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(i), <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a>?<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(i):j, <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(i))) <a name="l00360"></a>00360 { <a name="l00361"></a>00361 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(k) = <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(i); <a name="l00362"></a>00362 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(k) = <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(i); <a name="l00363"></a>00363 ++k; <a name="l00364"></a>00364 } <a name="l00365"></a>00365 } <a name="l00366"></a>00366 } <a name="l00367"></a>00367 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[<a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>] = k; <a name="l00368"></a>00368 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a9af0087ac21df447128a46b80631c8c1">resize</a>(k,0); <a name="l00369"></a>00369 } <a name="l00370"></a>00370 <span class="comment"></span> <a name="l00371"></a>00371 <span class="comment"> /** Resizes the matrix to a \a rows x \a cols matrix and initializes it to zero</span> <a name="l00372"></a>00372 <span class="comment"> * \sa resizeNonZeros(Index), reserve(), setZero()</span> <a name="l00373"></a>00373 <span class="comment"> */</span> <a name="l00374"></a><a class="code" href="class_sparse_matrix.html#ada2c442cf33b4e0bf75cc75817b42203">00374</a> <span class="keywordtype">void</span> <a class="code" href="class_sparse_matrix.html#ada2c442cf33b4e0bf75cc75817b42203" title="Resizes the matrix to a rows x cols matrix and initializes it to zero.">resize</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#a08ea96e4a43cad89fe8803b17b3a200a">rows</a>, <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#a0db0dfa1ad560120debf4ac2b1de51de">cols</a>) <a name="l00375"></a>00375 { <a name="l00376"></a>00376 <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#a4469108db20a12c3791e76bb6931dbfd">outerSize</a> = <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? rows : <a class="code" href="class_sparse_matrix.html#a0db0dfa1ad560120debf4ac2b1de51de">cols</a>; <a name="l00377"></a>00377 <a class="code" href="class_sparse_matrix.html#a4e48d9cd903fd687b6c288d9c8b4d4e1">m_innerSize</a> = <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? cols : <a class="code" href="class_sparse_matrix.html#a08ea96e4a43cad89fe8803b17b3a200a">rows</a>; <a name="l00378"></a>00378 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#aecb4867a0f73fd3ff9c24ea4d8923ad8">clear</a>(); <a name="l00379"></a>00379 <span class="keywordflow">if</span> (<a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a> != outerSize || <a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>==0) <a name="l00380"></a>00380 { <a name="l00381"></a>00381 <span class="keyword">delete</span>[] <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>; <a name="l00382"></a>00382 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a> = <span class="keyword">new</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> [outerSize+1]; <a name="l00383"></a>00383 <a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a> = <a class="code" href="class_sparse_matrix.html#a4469108db20a12c3791e76bb6931dbfd">outerSize</a>; <a name="l00384"></a>00384 } <a name="l00385"></a>00385 memset(<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>, 0, (<a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>+1)*<span class="keyword">sizeof</span>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a>)); <a name="l00386"></a>00386 } <a name="l00387"></a>00387 <span class="comment"></span> <a name="l00388"></a>00388 <span class="comment"> /** Low level API</span> <a name="l00389"></a>00389 <span class="comment"> * Resize the nonzero vector to \a size */</span> <a name="l00390"></a><a class="code" href="class_sparse_matrix.html#aef0b4e3b001274214effef0a81f699f5">00390</a> <span class="keywordtype">void</span> <a class="code" href="class_sparse_matrix.html#aef0b4e3b001274214effef0a81f699f5" title="Low level API Resize the nonzero vector to size.">resizeNonZeros</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a9fb852284f288cfb1e8476da3a49f519">size</a>) <a name="l00391"></a>00391 { <a name="l00392"></a>00392 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a9af0087ac21df447128a46b80631c8c1">resize</a>(size); <a name="l00393"></a>00393 } <a name="l00394"></a>00394 <span class="comment"></span> <a name="l00395"></a>00395 <span class="comment"> /** Default constructor yielding an empty \c 0 \c x \c 0 matrix */</span> <a name="l00396"></a><a class="code" href="class_sparse_matrix.html#a65c82f7ebd2c88a77fed6f7403036d1d">00396</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix.html#a65c82f7ebd2c88a77fed6f7403036d1d" title="Default constructor yielding an empty 0 x 0 matrix.">SparseMatrix</a>() <a name="l00397"></a>00397 : <a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>(-1), <a class="code" href="class_sparse_matrix.html#a4e48d9cd903fd687b6c288d9c8b4d4e1">m_innerSize</a>(0), <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>(0) <a name="l00398"></a>00398 { <a name="l00399"></a>00399 <a class="code" href="class_sparse_matrix.html#ada2c442cf33b4e0bf75cc75817b42203" title="Resizes the matrix to a rows x cols matrix and initializes it to zero.">resize</a>(0, 0); <a name="l00400"></a>00400 } <a name="l00401"></a>00401 <span class="comment"></span> <a name="l00402"></a>00402 <span class="comment"> /** Constructs a \a rows \c x \a cols empty matrix */</span> <a name="l00403"></a><a class="code" href="class_sparse_matrix.html#a34422a0997e6f682a186ca73b37aca59">00403</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix.html#a65c82f7ebd2c88a77fed6f7403036d1d" title="Default constructor yielding an empty 0 x 0 matrix.">SparseMatrix</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#a08ea96e4a43cad89fe8803b17b3a200a">rows</a>, <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix.html#a0db0dfa1ad560120debf4ac2b1de51de">cols</a>) <a name="l00404"></a>00404 : <a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>(0), <a class="code" href="class_sparse_matrix.html#a4e48d9cd903fd687b6c288d9c8b4d4e1">m_innerSize</a>(0), <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>(0) <a name="l00405"></a>00405 { <a name="l00406"></a>00406 <a class="code" href="class_sparse_matrix.html#ada2c442cf33b4e0bf75cc75817b42203" title="Resizes the matrix to a rows x cols matrix and initializes it to zero.">resize</a>(rows, cols); <a name="l00407"></a>00407 } <a name="l00408"></a>00408 <span class="comment"></span> <a name="l00409"></a>00409 <span class="comment"> /** Constructs a sparse matrix from the sparse expression \a other */</span> <a name="l00410"></a>00410 <span class="keyword">template</span><<span class="keyword">typename</span> OtherDerived> <a name="l00411"></a><a class="code" href="class_sparse_matrix.html#a3df37d61fc6035e8a41dc3143111784f">00411</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix.html#a65c82f7ebd2c88a77fed6f7403036d1d" title="Default constructor yielding an empty 0 x 0 matrix.">SparseMatrix</a>(<span class="keyword">const</span> <a class="code" href="class_sparse_matrix_base.html" title="Base class of any sparse matrices or sparse expressions.">SparseMatrixBase<OtherDerived></a>& other) <a name="l00412"></a>00412 : <a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>(0), <a class="code" href="class_sparse_matrix.html#a4e48d9cd903fd687b6c288d9c8b4d4e1">m_innerSize</a>(0), <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>(0) <a name="l00413"></a>00413 { <a name="l00414"></a>00414 *<span class="keyword">this</span> = other.<a class="code" href="struct_eigen_base.html#a6356c64f85b1f1e61a62e62c8e73f91a">derived</a>(); <a name="l00415"></a>00415 } <a name="l00416"></a>00416 <span class="comment"></span> <a name="l00417"></a>00417 <span class="comment"> /** Copy constructor */</span> <a name="l00418"></a><a class="code" href="class_sparse_matrix.html#a2cd2f4c2a72f9e16ac7bf9d6febc9adc">00418</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix.html#a65c82f7ebd2c88a77fed6f7403036d1d" title="Default constructor yielding an empty 0 x 0 matrix.">SparseMatrix</a>(<span class="keyword">const</span> <a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a>& other) <a name="l00419"></a>00419 : <a class="code" href="class_sparse_matrix_base.html#a1115fc94453a8d25338195b7a630cbf9">Base</a>(), <a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>(0), <a class="code" href="class_sparse_matrix.html#a4e48d9cd903fd687b6c288d9c8b4d4e1">m_innerSize</a>(0), <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>(0) <a name="l00420"></a>00420 { <a name="l00421"></a>00421 *<span class="keyword">this</span> = other.<a class="code" href="struct_eigen_base.html#a6356c64f85b1f1e61a62e62c8e73f91a">derived</a>(); <a name="l00422"></a>00422 } <a name="l00423"></a>00423 <span class="comment"></span> <a name="l00424"></a>00424 <span class="comment"> /** Swap the content of two sparse matrices of same type (optimization) */</span> <a name="l00425"></a><a class="code" href="class_sparse_matrix.html#aeea3326c2fff70f537eac61d9d011603">00425</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_sparse_matrix.html#aeea3326c2fff70f537eac61d9d011603" title="Swap the content of two sparse matrices of same type (optimization)">swap</a>(<a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a>& other) <a name="l00426"></a>00426 { <a name="l00427"></a>00427 <span class="comment">//EIGEN_DBG_SPARSE(std::cout << "SparseMatrix:: swap\n");</span> <a name="l00428"></a>00428 <a class="code" href="class_sparse_matrix.html#aeea3326c2fff70f537eac61d9d011603" title="Swap the content of two sparse matrices of same type (optimization)">std::swap</a>(<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>, other.<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>); <a name="l00429"></a>00429 <a class="code" href="class_sparse_matrix.html#aeea3326c2fff70f537eac61d9d011603" title="Swap the content of two sparse matrices of same type (optimization)">std::swap</a>(<a class="code" href="class_sparse_matrix.html#a4e48d9cd903fd687b6c288d9c8b4d4e1">m_innerSize</a>, other.<a class="code" href="class_sparse_matrix.html#a4e48d9cd903fd687b6c288d9c8b4d4e1">m_innerSize</a>); <a name="l00430"></a>00430 <a class="code" href="class_sparse_matrix.html#aeea3326c2fff70f537eac61d9d011603" title="Swap the content of two sparse matrices of same type (optimization)">std::swap</a>(<a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>, other.<a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>); <a name="l00431"></a>00431 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a6a04ef3cb2cebc50d62a66b59619451e">swap</a>(other.<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>); <a name="l00432"></a>00432 } <a name="l00433"></a>00433 <a name="l00434"></a><a class="code" href="class_sparse_matrix.html#a1c79c6b5b7ea23252d4108185eaa37aa">00434</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a>& <a class="code" href="class_sparse_matrix.html#a1c79c6b5b7ea23252d4108185eaa37aa">operator=</a>(<span class="keyword">const</span> <a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a>& other) <a name="l00435"></a>00435 { <a name="l00436"></a>00436 <span class="comment">// std::cout << "SparseMatrix& operator=(const SparseMatrix& other)\n";</span> <a name="l00437"></a>00437 <span class="keywordflow">if</span> (other.<a class="code" href="class_sparse_matrix_base.html#a959b8f7a2f7bb5848670acf0f8c52f92">isRValue</a>()) <a name="l00438"></a>00438 { <a name="l00439"></a>00439 <a class="code" href="class_sparse_matrix.html#aeea3326c2fff70f537eac61d9d011603" title="Swap the content of two sparse matrices of same type (optimization)">swap</a>(other.<a class="code" href="struct_eigen_base.html#ad7fac7d6bafdedba4b349717a53e20e4">const_cast_derived</a>()); <a name="l00440"></a>00440 } <a name="l00441"></a>00441 <span class="keywordflow">else</span> <a name="l00442"></a>00442 { <a name="l00443"></a>00443 <a class="code" href="class_sparse_matrix.html#ada2c442cf33b4e0bf75cc75817b42203" title="Resizes the matrix to a rows x cols matrix and initializes it to zero.">resize</a>(other.<a class="code" href="class_sparse_matrix.html#a08ea96e4a43cad89fe8803b17b3a200a">rows</a>(), other.<a class="code" href="class_sparse_matrix.html#a0db0dfa1ad560120debf4ac2b1de51de">cols</a>()); <a name="l00444"></a>00444 <a class="code" href="namespacemrpt_1_1system_1_1os.html#ae1184cfb1f617787dc4c9da98becbe3a" title="An OS and compiler independent version of &quot;memcpy&quot;.">memcpy</a>(<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>, other.<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>, (<a class="code" href="class_sparse_matrix.html#a9e0a71826e2fe7dd76c9a5faae2b1cba">m_outerSize</a>+1)*<span class="keyword">sizeof</span>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a>)); <a name="l00445"></a>00445 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a> = other.<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>; <a name="l00446"></a>00446 } <a name="l00447"></a>00447 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l00448"></a>00448 } <a name="l00449"></a>00449 <a name="l00450"></a>00450 <span class="preprocessor"> #ifndef EIGEN_PARSED_BY_DOXYGEN</span> <a name="l00451"></a>00451 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> Lhs, <span class="keyword">typename</span> Rhs> <a name="l00452"></a>00452 <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a>& <a class="code" href="class_sparse_matrix.html#a1c79c6b5b7ea23252d4108185eaa37aa">operator=</a>(<span class="keyword">const</span> <a class="code" href="class_sparse_sparse_product.html">SparseSparseProduct<Lhs,Rhs></a>& product) <a name="l00453"></a>00453 { <a name="l00454"></a>00454 <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a1c79c6b5b7ea23252d4108185eaa37aa">Base::operator=</a>(product); <a name="l00455"></a>00455 } <a name="l00456"></a>00456 <a name="l00457"></a>00457 <span class="keyword">template</span><<span class="keyword">typename</span> OtherDerived> <a name="l00458"></a>00458 <a class="code" href="_macros_8h.html#af2b60117c00a6e75812de43bfe7db3b1">EIGEN_STRONG_INLINE</a> <a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a>& <a class="code" href="class_sparse_matrix.html#a1c79c6b5b7ea23252d4108185eaa37aa">operator=</a>(<span class="keyword">const</span> <a class="code" href="class_return_by_value.html">ReturnByValue<OtherDerived></a>& func) <a name="l00459"></a>00459 { <a name="l00460"></a>00460 <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a1c79c6b5b7ea23252d4108185eaa37aa">Base::operator=</a>(func); <a name="l00461"></a>00461 } <a name="l00462"></a>00462 <span class="preprocessor"> #endif</span> <a name="l00463"></a>00463 <span class="preprocessor"></span> <a name="l00464"></a>00464 <span class="keyword">template</span><<span class="keyword">typename</span> OtherDerived> <a name="l00465"></a><a class="code" href="class_sparse_matrix.html#a472cf18813ff215603906b9b7faf11f7">00465</a> <a class="code" href="_macros_8h.html#aa715c1fe854205b27e962ee7d7e06faf">EIGEN_DONT_INLINE</a> <a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a>& <a class="code" href="class_sparse_matrix.html#a1c79c6b5b7ea23252d4108185eaa37aa">operator=</a>(<span class="keyword">const</span> <a class="code" href="class_sparse_matrix_base.html" title="Base class of any sparse matrices or sparse expressions.">SparseMatrixBase<OtherDerived></a>& other) <a name="l00466"></a>00466 { <a name="l00467"></a>00467 <span class="keyword">const</span> <span class="keywordtype">bool</span> needToTranspose = (<a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701adb11b5d4625dc81c28848af1ec6dac18" title="This stores expression Flags flags which may or may not be inherited by new expressions constructed f...">Flags</a> & <a class="code" href="group__flags.html#ga7bd49e7b260e869e10fb9dc4fd081a85" title="for a matrix, this means that the storage order is row-major.">RowMajorBit</a>) != (OtherDerived::Flags & <a class="code" href="group__flags.html#ga7bd49e7b260e869e10fb9dc4fd081a85" title="for a matrix, this means that the storage order is row-major.">RowMajorBit</a>); <a name="l00468"></a>00468 <span class="keywordflow">if</span> (needToTranspose) <a name="l00469"></a>00469 { <a name="l00470"></a>00470 <span class="comment">// two passes algorithm:</span> <a name="l00471"></a>00471 <span class="comment">// 1 - compute the number of coeffs per dest inner vector</span> <a name="l00472"></a>00472 <span class="comment">// 2 - do the actual copy/eval</span> <a name="l00473"></a>00473 <span class="comment">// Since each coeff of the rhs has to be evaluated twice, let's evaluate it if needed</span> <a name="l00474"></a>00474 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="structinternal_1_1nested.html">internal::nested<OtherDerived,2>::type</a> OtherCopy; <a name="l00475"></a>00475 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="structinternal_1_1remove__all.html#a563ebdff4a8ca3825b500e7efb95c4bc">internal::remove_all<OtherCopy>::type</a> _OtherCopy; <a name="l00476"></a>00476 OtherCopy otherCopy(other.<a class="code" href="struct_eigen_base.html#a6356c64f85b1f1e61a62e62c8e73f91a">derived</a>()); <a name="l00477"></a>00477 <a name="l00478"></a>00478 <a class="code" href="class_sparse_matrix.html#ada2c442cf33b4e0bf75cc75817b42203" title="Resizes the matrix to a rows x cols matrix and initializes it to zero.">resize</a>(other.<a class="code" href="class_sparse_matrix_base.html#a797118bb50431f5fb0a39dfe948d9d37">rows</a>(), other.<a class="code" href="class_sparse_matrix_base.html#aedb05ef1f5aee2efd56c0801acef7fe7">cols</a>()); <a name="l00479"></a>00479 Eigen::Map<Matrix<Index, Dynamic, 1> > (<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>,<a class="code" href="class_sparse_matrix.html#a4469108db20a12c3791e76bb6931dbfd">outerSize</a>()).<a class="code" href="class_sparse_matrix.html#a6bef67522cafc4ed9f2e3e13d9cb44b4" title="Removes all non zeros.">setZero</a>(); <a name="l00480"></a>00480 <span class="comment">// pass 1</span> <a name="l00481"></a>00481 <span class="comment">// FIXME the above copy could be merged with that pass</span> <a name="l00482"></a>00482 <span class="keywordflow">for</span> (<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> j=0; j<otherCopy.outerSize(); ++j) <a name="l00483"></a>00483 <span class="keywordflow">for</span> (<span class="keyword">typename</span> _OtherCopy::InnerIterator it(otherCopy, j); it; ++it) <a name="l00484"></a>00484 ++m_outerIndex[it.index()]; <a name="l00485"></a>00485 <a name="l00486"></a>00486 <span class="comment">// prefix sum</span> <a name="l00487"></a>00487 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> count = 0; <a name="l00488"></a>00488 VectorXi positions(<a class="code" href="class_sparse_matrix.html#a4469108db20a12c3791e76bb6931dbfd">outerSize</a>()); <a name="l00489"></a>00489 <span class="keywordflow">for</span> (<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> j=0; j<<a class="code" href="class_sparse_matrix.html#a4469108db20a12c3791e76bb6931dbfd">outerSize</a>(); ++j) <a name="l00490"></a>00490 { <a name="l00491"></a>00491 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> tmp = m_outerIndex[j]; <a name="l00492"></a>00492 m_outerIndex[j] = count; <a name="l00493"></a>00493 positions[j] = count; <a name="l00494"></a>00494 count += tmp; <a name="l00495"></a>00495 } <a name="l00496"></a>00496 m_outerIndex[<a class="code" href="class_sparse_matrix.html#a4469108db20a12c3791e76bb6931dbfd">outerSize</a>()] = count; <a name="l00497"></a>00497 <span class="comment">// alloc</span> <a name="l00498"></a>00498 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a9af0087ac21df447128a46b80631c8c1">resize</a>(count); <a name="l00499"></a>00499 <span class="comment">// pass 2</span> <a name="l00500"></a>00500 <span class="keywordflow">for</span> (<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> j=0; j<otherCopy.outerSize(); ++j) <a name="l00501"></a>00501 { <a name="l00502"></a>00502 <span class="keywordflow">for</span> (<span class="keyword">typename</span> _OtherCopy::InnerIterator it(otherCopy, j); it; ++it) <a name="l00503"></a>00503 { <a name="l00504"></a>00504 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> pos = positions[it.index()]++; <a name="l00505"></a>00505 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(pos) = j; <a name="l00506"></a>00506 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(pos) = it.value(); <a name="l00507"></a>00507 } <a name="l00508"></a>00508 } <a name="l00509"></a>00509 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l00510"></a>00510 } <a name="l00511"></a>00511 <span class="keywordflow">else</span> <a name="l00512"></a>00512 { <a name="l00513"></a>00513 <span class="comment">// there is no special optimization</span> <a name="l00514"></a>00514 <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a1c79c6b5b7ea23252d4108185eaa37aa">SparseMatrixBase<SparseMatrix>::operator=</a>(other.<a class="code" href="struct_eigen_base.html#a6356c64f85b1f1e61a62e62c8e73f91a">derived</a>()); <a name="l00515"></a>00515 } <a name="l00516"></a>00516 } <a name="l00517"></a>00517 <a name="l00518"></a><a class="code" href="class_sparse_matrix.html#ae7cb03fccbdb1456601051ffa6522c46">00518</a> <span class="keyword">friend</span> std::ostream & <a class="code" href="class_sparse_matrix.html#ae7cb03fccbdb1456601051ffa6522c46">operator << </a>(std::ostream & s, <span class="keyword">const</span> <a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a>& m) <a name="l00519"></a>00519 { <a name="l00520"></a>00520 <a class="code" href="_sparse_util_8h.html#a1a0ccbbfda8877d89c7e6be74ad8f078">EIGEN_DBG_SPARSE</a>( <a name="l00521"></a>00521 s << <span class="stringliteral">"Nonzero entries:\n"</span>; <a name="l00522"></a>00522 <span class="keywordflow">for</span> (<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> i=0; i<m.<a class="code" href="class_sparse_matrix.html#ae299bfb1b1df485fce0d23784f601d91">nonZeros</a>(); ++i) <a name="l00523"></a>00523 { <a name="l00524"></a>00524 s << <span class="stringliteral">"("</span> << m.<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(i) << <span class="stringliteral">","</span> << m.<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(i) << <span class="stringliteral">") "</span>; <a name="l00525"></a>00525 } <a name="l00526"></a>00526 s << std::endl; <a name="l00527"></a>00527 s << std::endl; <a name="l00528"></a>00528 s << <span class="stringliteral">"Column pointers:\n"</span>; <a name="l00529"></a>00529 <span class="keywordflow">for</span> (<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> i=0; i<m.<a class="code" href="class_sparse_matrix.html#a4469108db20a12c3791e76bb6931dbfd">outerSize</a>(); ++i) <a name="l00530"></a>00530 { <a name="l00531"></a>00531 s << m.<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[i] << <span class="stringliteral">" "</span>; <a name="l00532"></a>00532 } <a name="l00533"></a>00533 s << <span class="stringliteral">" $"</span> << std::endl; <a name="l00534"></a>00534 s << std::endl; <a name="l00535"></a>00535 ); <a name="l00536"></a>00536 s << static_cast<const SparseMatrixBase<SparseMatrix>&>(m); <a name="l00537"></a>00537 <span class="keywordflow">return</span> s; <a name="l00538"></a>00538 } <a name="l00539"></a>00539 <span class="comment"></span> <a name="l00540"></a>00540 <span class="comment"> /** Destructor */</span> <a name="l00541"></a><a class="code" href="class_sparse_matrix.html#a3a8d70e32b168144bc86a61c448ef755">00541</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix.html#a3a8d70e32b168144bc86a61c448ef755" title="Destructor.">~SparseMatrix</a>() <a name="l00542"></a>00542 { <a name="l00543"></a>00543 <span class="keyword">delete</span>[] <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>; <a name="l00544"></a>00544 } <a name="l00545"></a>00545 <span class="comment"></span> <a name="l00546"></a>00546 <span class="comment"> /** Overloaded for performance */</span> <a name="l00547"></a>00547 <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a> <a class="code" href="class_sparse_matrix.html#a5e99837b11ef375b465502c2da1ac402" title="Overloaded for performance.">sum</a>() <span class="keyword">const</span>; <a name="l00548"></a>00548 <a name="l00549"></a>00549 <span class="keyword">public</span>: <a name="l00550"></a>00550 <span class="comment"></span> <a name="l00551"></a>00551 <span class="comment"> /** \deprecated use setZero() and reserve()</span> <a name="l00552"></a>00552 <span class="comment"> * Initializes the filling process of \c *this.</span> <a name="l00553"></a>00553 <span class="comment"> * \param reserveSize approximate number of nonzeros</span> <a name="l00554"></a>00554 <span class="comment"> * Note that the matrix \c *this is zero-ed.</span> <a name="l00555"></a>00555 <span class="comment"> */</span> <a name="l00556"></a><a class="code" href="class_sparse_matrix.html#a57dc3cdd5879cc036c1575252812257b">00556</a> <a class="code" href="_macros_8h.html#a215b4c2831ed3631e9149b53a8ecb878">EIGEN_DEPRECATED</a> <span class="keywordtype">void</span> <a class="code" href="class_sparse_matrix.html#a57dc3cdd5879cc036c1575252812257b">startFill</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> reserveSize = 1000) <a name="l00557"></a>00557 { <a name="l00558"></a>00558 <a class="code" href="class_sparse_matrix.html#a6bef67522cafc4ed9f2e3e13d9cb44b4" title="Removes all non zeros.">setZero</a>(); <a name="l00559"></a>00559 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a9a2e7bb3746af16a7ab5b923f61d24f6">reserve</a>(reserveSize); <a name="l00560"></a>00560 } <a name="l00561"></a>00561 <span class="comment"></span> <a name="l00562"></a>00562 <span class="comment"> /** \deprecated use insert()</span> <a name="l00563"></a>00563 <span class="comment"> * Like fill() but with random inner coordinates.</span> <a name="l00564"></a>00564 <span class="comment"> */</span> <a name="l00565"></a><a class="code" href="class_sparse_matrix.html#a5836891e4a9719fdd8227bdb5b634207">00565</a> <a class="code" href="_macros_8h.html#a215b4c2831ed3631e9149b53a8ecb878">EIGEN_DEPRECATED</a> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>& <a class="code" href="class_sparse_matrix.html#a5836891e4a9719fdd8227bdb5b634207">fillrand</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a69b30d59e93b1dffa5234bdfbc98d286">row</a>, <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a8afce4f24094824bd538a3bc1b83b84f">col</a>) <a name="l00566"></a>00566 { <a name="l00567"></a>00567 <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#ad8b095f6726570d7372929c60b554d07">insert</a>(row,col); <a name="l00568"></a>00568 } <a name="l00569"></a>00569 <span class="comment"></span> <a name="l00570"></a>00570 <span class="comment"> /** \deprecated use insert()</span> <a name="l00571"></a>00571 <span class="comment"> */</span> <a name="l00572"></a><a class="code" href="class_sparse_matrix.html#a38a814c0590199f56add134545e4eeb4">00572</a> <a class="code" href="_macros_8h.html#a215b4c2831ed3631e9149b53a8ecb878">EIGEN_DEPRECATED</a> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>& <a class="code" href="class_sparse_matrix.html#a38a814c0590199f56add134545e4eeb4">fill</a>(<a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a69b30d59e93b1dffa5234bdfbc98d286">row</a>, <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_base.html#a8afce4f24094824bd538a3bc1b83b84f">col</a>) <a name="l00573"></a>00573 { <a name="l00574"></a>00574 <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> outer = <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? row : <a class="code" href="class_sparse_matrix_base.html#a8afce4f24094824bd538a3bc1b83b84f">col</a>; <a name="l00575"></a>00575 <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> inner = <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? col : <a class="code" href="class_sparse_matrix_base.html#a69b30d59e93b1dffa5234bdfbc98d286">row</a>; <a name="l00576"></a>00576 <a name="l00577"></a>00577 <span class="keywordflow">if</span> (<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]==0) <a name="l00578"></a>00578 { <a name="l00579"></a>00579 <span class="comment">// we start a new inner vector</span> <a name="l00580"></a>00580 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> i = outer; <a name="l00581"></a>00581 <span class="keywordflow">while</span> (i>=0 && <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[i]==0) <a name="l00582"></a>00582 { <a name="l00583"></a>00583 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[i] = <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>(); <a name="l00584"></a>00584 --i; <a name="l00585"></a>00585 } <a name="l00586"></a>00586 <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1] = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer]; <a name="l00587"></a>00587 } <a name="l00588"></a>00588 <span class="keywordflow">else</span> <a name="l00589"></a>00589 { <a name="l00590"></a>00590 <a class="code" href="_macros_8h.html#acaa7ba89800cfe18d5fd6eed620aea9c">eigen_assert</a>(<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#af2d4ccb3624505ffbd7efcd34605d478">index</a>(<a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()-1)<inner && <span class="stringliteral">"wrong sorted insertion"</span>); <a name="l00591"></a>00591 } <a name="l00592"></a>00592 <span class="comment">// std::cerr << size_t(m_outerIndex[outer+1]) << " == " << m_data.size() << "\n";</span> <a name="l00593"></a>00593 assert(<span class="keywordtype">size_t</span>(<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]) == <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a329259914e3ab20f9303401ab06bdae8">size</a>()); <a name="l00594"></a>00594 <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> p = <a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]; <a name="l00595"></a>00595 ++<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]; <a name="l00596"></a>00596 <a name="l00597"></a>00597 <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a0fadaaf875137eeeb2d24c91c05bd0fd">append</a>(0, inner); <a name="l00598"></a>00598 <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix.html#a3eceb10d19db02ee3c9c5dfdf7390ec6">m_data</a>.<a class="code" href="class_compressed_storage.html#a5969d6b59a14821d2a5bf07b60a3fd5a">value</a>(p); <a name="l00599"></a>00599 } <a name="l00600"></a>00600 <span class="comment"></span> <a name="l00601"></a>00601 <span class="comment"> /** \deprecated use finalize */</span> <a name="l00602"></a><a class="code" href="class_sparse_matrix.html#a38647c3a2fab149264fa696aa208b198">00602</a> <a class="code" href="_macros_8h.html#a215b4c2831ed3631e9149b53a8ecb878">EIGEN_DEPRECATED</a> <span class="keywordtype">void</span> <a class="code" href="class_sparse_matrix.html#a38647c3a2fab149264fa696aa208b198">endFill</a>() { <a class="code" href="class_sparse_matrix.html#a083a756f5485e97716e292b83a88f2dd" title="Must be called after inserting a set of non zero entries.">finalize</a>(); } <a name="l00603"></a>00603 <a name="l00604"></a>00604 <span class="keyword">private</span>: <a name="l00605"></a><a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html">00605</a> <span class="keyword">struct </span><a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html">default_prunning_func</a> { <a name="l00606"></a><a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html#ac3bb17ca511a9a655ecf8e1e823d3cb5">00606</a> <a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html#ac3bb17ca511a9a655ecf8e1e823d3cb5">default_prunning_func</a>(<a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a> ref, RealScalar eps) : reference(ref), <a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html#a6969682fb57e4ebb62c8b0572136e22d">epsilon</a>(eps) {} <a name="l00607"></a><a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html#a5115b6dde7d1b86914da8a64180d6081">00607</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html#a5115b6dde7d1b86914da8a64180d6081">operator() </a>(<span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a>&, <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a>&, <span class="keyword">const</span> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>& value)<span class="keyword"> const</span> <a name="l00608"></a>00608 <span class="keyword"> </span>{ <a name="l00609"></a>00609 <span class="keywordflow">return</span> !<a class="code" href="namespaceinternal.html#a734df4b9b4cc7c4e7aa66738d113b36e">internal::isMuchSmallerThan</a>(value, reference, <a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html#a6969682fb57e4ebb62c8b0572136e22d">epsilon</a>); <a name="l00610"></a>00610 } <a name="l00611"></a><a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html#a7c4e8ce4c38ba120ea569e0896c2ea35">00611</a> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a> <a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html#a7c4e8ce4c38ba120ea569e0896c2ea35">reference</a>; <a name="l00612"></a><a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html#a6969682fb57e4ebb62c8b0572136e22d">00612</a> RealScalar <a class="code" href="struct_sparse_matrix_1_1default__prunning__func.html#a6969682fb57e4ebb62c8b0572136e22d">epsilon</a>; <a name="l00613"></a>00613 }; <a name="l00614"></a>00614 }; <a name="l00615"></a>00615 <a name="l00616"></a>00616 <span class="keyword">template</span><<span class="keyword">typename</span> Scalar, <span class="keywordtype">int</span> _Options, <span class="keyword">typename</span> _Index> <a name="l00617"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html">00617</a> <span class="keyword">class </span><a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a><<a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>,_Options,_Index>::<a class="code" href="class_sparse_matrix_1_1_inner_iterator.html">InnerIterator</a> <a name="l00618"></a>00618 { <a name="l00619"></a>00619 <span class="keyword">public</span>: <a name="l00620"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a4eed41c1452d6ebedda139c2d43f4796">00620</a> <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html">InnerIterator</a>(<span class="keyword">const</span> <a class="code" href="class_sparse_matrix.html" title="The main sparse matrix class.">SparseMatrix</a>& mat, <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> outer) <a name="l00621"></a>00621 : m_values(mat.<a class="code" href="class_sparse_matrix.html#a91cdd6245a07406d15a34b56b7bf95d2">_valuePtr</a>()), m_indices(mat.<a class="code" href="class_sparse_matrix.html#af1b1f6920f2002ea76ec7bb0ce662f74">_innerIndexPtr</a>()), m_outer(outer), m_id(mat.<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer]), m_end(mat.<a class="code" href="class_sparse_matrix.html#a4a38ff7a9ad9750d51d2903437972633">m_outerIndex</a>[outer+1]) <a name="l00622"></a>00622 {} <a name="l00623"></a>00623 <a name="l00624"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#aa328e42fb7809885f76e30e1eca39010">00624</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html">InnerIterator</a>& <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#aa328e42fb7809885f76e30e1eca39010">operator++</a>() { m_id++; <span class="keywordflow">return</span> *<span class="keyword">this</span>; } <a name="l00625"></a>00625 <a name="l00626"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#ad5de3b975efca7c1c76c9cd63b0baa15">00626</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>& <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#ad5de3b975efca7c1c76c9cd63b0baa15">value</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_values[m_id]; } <a name="l00627"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#aeeb0fc2d3192ce1ebf56724b240886bf">00627</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>& <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#aeeb0fc2d3192ce1ebf56724b240886bf">valueRef</a>() { <span class="keywordflow">return</span> <span class="keyword">const_cast<</span><a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>&<span class="keyword">></span>(m_values[m_id]); } <a name="l00628"></a>00628 <a name="l00629"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a7521082d5eae04fa09ec04bb48c9e863">00629</a> <span class="keyword">inline</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a7521082d5eae04fa09ec04bb48c9e863">index</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_indices[m_id]; } <a name="l00630"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a2eca42558c20aaf89816af058ce71729">00630</a> <span class="keyword">inline</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a2eca42558c20aaf89816af058ce71729">outer</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_outer; } <a name="l00631"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a20bf9c134b50c3258b8e27fd5c38ce88">00631</a> <span class="keyword">inline</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a20bf9c134b50c3258b8e27fd5c38ce88">row</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? m_outer : index(); } <a name="l00632"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#af96493495d0fd1bc2eb3736c4d3e1a2e">00632</a> <span class="keyword">inline</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#af96493495d0fd1bc2eb3736c4d3e1a2e">col</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="class_sparse_matrix_base.html#adbd0d75b607fc0e6e8324f141a1f2701ab1c0e4cad7f5e1ae0211abbed1591a9c">IsRowMajor</a> ? index() : m_outer; } <a name="l00633"></a>00633 <a name="l00634"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#aa93f19b43737125544e5c6fca3b9d21a">00634</a> <span class="keyword">inline</span> <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#aa93f19b43737125544e5c6fca3b9d21a">operator bool</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_id < m_end); } <a name="l00635"></a>00635 <a name="l00636"></a>00636 <span class="keyword">protected</span>: <a name="l00637"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a8b7747c1ef4133a6dc34eee3f342cc24">00637</a> <span class="keyword">const</span> <a class="code" href="class_sparse_matrix_base.html#a5e58e9b0abaf0f6f5d018d32926b6a17">Scalar</a>* <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a8b7747c1ef4133a6dc34eee3f342cc24">m_values</a>; <a name="l00638"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#af24cc48f0310d9a3bea9f41e53dd3515">00638</a> <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a>* <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#af24cc48f0310d9a3bea9f41e53dd3515">m_indices</a>; <a name="l00639"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a63b3948309fd81ff6c7dc461b228c58f">00639</a> <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a63b3948309fd81ff6c7dc461b228c58f">m_outer</a>; <a name="l00640"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a2a74aa6eacf73b545959a1adb9243558">00640</a> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a2a74aa6eacf73b545959a1adb9243558">m_id</a>; <a name="l00641"></a><a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a83306d85a7d59b5e6367b374aaa04f24">00641</a> <span class="keyword">const</span> <a class="code" href="struct_eigen_base.html#ae16d01a6ef4203489bca06ca933fe410">Index</a> <a class="code" href="class_sparse_matrix_1_1_inner_iterator.html#a83306d85a7d59b5e6367b374aaa04f24">m_end</a>; <a name="l00642"></a>00642 }; <a name="l00643"></a>00643 <a name="l00644"></a>00644 <span class="preprocessor">#endif // EIGEN_SPARSEMATRIX_H</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.2</a> for MRPT 0.9.4 SVN: at Mon Jan 10 22:30:30 UTC 2011</td><td></td> <td width="100"> </td> <td width="150"> </td></tr> </table> </body></html>