root/doc/html/svec_8h-source.html @ 353

Revision 353, 125.8 kB (checked in by smidl, 16 years ago)

doc

Line 
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
3<title>mixpp: svec.h Source File</title>
4<link href="tabs.css" rel="stylesheet" type="text/css">
5<link href="doxygen.css" rel="stylesheet" type="text/css">
6</head><body>
7<!-- Generated by Doxygen 1.5.8 -->
8<script type="text/javascript">
9<!--
10function changeDisplayState (e){
11  var num=this.id.replace(/[^[0-9]/g,'');
12  var button=this.firstChild;
13  var sectionDiv=document.getElementById('dynsection'+num);
14  if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
15    sectionDiv.style.display='block';
16    button.src='open.gif';
17  }else{
18    sectionDiv.style.display='none';
19    button.src='closed.gif';
20  }
21}
22function initDynSections(){
23  var divs=document.getElementsByTagName('div');
24  var sectionCounter=1;
25  for(var i=0;i<divs.length-1;i++){
26    if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
27      var header=divs[i];
28      var section=divs[i+1];
29      var button=header.firstChild;
30      if (button!='IMG'){
31        divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
32        button=document.createElement('img');
33        divs[i].insertBefore(button,divs[i].firstChild);
34      }
35      header.style.cursor='pointer';
36      header.onclick=changeDisplayState;
37      header.id='dynheader'+sectionCounter;
38      button.src='closed.gif';
39      section.id='dynsection'+sectionCounter;
40      section.style.display='none';
41      section.style.marginLeft='14px';
42      sectionCounter++;
43    }
44  }
45}
46window.onload = initDynSections;
47-->
48</script>
49<div class="navigation" id="top">
50  <div class="tabs">
51    <ul>
52      <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
53      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
54      <li><a href="modules.html"><span>Modules</span></a></li>
55      <li><a href="annotated.html"><span>Classes</span></a></li>
56      <li class="current"><a href="files.html"><span>Files</span></a></li>
57    </ul>
58  </div>
59  <div class="tabs">
60    <ul>
61      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
62      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
63    </ul>
64  </div>
65<h1>svec.h</h1><a href="svec_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001
66<a name="l00029"></a>00029 <span class="preprocessor">#ifndef SVEC_H</span>
67<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define SVEC_H</span>
68<a name="l00031"></a>00031 <span class="preprocessor"></span>
69<a name="l00032"></a>00032 <span class="preprocessor">#ifndef _MSC_VER</span>
70<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;itpp/config.h&gt;</span>
71<a name="l00034"></a>00034 <span class="preprocessor">#else</span>
72<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;itpp/config_msvc.h&gt;</span>
73<a name="l00036"></a>00036 <span class="preprocessor">#endif</span>
74<a name="l00037"></a>00037 <span class="preprocessor"></span>
75<a name="l00038"></a>00038 <span class="preprocessor">#include &lt;<a class="code" href="vec_8h.html" title="Templated Vector Class Definitions.">itpp/base/vec.h</a>&gt;</span>
76<a name="l00039"></a>00039 <span class="preprocessor">#include &lt;<a class="code" href="min__max_8h.html" title="Minimum and maximum functions on vectors and matrices.">itpp/base/math/min_max.h</a>&gt;</span>
77<a name="l00040"></a>00040 <span class="preprocessor">#include &lt;cstdlib&gt;</span>
78<a name="l00041"></a>00041
79<a name="l00042"></a>00042
80<a name="l00043"></a>00043 <span class="keyword">namespace </span>itpp
81<a name="l00044"></a>00044 {
82<a name="l00045"></a>00045
83<a name="l00046"></a>00046 <span class="comment">// Declaration of class Vec</span>
84<a name="l00047"></a>00047 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">class </span>Vec;
85<a name="l00048"></a>00048 <span class="comment">// Declaration of class Sparse_Vec</span>
86<a name="l00049"></a>00049 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">class </span>Sparse_Vec;
87<a name="l00050"></a>00050
88<a name="l00051"></a>00051 <span class="comment">// ----------------------- Sparse_Vec Friends -------------------------------</span>
89<a name="l00052"></a>00052
90<a name="l00054"></a>00054 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
91<a name="l00055"></a>00055 Sparse_Vec&lt;T&gt; <a class="code" href="group__fixed.html#g683d6c037357e472e84756fe1b1faae8" title="Fix + cfixmat.">operator+</a>(<span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v2);
92<a name="l00056"></a>00056
93<a name="l00058"></a>00058 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
94<a name="l00059"></a>00059 T <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v2);
95<a name="l00060"></a>00060
96<a name="l00062"></a>00062 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
97<a name="l00063"></a>00063 T <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Vec&lt;T&gt; &amp;v2);
98<a name="l00064"></a>00064
99<a name="l00066"></a>00066 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
100<a name="l00067"></a>00067 T <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v2);
101<a name="l00068"></a>00068
102<a name="l00070"></a>00070 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
103<a name="l00071"></a>00071 Sparse_Vec&lt;T&gt; elem_mult(<span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v2);
104<a name="l00072"></a>00072
105<a name="l00074"></a>00074 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
106<a name="l00075"></a>00075 Vec&lt;T&gt; elem_mult(<span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Vec&lt;T&gt; &amp;v2);
107<a name="l00076"></a>00076
108<a name="l00078"></a>00078 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
109<a name="l00079"></a>00079 Sparse_Vec&lt;T&gt; elem_mult_s(<span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Vec&lt;T&gt; &amp;v2);
110<a name="l00080"></a>00080
111<a name="l00082"></a>00082 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
112<a name="l00083"></a>00083 Vec&lt;T&gt; elem_mult(<span class="keyword">const</span> Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v2);
113<a name="l00084"></a>00084
114<a name="l00086"></a>00086 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
115<a name="l00087"></a>00087 Sparse_Vec&lt;T&gt; elem_mult_s(<span class="keyword">const</span> Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v2);
116<a name="l00088"></a>00088
117<a name="l00099"></a>00099 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
118<a name="l00100"></a><a class="code" href="classitpp_1_1Sparse__Vec.html">00100</a> <span class="keyword">class </span><a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec</a>
119<a name="l00101"></a>00101 {
120<a name="l00102"></a>00102 <span class="keyword">public</span>:
121<a name="l00103"></a>00103
122<a name="l00105"></a>00105   <a class="code" href="classitpp_1_1Sparse__Vec.html#39fcb7d641a1b6c022e7413041e00f0a" title="Default constructor.">Sparse_Vec</a>();
123<a name="l00106"></a>00106
124<a name="l00113"></a>00113   <a class="code" href="classitpp_1_1Sparse__Vec.html#39fcb7d641a1b6c022e7413041e00f0a" title="Default constructor.">Sparse_Vec</a>(<span class="keywordtype">int</span> sz, <span class="keywordtype">int</span> data_init = 200);
125<a name="l00114"></a>00114
126<a name="l00120"></a>00120   <a class="code" href="classitpp_1_1Sparse__Vec.html#39fcb7d641a1b6c022e7413041e00f0a" title="Default constructor.">Sparse_Vec</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v);
127<a name="l00121"></a>00121
128<a name="l00127"></a>00127   <a class="code" href="classitpp_1_1Sparse__Vec.html#39fcb7d641a1b6c022e7413041e00f0a" title="Default constructor.">Sparse_Vec</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v);
129<a name="l00128"></a>00128
130<a name="l00134"></a>00134   <a class="code" href="classitpp_1_1Sparse__Vec.html#39fcb7d641a1b6c022e7413041e00f0a" title="Default constructor.">Sparse_Vec</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v, T epsilon);
131<a name="l00135"></a>00135
132<a name="l00137"></a>00137   <a class="code" href="classitpp_1_1Sparse__Vec.html#91654f6ae8be75ca792f8e6aea4195fc" title="Destructor.">~Sparse_Vec</a>();
133<a name="l00138"></a>00138
134<a name="l00145"></a>00145   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#1f542b437bdf9942b3f386ccc6e53577" title="Set the size sz of the sparse vector. Default value data_init=-1 =&amp;gt; allocated...">set_size</a>(<span class="keywordtype">int</span> sz, <span class="keywordtype">int</span> data_init = -1);
135<a name="l00146"></a>00146
136<a name="l00148"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#86a41d34d1d5a1dbfe778b6fe21bf98e">00148</a>   <span class="keywordtype">int</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#86a41d34d1d5a1dbfe778b6fe21bf98e" title="Returns the size of the sparse vector.">size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> v_size; }
137<a name="l00149"></a>00149
138<a name="l00151"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#574eb67974100fb492067c16216dbefc">00151</a>   <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#574eb67974100fb492067c16216dbefc" title="Number of non-zero elements in the sparse vector.">nnz</a>() {
139<a name="l00152"></a>00152     <span class="keywordflow">if</span> (check_small_elems_flag) {
140<a name="l00153"></a>00153       <a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">remove_small_elements</a>();
141<a name="l00154"></a>00154     }
142<a name="l00155"></a>00155     <span class="keywordflow">return</span> used_size;
143<a name="l00156"></a>00156   }
144<a name="l00157"></a>00157
145<a name="l00159"></a>00159   <span class="keywordtype">double</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#9dcac972a88c8e86eb2b32794db4ab1a" title="Returns the density of the sparse vector: (number of non-zero elements)/(size of...">density</a>();
146<a name="l00160"></a>00160
147<a name="l00162"></a>00162   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#6f2ddfff6c73bf4afb024cb6502960ae" title="Set that all elements smaller than epsilon should be set to zero.">set_small_element</a>(<span class="keyword">const</span> T&amp; epsilon);
148<a name="l00163"></a>00163
149<a name="l00169"></a>00169   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">remove_small_elements</a>();
150<a name="l00170"></a>00170
151<a name="l00176"></a>00176   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073" title="Set the maximum number of non-zero elements to new_size.">resize_data</a>(<span class="keywordtype">int</span> new_size);
152<a name="l00177"></a>00177
153<a name="l00179"></a>00179   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#eecd9a99a1aef11b939ef9a5a329ee6e" title="Set the maximum number of non-zero elements equal to the actual number of non-zero...">compact</a>();
154<a name="l00180"></a>00180
155<a name="l00182"></a>00182   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#8918eae0c5c39b224912a6d3296a160f" title="Returns a full, dense vector.">full</a>(<a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v) <span class="keyword">const</span>;
156<a name="l00183"></a>00183
157<a name="l00185"></a>00185   <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> <a class="code" href="classitpp_1_1Sparse__Vec.html#8918eae0c5c39b224912a6d3296a160f" title="Returns a full, dense vector.">full</a>() <span class="keyword">const</span>;
158<a name="l00186"></a>00186
159<a name="l00188"></a>00188   T <a class="code" href="classitpp_1_1Sparse__Vec.html#7e9b425456f1df975b156eae385dc1f6" title="Returns the element with index i.">operator()</a>(<span class="keywordtype">int</span> i) <span class="keyword">const</span>;
160<a name="l00189"></a>00189
161<a name="l00191"></a>00191   <span class="keywordtype">void</span> <span class="keyword">set</span>(<span class="keywordtype">int</span> i, T v);
162<a name="l00192"></a>00192
163<a name="l00194"></a>00194   <span class="keywordtype">void</span> <span class="keyword">set</span>(<span class="keyword">const</span> ivec &amp;index_vec, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v);
164<a name="l00195"></a>00195
165<a name="l00197"></a>00197   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#55adfb73da94ec8e567270d344d17555" title="Set a new element with index i equal to v.">set_new</a>(<span class="keywordtype">int</span> i, T v);
166<a name="l00198"></a>00198
167<a name="l00200"></a>00200   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#55adfb73da94ec8e567270d344d17555" title="Set a new element with index i equal to v.">set_new</a>(<span class="keyword">const</span> ivec &amp;index_vec, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v);
168<a name="l00201"></a>00201
169<a name="l00203"></a>00203   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#63b4e493346887db93f25b40f7352b91" title="Add element i with v.">add_elem</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i, <span class="keyword">const</span> T v);
170<a name="l00204"></a>00204
171<a name="l00206"></a>00206   <span class="keywordtype">void</span> <span class="keyword">add</span>(<span class="keyword">const</span> ivec &amp;index_vec, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v);
172<a name="l00207"></a>00207
173<a name="l00209"></a>00209   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#259ac11b4eec8a9b76d14777edcdf941" title="Set the sparse vector to the all zero vector (removes all non-zero elements).">zeros</a>();
174<a name="l00210"></a>00210
175<a name="l00212"></a>00212   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#7f28c432a7166b661834b6ddfa0aefc4" title="Set the i-th element to zero (i.e. clear that element if it contains a non-zero value)...">zero_elem</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i);
176<a name="l00213"></a>00213
177<a name="l00215"></a>00215   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#e48f0bf68cfa0d2c8700952585e0c8eb" title="Clear all non-zero elements of the sparse vector.">clear</a>();
178<a name="l00216"></a>00216
179<a name="l00218"></a>00218   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#7e9f5693f6b709ddf7367b7e4b846f07" title="Clear the i-th element (if it contains a non-zero value).">clear_elem</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i);
180<a name="l00219"></a>00219
181<a name="l00223"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#992d661ff475547dde7167b11a2623df">00223</a>   <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#992d661ff475547dde7167b11a2623df" title="Extract the reference to the p-th non-zero data element.">get_nz_data</a>(<span class="keywordtype">int</span> p, T&amp; data_out) {
182<a name="l00224"></a>00224     <span class="keywordflow">if</span> (check_small_elems_flag) {
183<a name="l00225"></a>00225       <a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">remove_small_elements</a>();
184<a name="l00226"></a>00226     }
185<a name="l00227"></a>00227     data_out = data[p];
186<a name="l00228"></a>00228   }
187<a name="l00229"></a>00229
188<a name="l00231"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#48b6acd9fe36985f92b8746be784f2ec">00231</a>   <span class="keyword">inline</span> T <a class="code" href="classitpp_1_1Sparse__Vec.html#48b6acd9fe36985f92b8746be784f2ec" title="Returns the p-th non-zero data element.">get_nz_data</a>(<span class="keywordtype">int</span> p) {
189<a name="l00232"></a>00232     <span class="keywordflow">if</span> (check_small_elems_flag) {
190<a name="l00233"></a>00233       <a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">remove_small_elements</a>();
191<a name="l00234"></a>00234     }
192<a name="l00235"></a>00235     <span class="keywordflow">return</span> data[p];
193<a name="l00236"></a>00236   }
194<a name="l00237"></a>00237
195<a name="l00239"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#a86f06c01f042925d6b8005b26bd6b0b">00239</a>   <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#a86f06c01f042925d6b8005b26bd6b0b" title="Returns the vector index of the p-th non-zero element.">get_nz_index</a>(<span class="keywordtype">int</span> p) {
196<a name="l00240"></a>00240     <span class="keywordflow">if</span> (check_small_elems_flag) {
197<a name="l00241"></a>00241       <a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">remove_small_elements</a>();
198<a name="l00242"></a>00242     }
199<a name="l00243"></a>00243     <span class="keywordflow">return</span> index[p];
200<a name="l00244"></a>00244   }
201<a name="l00245"></a>00245
202<a name="l00247"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#bc9847c443a80c136306daeca1fdc3bf">00247</a>   <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#bc9847c443a80c136306daeca1fdc3bf" title="Returns the p-th non-zero value in dat and the corresponding vector index in idx...">get_nz</a>(<span class="keywordtype">int</span> p, <span class="keywordtype">int</span> &amp;idx, T &amp;dat) {
203<a name="l00248"></a>00248     <span class="keywordflow">if</span> (check_small_elems_flag) {
204<a name="l00249"></a>00249       <a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">remove_small_elements</a>();
205<a name="l00250"></a>00250     }
206<a name="l00251"></a>00251     idx = index[p];
207<a name="l00252"></a>00252     dat = data[p];
208<a name="l00253"></a>00253   }
209<a name="l00254"></a>00254
210<a name="l00256"></a>00256   ivec <a class="code" href="classitpp_1_1Sparse__Vec.html#52046b9bcd75e1fda1d745e9dbc4f8e7" title="Return the indices of non-zero values.">get_nz_indices</a>();
211<a name="l00257"></a>00257
212<a name="l00259"></a>00259   <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> <a class="code" href="classitpp_1_1Sparse__Vec.html#4d5f4ce3ee456b4623b995df6bbe19b5" title="Return sparse subvector from index i1 to index i2.">get_subvector</a>(<span class="keywordtype">int</span> i1, <span class="keywordtype">int</span> i2) <span class="keyword">const</span>;
213<a name="l00260"></a>00260
214<a name="l00262"></a>00262   T <a class="code" href="classitpp_1_1Sparse__Vec.html#e3dbd58f2a416f2cf9b515e8e91fc95b" title="Returns the sum of all values squared.">sqr</a>() <span class="keyword">const</span>;
215<a name="l00263"></a>00263
216<a name="l00265"></a>00265   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#c4ef932d3ed56cba68c8b0ecb7ba278b" title="Assign sparse vector the value and length of the sparse vector v.">operator=</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v);
217<a name="l00267"></a>00267   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#c4ef932d3ed56cba68c8b0ecb7ba278b" title="Assign sparse vector the value and length of the sparse vector v.">operator=</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v);
218<a name="l00268"></a>00268
219<a name="l00270"></a>00270   <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> <a class="code" href="classitpp_1_1Sparse__Vec.html#db64167ef8f7b46cc6a8b3f2d72a549f" title="Returns the sign inverse of all elements in the sparse vector.">operator-</a>() <span class="keyword">const</span>;
220<a name="l00271"></a>00271
221<a name="l00273"></a>00273   <span class="keywordtype">bool</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#4a2d2a7bea045243c796d91cfb390a13" title="Compare two sparse vectors. False if wrong sizes or different values.">operator==</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v);
222<a name="l00274"></a>00274
223<a name="l00276"></a>00276   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#f801cdfc077c286c2fb4079239ac11d1" title="Add sparse vector v to all non-zero elements of the sparse vector.">operator+=</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v);
224<a name="l00277"></a>00277
225<a name="l00279"></a>00279   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#f801cdfc077c286c2fb4079239ac11d1" title="Add sparse vector v to all non-zero elements of the sparse vector.">operator+=</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v);
226<a name="l00280"></a>00280
227<a name="l00282"></a>00282   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#6e6425041822cfa30871bae71ede7df4" title="Subtract sparse vector v from all non-zero elements of the sparse vector.">operator-=</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v);
228<a name="l00283"></a>00283
229<a name="l00285"></a>00285   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#6e6425041822cfa30871bae71ede7df4" title="Subtract sparse vector v from all non-zero elements of the sparse vector.">operator-=</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v);
230<a name="l00286"></a>00286
231<a name="l00288"></a>00288   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#70ed1fcb5802f4bd60009ed198c49c20" title="Multiply the scalar v to all non-zero elements of the sparse vector.">operator*=</a>(<span class="keyword">const</span> T &amp;v);
232<a name="l00289"></a>00289
233<a name="l00291"></a>00291   <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#16a5b698293b1e9ea3b79d4c5ce58934" title="Divide all non-zero elements of the sparse vector with the scalar v.">operator/=</a>(<span class="keyword">const</span> T &amp;v);
234<a name="l00292"></a>00292
235<a name="l00294"></a>00294   <span class="keyword">friend</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> operator+&lt;&gt;(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v2);
236<a name="l00296"></a>00296   <span class="keyword">friend</span> T operator*&lt;&gt;(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v2);
237<a name="l00298"></a>00298   <span class="keyword">friend</span> T operator*&lt;&gt;(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v2);
238<a name="l00300"></a>00300   <span class="keyword">friend</span> T operator*&lt;&gt;(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v2);
239<a name="l00301"></a>00301
240<a name="l00303"></a>00303   <span class="keyword">friend</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> elem_mult &lt;&gt;(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v2);
241<a name="l00304"></a>00304
242<a name="l00306"></a>00306   <span class="keyword">friend</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> elem_mult &lt;&gt;(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v2);
243<a name="l00307"></a>00307
244<a name="l00309"></a>00309   <span class="keyword">friend</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> elem_mult_s &lt;&gt;(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v2);
245<a name="l00310"></a>00310
246<a name="l00312"></a>00312   <span class="keyword">friend</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> elem_mult &lt;&gt;(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v2);
247<a name="l00313"></a>00313
248<a name="l00315"></a>00315   <span class="keyword">friend</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> elem_mult_s &lt;&gt;(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v2);
249<a name="l00316"></a>00316
250<a name="l00317"></a>00317 <span class="keyword">private</span>:
251<a name="l00318"></a>00318   <span class="keywordtype">void</span> init();
252<a name="l00319"></a>00319   <span class="keywordtype">void</span> alloc();
253<a name="l00320"></a>00320   <span class="keywordtype">void</span> free();
254<a name="l00321"></a>00321
255<a name="l00322"></a>00322   <span class="keywordtype">int</span> v_size, used_size, data_size;
256<a name="l00323"></a>00323   T *data;
257<a name="l00324"></a>00324   <span class="keywordtype">int</span> *index;
258<a name="l00325"></a>00325   T eps;
259<a name="l00326"></a>00326   <span class="keywordtype">bool</span> check_small_elems_flag;
260<a name="l00327"></a>00327 };
261<a name="l00328"></a>00328
262<a name="l00329"></a>00329
263<a name="l00334"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#9c7a34f62113a49ebdb45be6766d9b68">00334</a> <span class="keyword">typedef</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;int&gt;</a> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">sparse_ivec</a>;
264<a name="l00335"></a>00335
265<a name="l00340"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#fcc678091b4abbce7fc2cabb44366195">00340</a> <span class="keyword">typedef</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;double&gt;</a> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">sparse_vec</a>;
266<a name="l00341"></a>00341
267<a name="l00346"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#a91a51f05c91ecbac0568b57d07b20ef">00346</a> <span class="keyword">typedef</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;std::complex&lt;double&gt;</a> &gt; <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">sparse_cvec</a>;
268<a name="l00347"></a>00347
269<a name="l00348"></a>00348 <span class="comment">// ----------------------- Implementation starts here --------------------------------</span>
270<a name="l00349"></a>00349
271<a name="l00350"></a>00350 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
272<a name="l00351"></a>00351 <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;::init</a>()
273<a name="l00352"></a>00352 {
274<a name="l00353"></a>00353   v_size = 0;
275<a name="l00354"></a>00354   used_size = 0;
276<a name="l00355"></a>00355   data_size = 0;
277<a name="l00356"></a>00356   data = 0;
278<a name="l00357"></a>00357   index = 0;
279<a name="l00358"></a>00358   eps = 0;
280<a name="l00359"></a>00359   check_small_elems_flag = <span class="keyword">true</span>;
281<a name="l00360"></a>00360 }
282<a name="l00361"></a>00361
283<a name="l00362"></a>00362 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
284<a name="l00363"></a>00363 <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;::alloc</a>()
285<a name="l00364"></a>00364 {
286<a name="l00365"></a>00365   <span class="keywordflow">if</span> (data_size != 0) {
287<a name="l00366"></a>00366     data = <span class="keyword">new</span> T[data_size];
288<a name="l00367"></a>00367     index = <span class="keyword">new</span> <span class="keywordtype">int</span>[data_size];
289<a name="l00368"></a>00368   }
290<a name="l00369"></a>00369 }
291<a name="l00370"></a>00370
292<a name="l00371"></a>00371 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
293<a name="l00372"></a>00372 <span class="keywordtype">void</span> Sparse_Vec&lt;T&gt;::free()
294<a name="l00373"></a>00373 {
295<a name="l00374"></a>00374   <span class="keyword">delete</span> [] data;
296<a name="l00375"></a>00375   data = 0;
297<a name="l00376"></a>00376   <span class="keyword">delete</span> [] index;
298<a name="l00377"></a>00377   index = 0;
299<a name="l00378"></a>00378 }
300<a name="l00379"></a>00379
301<a name="l00380"></a>00380 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
302<a name="l00381"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#39fcb7d641a1b6c022e7413041e00f0a">00381</a> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;::Sparse_Vec</a>()
303<a name="l00382"></a>00382 {
304<a name="l00383"></a>00383   init();
305<a name="l00384"></a>00384 }
306<a name="l00385"></a>00385
307<a name="l00386"></a>00386 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
308<a name="l00387"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#a0abee3a9c045d3093fb1becc3a4be32">00387</a> <a class="code" href="classitpp_1_1Sparse__Vec.html#39fcb7d641a1b6c022e7413041e00f0a" title="Default constructor.">Sparse_Vec&lt;T&gt;::Sparse_Vec</a>(<span class="keywordtype">int</span> sz, <span class="keywordtype">int</span> data_init)
309<a name="l00388"></a>00388 {
310<a name="l00389"></a>00389   init();
311<a name="l00390"></a>00390   v_size = sz;
312<a name="l00391"></a>00391   used_size = 0;
313<a name="l00392"></a>00392   data_size = data_init;
314<a name="l00393"></a>00393   alloc();
315<a name="l00394"></a>00394 }
316<a name="l00395"></a>00395
317<a name="l00396"></a>00396 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
318<a name="l00397"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#9fd90c90b73ec0d6a92a641f3c7dcc23">00397</a> <a class="code" href="classitpp_1_1Sparse__Vec.html#39fcb7d641a1b6c022e7413041e00f0a" title="Default constructor.">Sparse_Vec&lt;T&gt;::Sparse_Vec</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v)
319<a name="l00398"></a>00398 {
320<a name="l00399"></a>00399   init();
321<a name="l00400"></a>00400   v_size = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#56544763039cddac697f85e0c93b0cae">v_size</a>;
322<a name="l00401"></a>00401   used_size = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a>;
323<a name="l00402"></a>00402   data_size = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#e42b4bbb568b40f0fc892fe50fefb39b">data_size</a>;
324<a name="l00403"></a>00403   eps = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#a04529ad0bd986d655c9a3a60a8f75cc">eps</a>;
325<a name="l00404"></a>00404   check_small_elems_flag = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#555c9755a92011a2fdcfb66a6dfe3186">check_small_elems_flag</a>;
326<a name="l00405"></a>00405   alloc();
327<a name="l00406"></a>00406
328<a name="l00407"></a>00407   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; used_size; i++) {
329<a name="l00408"></a>00408     data[i] = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#31ce2b788940d0c05edc2328af3433f1">data</a>[i];
330<a name="l00409"></a>00409     index[i] = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#2211187e13cf6bc1e824e606e5bcd28e">index</a>[i];
331<a name="l00410"></a>00410   }
332<a name="l00411"></a>00411 }
333<a name="l00412"></a>00412
334<a name="l00413"></a>00413 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
335<a name="l00414"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#cafcd2a02b1c37ffb519b02afcff2e25">00414</a> <a class="code" href="classitpp_1_1Sparse__Vec.html#39fcb7d641a1b6c022e7413041e00f0a" title="Default constructor.">Sparse_Vec&lt;T&gt;::Sparse_Vec</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v)
336<a name="l00415"></a>00415 {
337<a name="l00416"></a>00416   init();
338<a name="l00417"></a>00417   v_size = v.<a class="code" href="classitpp_1_1Vec.html#a906c893cd6184a774e4da8a47217d6a" title="The size of the vector.">size</a>();
339<a name="l00418"></a>00418   used_size = 0;
340<a name="l00419"></a>00419   data_size = <a class="code" href="group__protocol.html#g27dde5be5aac902c0de838b4b872cd2f" title="ADD DOCUMENTATION HERE.">std::min</a>(v.<a class="code" href="classitpp_1_1Vec.html#a906c893cd6184a774e4da8a47217d6a" title="The size of the vector.">size</a>(), 10000);
341<a name="l00420"></a>00420   alloc();
342<a name="l00421"></a>00421
343<a name="l00422"></a>00422   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; v_size; i++) {
344<a name="l00423"></a>00423     <span class="keywordflow">if</span> (v(i) != T(0)) {
345<a name="l00424"></a>00424       <span class="keywordflow">if</span> (used_size == data_size)
346<a name="l00425"></a>00425         <a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073" title="Set the maximum number of non-zero elements to new_size.">resize_data</a>(data_size*2);
347<a name="l00426"></a>00426       data[used_size] = v(i);
348<a name="l00427"></a>00427       index[used_size] = i;
349<a name="l00428"></a>00428       used_size++;
350<a name="l00429"></a>00429     }
351<a name="l00430"></a>00430   }
352<a name="l00431"></a>00431   <a class="code" href="classitpp_1_1Sparse__Vec.html#eecd9a99a1aef11b939ef9a5a329ee6e" title="Set the maximum number of non-zero elements equal to the actual number of non-zero...">compact</a>();
353<a name="l00432"></a>00432 }
354<a name="l00433"></a>00433
355<a name="l00434"></a>00434 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
356<a name="l00435"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#11808d0c9a62f8a68707567efe82e19f">00435</a> <a class="code" href="classitpp_1_1Sparse__Vec.html#39fcb7d641a1b6c022e7413041e00f0a" title="Default constructor.">Sparse_Vec&lt;T&gt;::Sparse_Vec</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v, T epsilon)
357<a name="l00436"></a>00436 {
358<a name="l00437"></a>00437   init();
359<a name="l00438"></a>00438   v_size = v.<a class="code" href="classitpp_1_1Vec.html#a906c893cd6184a774e4da8a47217d6a" title="The size of the vector.">size</a>();
360<a name="l00439"></a>00439   used_size = 0;
361<a name="l00440"></a>00440   data_size = <a class="code" href="group__protocol.html#g27dde5be5aac902c0de838b4b872cd2f" title="ADD DOCUMENTATION HERE.">std::min</a>(v.<a class="code" href="classitpp_1_1Vec.html#a906c893cd6184a774e4da8a47217d6a" title="The size of the vector.">size</a>(), 10000);
362<a name="l00441"></a>00441   eps = epsilon;
363<a name="l00442"></a>00442   alloc();
364<a name="l00443"></a>00443
365<a name="l00444"></a>00444   <span class="keywordtype">double</span> e = <a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(epsilon);
366<a name="l00445"></a>00445   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; v_size; i++) {
367<a name="l00446"></a>00446     <span class="keywordflow">if</span> (<a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(v(i)) &gt; e) {
368<a name="l00447"></a>00447       <span class="keywordflow">if</span> (used_size == data_size)
369<a name="l00448"></a>00448         <a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073" title="Set the maximum number of non-zero elements to new_size.">resize_data</a>(data_size*2);
370<a name="l00449"></a>00449       data[used_size] = v(i);
371<a name="l00450"></a>00450       index[used_size] = i;
372<a name="l00451"></a>00451       used_size++;
373<a name="l00452"></a>00452     }
374<a name="l00453"></a>00453   }
375<a name="l00454"></a>00454   <a class="code" href="classitpp_1_1Sparse__Vec.html#eecd9a99a1aef11b939ef9a5a329ee6e" title="Set the maximum number of non-zero elements equal to the actual number of non-zero...">compact</a>();
376<a name="l00455"></a>00455 }
377<a name="l00456"></a>00456
378<a name="l00457"></a>00457 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
379<a name="l00458"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#91654f6ae8be75ca792f8e6aea4195fc">00458</a> <a class="code" href="classitpp_1_1Sparse__Vec.html#91654f6ae8be75ca792f8e6aea4195fc" title="Destructor.">Sparse_Vec&lt;T&gt;::~Sparse_Vec</a>()
380<a name="l00459"></a>00459 {
381<a name="l00460"></a>00460   free();
382<a name="l00461"></a>00461 }
383<a name="l00462"></a>00462
384<a name="l00463"></a>00463 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
385<a name="l00464"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#1f542b437bdf9942b3f386ccc6e53577">00464</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#1f542b437bdf9942b3f386ccc6e53577" title="Set the size sz of the sparse vector. Default value data_init=-1 =&amp;gt; allocated...">Sparse_Vec&lt;T&gt;::set_size</a>(<span class="keywordtype">int</span> new_size, <span class="keywordtype">int</span> data_init)
386<a name="l00465"></a>00465 {
387<a name="l00466"></a>00466   v_size = new_size;
388<a name="l00467"></a>00467   used_size = 0;
389<a name="l00468"></a>00468   <span class="keywordflow">if</span> (data_init != -1) {
390<a name="l00469"></a>00469     free();
391<a name="l00470"></a>00470     data_size = data_init;
392<a name="l00471"></a>00471     alloc();
393<a name="l00472"></a>00472   }
394<a name="l00473"></a>00473 }
395<a name="l00474"></a>00474
396<a name="l00475"></a>00475 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
397<a name="l00476"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#9dcac972a88c8e86eb2b32794db4ab1a">00476</a> <span class="keywordtype">double</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#9dcac972a88c8e86eb2b32794db4ab1a" title="Returns the density of the sparse vector: (number of non-zero elements)/(size of...">Sparse_Vec&lt;T&gt;::density</a>()
398<a name="l00477"></a>00477 {
399<a name="l00478"></a>00478   <span class="keywordflow">if</span> (check_small_elems_flag) {
400<a name="l00479"></a>00479     <a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">remove_small_elements</a>();
401<a name="l00480"></a>00480   }
402<a name="l00481"></a>00481   <span class="comment">//return static_cast&lt;double&gt;(used_size) / v_size;</span>
403<a name="l00482"></a>00482   <span class="keywordflow">return</span> double(used_size) / v_size;
404<a name="l00483"></a>00483 }
405<a name="l00484"></a>00484
406<a name="l00485"></a>00485 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
407<a name="l00486"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#6f2ddfff6c73bf4afb024cb6502960ae">00486</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#6f2ddfff6c73bf4afb024cb6502960ae" title="Set that all elements smaller than epsilon should be set to zero.">Sparse_Vec&lt;T&gt;::set_small_element</a>(<span class="keyword">const</span> T&amp; epsilon)
408<a name="l00487"></a>00487 {
409<a name="l00488"></a>00488   eps = epsilon;
410<a name="l00489"></a>00489   <a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">remove_small_elements</a>();
411<a name="l00490"></a>00490 }
412<a name="l00491"></a>00491
413<a name="l00492"></a>00492 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
414<a name="l00493"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">00493</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">Sparse_Vec&lt;T&gt;::remove_small_elements</a>()
415<a name="l00494"></a>00494 {
416<a name="l00495"></a>00495   <span class="keywordtype">int</span> i;
417<a name="l00496"></a>00496   <span class="keywordtype">int</span> nrof_removed_elements = 0;
418<a name="l00497"></a>00497   <span class="keywordtype">double</span> e;
419<a name="l00498"></a>00498
420<a name="l00499"></a>00499   <span class="comment">//Remove small elements</span>
421<a name="l00500"></a>00500   e = <a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(eps);
422<a name="l00501"></a>00501   <span class="keywordflow">for</span> (i = 0;i &lt; used_size;i++) {
423<a name="l00502"></a>00502     <span class="keywordflow">if</span> (<a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(data[i]) &lt;= e) {
424<a name="l00503"></a>00503       nrof_removed_elements++;
425<a name="l00504"></a>00504     }
426<a name="l00505"></a>00505     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (nrof_removed_elements &gt; 0) {
427<a name="l00506"></a>00506       data[i-nrof_removed_elements] = data[i];
428<a name="l00507"></a>00507       index[i-nrof_removed_elements] = index[i];
429<a name="l00508"></a>00508     }
430<a name="l00509"></a>00509   }
431<a name="l00510"></a>00510
432<a name="l00511"></a>00511   <span class="comment">//Set new size after small elements have been removed</span>
433<a name="l00512"></a>00512   used_size -= nrof_removed_elements;
434<a name="l00513"></a>00513
435<a name="l00514"></a>00514   <span class="comment">//Set the flag to indicate that all small elements have been removed</span>
436<a name="l00515"></a>00515   check_small_elems_flag = <span class="keyword">false</span>;
437<a name="l00516"></a>00516 }
438<a name="l00517"></a>00517
439<a name="l00518"></a>00518
440<a name="l00519"></a>00519 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
441<a name="l00520"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073">00520</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073" title="Set the maximum number of non-zero elements to new_size.">Sparse_Vec&lt;T&gt;::resize_data</a>(<span class="keywordtype">int</span> new_size)
442<a name="l00521"></a>00521 {
443<a name="l00522"></a>00522   <a class="code" href="group__errorhandlingfunc.html#gd5c34b291e5018534fd2344486e2b5a1" title="Abort if t is not true.">it_assert</a>(new_size &gt;= used_size, <span class="stringliteral">"Sparse_Vec&lt;T&gt;::resize_data(int new_size): New size is to small"</span>);
444<a name="l00523"></a>00523
445<a name="l00524"></a>00524   <span class="keywordflow">if</span> (new_size != data_size) {
446<a name="l00525"></a>00525     <span class="keywordflow">if</span> (new_size == 0)
447<a name="l00526"></a>00526       free();
448<a name="l00527"></a>00527     <span class="keywordflow">else</span> {
449<a name="l00528"></a>00528       T *tmp_data = data;
450<a name="l00529"></a>00529       <span class="keywordtype">int</span> *tmp_pos = index;
451<a name="l00530"></a>00530       data_size = new_size;
452<a name="l00531"></a>00531       alloc();
453<a name="l00532"></a>00532       <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p = 0; p &lt; used_size; p++) {
454<a name="l00533"></a>00533         data[p] = tmp_data[p];
455<a name="l00534"></a>00534         index[p] = tmp_pos[p];
456<a name="l00535"></a>00535       }
457<a name="l00536"></a>00536       <span class="keyword">delete</span> [] tmp_data;
458<a name="l00537"></a>00537       <span class="keyword">delete</span> [] tmp_pos;
459<a name="l00538"></a>00538     }
460<a name="l00539"></a>00539   }
461<a name="l00540"></a>00540 }
462<a name="l00541"></a>00541
463<a name="l00542"></a>00542 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
464<a name="l00543"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#eecd9a99a1aef11b939ef9a5a329ee6e">00543</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#eecd9a99a1aef11b939ef9a5a329ee6e" title="Set the maximum number of non-zero elements equal to the actual number of non-zero...">Sparse_Vec&lt;T&gt;::compact</a>()
465<a name="l00544"></a>00544 {
466<a name="l00545"></a>00545   <span class="keywordflow">if</span> (check_small_elems_flag) {
467<a name="l00546"></a>00546     <a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">remove_small_elements</a>();
468<a name="l00547"></a>00547   }
469<a name="l00548"></a>00548   <a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073" title="Set the maximum number of non-zero elements to new_size.">resize_data</a>(used_size);
470<a name="l00549"></a>00549 }
471<a name="l00550"></a>00550
472<a name="l00551"></a>00551 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
473<a name="l00552"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#abb60df924a9f3ad266c24c4da4787ed">00552</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#8918eae0c5c39b224912a6d3296a160f" title="Returns a full, dense vector.">Sparse_Vec&lt;T&gt;::full</a>(<a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v)<span class="keyword"> const</span>
474<a name="l00553"></a>00553 <span class="keyword"></span>{
475<a name="l00554"></a>00554   v.<a class="code" href="classitpp_1_1Vec.html#a4b02b7819e540bb3853c15e6480ada6" title="Set length of vector. if copy = true then keeping the old values.">set_size</a>(v_size);
476<a name="l00555"></a>00555
477<a name="l00556"></a>00556   v = T(0);
478<a name="l00557"></a>00557   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p = 0; p &lt; used_size; p++)
479<a name="l00558"></a>00558     v(index[p]) = data[p];
480<a name="l00559"></a>00559 }
481<a name="l00560"></a>00560
482<a name="l00561"></a>00561 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
483<a name="l00562"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#8918eae0c5c39b224912a6d3296a160f">00562</a> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> <a class="code" href="classitpp_1_1Sparse__Vec.html#8918eae0c5c39b224912a6d3296a160f" title="Returns a full, dense vector.">Sparse_Vec&lt;T&gt;::full</a>()<span class="keyword"> const</span>
484<a name="l00563"></a>00563 <span class="keyword"></span>{
485<a name="l00564"></a>00564   <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> r(v_size);
486<a name="l00565"></a>00565   <a class="code" href="classitpp_1_1Sparse__Vec.html#8918eae0c5c39b224912a6d3296a160f" title="Returns a full, dense vector.">full</a>(r);
487<a name="l00566"></a>00566   <span class="keywordflow">return</span> r;
488<a name="l00567"></a>00567 }
489<a name="l00568"></a>00568
490<a name="l00569"></a>00569 <span class="comment">// This is slow. Implement a better search</span>
491<a name="l00570"></a>00570 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
492<a name="l00571"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#7e9b425456f1df975b156eae385dc1f6">00571</a> T <a class="code" href="classitpp_1_1Sparse__Vec.html#7e9b425456f1df975b156eae385dc1f6" title="Returns the element with index i.">Sparse_Vec&lt;T&gt;::operator()</a>(<span class="keywordtype">int</span> i)<span class="keyword"> const</span>
493<a name="l00572"></a>00572 <span class="keyword"></span>{
494<a name="l00573"></a>00573   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(i &gt;= 0 &amp;&amp; i &lt; v_size, <span class="stringliteral">"The index of the element is out of range"</span>);
495<a name="l00574"></a>00574
496<a name="l00575"></a>00575   <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;
497<a name="l00576"></a>00576   <span class="keywordtype">int</span> p;
498<a name="l00577"></a>00577   <span class="keywordflow">for</span> (p = 0; p &lt; used_size; p++) {
499<a name="l00578"></a>00578     <span class="keywordflow">if</span> (index[p] == i) {
500<a name="l00579"></a>00579       found = <span class="keyword">true</span>;
501<a name="l00580"></a>00580       <span class="keywordflow">break</span>;
502<a name="l00581"></a>00581     }
503<a name="l00582"></a>00582   }
504<a name="l00583"></a>00583   <span class="keywordflow">return</span> found ? data[p] : T(0);
505<a name="l00584"></a>00584 }
506<a name="l00585"></a>00585
507<a name="l00586"></a>00586 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
508<a name="l00587"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#080a7186e61140cdc739201bfcb60934">00587</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#080a7186e61140cdc739201bfcb60934" title="Set element i equal to v.">Sparse_Vec&lt;T&gt;::set</a>(<span class="keywordtype">int</span> i, T v)
509<a name="l00588"></a>00588 {
510<a name="l00589"></a>00589   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(i &gt;= 0 &amp;&amp; i &lt; v_size, <span class="stringliteral">"The index of the element is out of range"</span>);
511<a name="l00590"></a>00590
512<a name="l00591"></a>00591   <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;
513<a name="l00592"></a>00592   <span class="keywordtype">bool</span> larger_than_eps;
514<a name="l00593"></a>00593   <span class="keywordtype">int</span> p;
515<a name="l00594"></a>00594
516<a name="l00595"></a>00595   <span class="keywordflow">for</span> (p = 0; p &lt; used_size; p++) {
517<a name="l00596"></a>00596     <span class="keywordflow">if</span> (index[p] == i) {
518<a name="l00597"></a>00597       found = <span class="keyword">true</span>;
519<a name="l00598"></a>00598       <span class="keywordflow">break</span>;
520<a name="l00599"></a>00599     }
521<a name="l00600"></a>00600   }
522<a name="l00601"></a>00601
523<a name="l00602"></a>00602   larger_than_eps = (<a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(v) &gt; <a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(eps));
524<a name="l00603"></a>00603
525<a name="l00604"></a>00604   <span class="keywordflow">if</span> (found &amp;&amp; larger_than_eps)
526<a name="l00605"></a>00605     data[p] = v;
527<a name="l00606"></a>00606   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (larger_than_eps) {
528<a name="l00607"></a>00607     <span class="keywordflow">if</span> (used_size == data_size)
529<a name="l00608"></a>00608       <a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073" title="Set the maximum number of non-zero elements to new_size.">resize_data</a>(data_size*2 + 100);
530<a name="l00609"></a>00609     data[used_size] = v;
531<a name="l00610"></a>00610     index[used_size] = i;
532<a name="l00611"></a>00611     used_size++;
533<a name="l00612"></a>00612   }
534<a name="l00613"></a>00613
535<a name="l00614"></a>00614   <span class="comment">//Check if the stored element is smaller than eps. In that case it should be removed.</span>
536<a name="l00615"></a>00615   <span class="keywordflow">if</span> (<a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(v) &lt;= <a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(eps)) {
537<a name="l00616"></a>00616     <a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">remove_small_elements</a>();
538<a name="l00617"></a>00617   }
539<a name="l00618"></a>00618
540<a name="l00619"></a>00619 }
541<a name="l00620"></a>00620
542<a name="l00621"></a>00621 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
543<a name="l00622"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#55adfb73da94ec8e567270d344d17555">00622</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#55adfb73da94ec8e567270d344d17555" title="Set a new element with index i equal to v.">Sparse_Vec&lt;T&gt;::set_new</a>(<span class="keywordtype">int</span> i, T v)
544<a name="l00623"></a>00623 {
545<a name="l00624"></a>00624   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v_size &gt; i, <span class="stringliteral">"The index of the element exceeds the size of the sparse vector"</span>);
546<a name="l00625"></a>00625
547<a name="l00626"></a>00626   <span class="comment">//Check that the new element is larger than eps!</span>
548<a name="l00627"></a>00627   <span class="keywordflow">if</span> (<a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(v) &gt; <a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(eps)) {
549<a name="l00628"></a>00628     <span class="keywordflow">if</span> (used_size == data_size)
550<a name="l00629"></a>00629       <a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073" title="Set the maximum number of non-zero elements to new_size.">resize_data</a>(data_size*2 + 100);
551<a name="l00630"></a>00630     data[used_size] = v;
552<a name="l00631"></a>00631     index[used_size] = i;
553<a name="l00632"></a>00632     used_size++;
554<a name="l00633"></a>00633   }
555<a name="l00634"></a>00634 }
556<a name="l00635"></a>00635
557<a name="l00636"></a>00636 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
558<a name="l00637"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#63b4e493346887db93f25b40f7352b91">00637</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#63b4e493346887db93f25b40f7352b91" title="Add element i with v.">Sparse_Vec&lt;T&gt;::add_elem</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i, <span class="keyword">const</span> T v)
559<a name="l00638"></a>00638 {
560<a name="l00639"></a>00639   <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;
561<a name="l00640"></a>00640   <span class="keywordtype">int</span> p;
562<a name="l00641"></a>00641
563<a name="l00642"></a>00642   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v_size &gt; i, <span class="stringliteral">"The index of the element exceeds the size of the sparse vector"</span>);
564<a name="l00643"></a>00643
565<a name="l00644"></a>00644   <span class="keywordflow">for</span> (p = 0; p &lt; used_size; p++) {
566<a name="l00645"></a>00645     <span class="keywordflow">if</span> (index[p] == i) {
567<a name="l00646"></a>00646       found = <span class="keyword">true</span>;
568<a name="l00647"></a>00647       <span class="keywordflow">break</span>;
569<a name="l00648"></a>00648     }
570<a name="l00649"></a>00649   }
571<a name="l00650"></a>00650   <span class="keywordflow">if</span> (found)
572<a name="l00651"></a>00651     data[p] += v;
573<a name="l00652"></a>00652   <span class="keywordflow">else</span> {
574<a name="l00653"></a>00653     <span class="keywordflow">if</span> (used_size == data_size)
575<a name="l00654"></a>00654       <a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073" title="Set the maximum number of non-zero elements to new_size.">resize_data</a>(data_size*2 + 100);
576<a name="l00655"></a>00655     data[used_size] = v;
577<a name="l00656"></a>00656     index[used_size] = i;
578<a name="l00657"></a>00657     used_size++;
579<a name="l00658"></a>00658   }
580<a name="l00659"></a>00659
581<a name="l00660"></a>00660   check_small_elems_flag = <span class="keyword">true</span>;
582<a name="l00661"></a>00661
583<a name="l00662"></a>00662 }
584<a name="l00663"></a>00663
585<a name="l00664"></a>00664 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
586<a name="l00665"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#9f3ef93cf84c3fc402e9303ff9fced8e">00665</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#9f3ef93cf84c3fc402e9303ff9fced8e" title="Add v to the elements specified by index_vec with v.">Sparse_Vec&lt;T&gt;::add</a>(<span class="keyword">const</span> ivec&amp; index_vec, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a>&amp; v)
587<a name="l00666"></a>00666 {
588<a name="l00667"></a>00667   <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;
589<a name="l00668"></a>00668   <span class="keywordtype">int</span> i, p, q;
590<a name="l00669"></a>00669   <span class="keywordtype">int</span> nrof_nz = v.<a class="code" href="classitpp_1_1Vec.html#a906c893cd6184a774e4da8a47217d6a" title="The size of the vector.">size</a>();
591<a name="l00670"></a>00670
592<a name="l00671"></a>00671   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v_size &gt; <a class="code" href="group__protocol.html#g3e4e78a5230c444344a135c661163ef2" title="ADD DOCUMENTATION HERE.">max</a>(index_vec), <span class="stringliteral">"The indices exceeds the size of the sparse vector"</span>);
593<a name="l00672"></a>00672
594<a name="l00673"></a>00673   <span class="comment">//Elements are added if they have identical indices</span>
595<a name="l00674"></a>00674   <span class="keywordflow">for</span> (q = 0; q &lt; nrof_nz; q++) {
596<a name="l00675"></a>00675     i = index_vec(q);
597<a name="l00676"></a>00676     <span class="keywordflow">for</span> (p = 0; p &lt; used_size; p++) {
598<a name="l00677"></a>00677       <span class="keywordflow">if</span> (index[p] == i) {
599<a name="l00678"></a>00678         found = <span class="keyword">true</span>;
600<a name="l00679"></a>00679         <span class="keywordflow">break</span>;
601<a name="l00680"></a>00680       }
602<a name="l00681"></a>00681     }
603<a name="l00682"></a>00682     <span class="keywordflow">if</span> (found)
604<a name="l00683"></a>00683       data[p] += v(q);
605<a name="l00684"></a>00684     <span class="keywordflow">else</span> {
606<a name="l00685"></a>00685       <span class="keywordflow">if</span> (used_size == data_size)
607<a name="l00686"></a>00686         <a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073" title="Set the maximum number of non-zero elements to new_size.">resize_data</a>(data_size*2 + 100);
608<a name="l00687"></a>00687       data[used_size] = v(q);
609<a name="l00688"></a>00688       index[used_size] = i;
610<a name="l00689"></a>00689       used_size++;
611<a name="l00690"></a>00690     }
612<a name="l00691"></a>00691     found = <span class="keyword">false</span>;
613<a name="l00692"></a>00692   }
614<a name="l00693"></a>00693
615<a name="l00694"></a>00694   check_small_elems_flag = <span class="keyword">true</span>;
616<a name="l00695"></a>00695
617<a name="l00696"></a>00696 }
618<a name="l00697"></a>00697
619<a name="l00698"></a>00698 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
620<a name="l00699"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#259ac11b4eec8a9b76d14777edcdf941">00699</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#259ac11b4eec8a9b76d14777edcdf941" title="Set the sparse vector to the all zero vector (removes all non-zero elements).">Sparse_Vec&lt;T&gt;::zeros</a>()
621<a name="l00700"></a>00700 {
622<a name="l00701"></a>00701   used_size = 0;
623<a name="l00702"></a>00702   check_small_elems_flag = <span class="keyword">false</span>;
624<a name="l00703"></a>00703 }
625<a name="l00704"></a>00704
626<a name="l00705"></a>00705 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
627<a name="l00706"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#7f28c432a7166b661834b6ddfa0aefc4">00706</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#7f28c432a7166b661834b6ddfa0aefc4" title="Set the i-th element to zero (i.e. clear that element if it contains a non-zero value)...">Sparse_Vec&lt;T&gt;::zero_elem</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i)
628<a name="l00707"></a>00707 {
629<a name="l00708"></a>00708   <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;
630<a name="l00709"></a>00709   <span class="keywordtype">int</span> p;
631<a name="l00710"></a>00710
632<a name="l00711"></a>00711   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v_size &gt; i, <span class="stringliteral">"The index of the element exceeds the size of the sparse vector"</span>);
633<a name="l00712"></a>00712
634<a name="l00713"></a>00713   <span class="keywordflow">for</span> (p = 0; p &lt; used_size; p++) {
635<a name="l00714"></a>00714     <span class="keywordflow">if</span> (index[p] == i) {
636<a name="l00715"></a>00715       found = <span class="keyword">true</span>;
637<a name="l00716"></a>00716       <span class="keywordflow">break</span>;
638<a name="l00717"></a>00717     }
639<a name="l00718"></a>00718   }
640<a name="l00719"></a>00719   <span class="keywordflow">if</span> (found) {
641<a name="l00720"></a>00720     data[p] = data[used_size-1];
642<a name="l00721"></a>00721     index[p] = index[used_size-1];
643<a name="l00722"></a>00722     used_size--;
644<a name="l00723"></a>00723   }
645<a name="l00724"></a>00724 }
646<a name="l00725"></a>00725
647<a name="l00726"></a>00726 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
648<a name="l00727"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#e48f0bf68cfa0d2c8700952585e0c8eb">00727</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#e48f0bf68cfa0d2c8700952585e0c8eb" title="Clear all non-zero elements of the sparse vector.">Sparse_Vec&lt;T&gt;::clear</a>()
649<a name="l00728"></a>00728 {
650<a name="l00729"></a>00729   used_size = 0;
651<a name="l00730"></a>00730   check_small_elems_flag = <span class="keyword">false</span>;
652<a name="l00731"></a>00731 }
653<a name="l00732"></a>00732
654<a name="l00733"></a>00733 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
655<a name="l00734"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#7e9f5693f6b709ddf7367b7e4b846f07">00734</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#7e9f5693f6b709ddf7367b7e4b846f07" title="Clear the i-th element (if it contains a non-zero value).">Sparse_Vec&lt;T&gt;::clear_elem</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> i)
656<a name="l00735"></a>00735 {
657<a name="l00736"></a>00736   <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;
658<a name="l00737"></a>00737   <span class="keywordtype">int</span> p;
659<a name="l00738"></a>00738
660<a name="l00739"></a>00739   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v_size &gt; i, <span class="stringliteral">"The index of the element exceeds the size of the sparse vector"</span>);
661<a name="l00740"></a>00740
662<a name="l00741"></a>00741   <span class="keywordflow">for</span> (p = 0; p &lt; used_size; p++) {
663<a name="l00742"></a>00742     <span class="keywordflow">if</span> (index[p] == i) {
664<a name="l00743"></a>00743       found = <span class="keyword">true</span>;
665<a name="l00744"></a>00744       <span class="keywordflow">break</span>;
666<a name="l00745"></a>00745     }
667<a name="l00746"></a>00746   }
668<a name="l00747"></a>00747   <span class="keywordflow">if</span> (found) {
669<a name="l00748"></a>00748     data[p] = data[used_size-1];
670<a name="l00749"></a>00749     index[p] = index[used_size-1];
671<a name="l00750"></a>00750     used_size--;
672<a name="l00751"></a>00751   }
673<a name="l00752"></a>00752 }
674<a name="l00753"></a>00753
675<a name="l00754"></a>00754 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
676<a name="l00755"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#ee53f9ab6cbc6ee2553c62b6ed66e196">00755</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#080a7186e61140cdc739201bfcb60934" title="Set element i equal to v.">Sparse_Vec&lt;T&gt;::set</a>(<span class="keyword">const</span> ivec&amp; index_vec, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a>&amp; v)
677<a name="l00756"></a>00756 {
678<a name="l00757"></a>00757   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v_size &gt; <a class="code" href="group__protocol.html#g3e4e78a5230c444344a135c661163ef2" title="ADD DOCUMENTATION HERE.">max</a>(index_vec), <span class="stringliteral">"The indices exceeds the size of the sparse vector"</span>);
679<a name="l00758"></a>00758
680<a name="l00759"></a>00759   <span class="comment">//Clear all old non-zero elements</span>
681<a name="l00760"></a>00760   <a class="code" href="classitpp_1_1Sparse__Vec.html#e48f0bf68cfa0d2c8700952585e0c8eb" title="Clear all non-zero elements of the sparse vector.">clear</a>();
682<a name="l00761"></a>00761
683<a name="l00762"></a>00762   <span class="comment">//Add the new non-zero elements</span>
684<a name="l00763"></a>00763   <span class="keyword">add</span>(index_vec, v);
685<a name="l00764"></a>00764 }
686<a name="l00765"></a>00765
687<a name="l00766"></a>00766 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
688<a name="l00767"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#bd8056f722ef6c262a11201d15e9e008">00767</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#55adfb73da94ec8e567270d344d17555" title="Set a new element with index i equal to v.">Sparse_Vec&lt;T&gt;::set_new</a>(<span class="keyword">const</span> ivec&amp; index_vec, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a>&amp; v)
689<a name="l00768"></a>00768 {
690<a name="l00769"></a>00769   <span class="keywordtype">int</span> q;
691<a name="l00770"></a>00770   <span class="keywordtype">int</span> nrof_nz = v.<a class="code" href="classitpp_1_1Vec.html#a906c893cd6184a774e4da8a47217d6a" title="The size of the vector.">size</a>();
692<a name="l00771"></a>00771
693<a name="l00772"></a>00772   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v_size &gt; <a class="code" href="group__protocol.html#g3e4e78a5230c444344a135c661163ef2" title="ADD DOCUMENTATION HERE.">max</a>(index_vec), <span class="stringliteral">"The indices exceeds the size of the sparse vector"</span>);
694<a name="l00773"></a>00773
695<a name="l00774"></a>00774   <span class="comment">//Clear all old non-zero elements</span>
696<a name="l00775"></a>00775   <a class="code" href="classitpp_1_1Sparse__Vec.html#e48f0bf68cfa0d2c8700952585e0c8eb" title="Clear all non-zero elements of the sparse vector.">clear</a>();
697<a name="l00776"></a>00776
698<a name="l00777"></a>00777   <span class="keywordflow">for</span> (q = 0; q &lt; nrof_nz; q++) {
699<a name="l00778"></a>00778     <span class="keywordflow">if</span> (<a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(v[q]) &gt; <a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(eps)) {
700<a name="l00779"></a>00779       <span class="keywordflow">if</span> (used_size == data_size)
701<a name="l00780"></a>00780         <a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073" title="Set the maximum number of non-zero elements to new_size.">resize_data</a>(data_size*2 + 100);
702<a name="l00781"></a>00781       data[used_size] = v(q);
703<a name="l00782"></a>00782       index[used_size] = index_vec(q);
704<a name="l00783"></a>00783       used_size++;
705<a name="l00784"></a>00784     }
706<a name="l00785"></a>00785   }
707<a name="l00786"></a>00786 }
708<a name="l00787"></a>00787
709<a name="l00788"></a>00788 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
710<a name="l00789"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#52046b9bcd75e1fda1d745e9dbc4f8e7">00789</a> ivec <a class="code" href="classitpp_1_1Sparse__Vec.html#52046b9bcd75e1fda1d745e9dbc4f8e7" title="Return the indices of non-zero values.">Sparse_Vec&lt;T&gt;::get_nz_indices</a>()
711<a name="l00790"></a>00790 {
712<a name="l00791"></a>00791   <span class="keywordtype">int</span> n = <a class="code" href="classitpp_1_1Sparse__Vec.html#574eb67974100fb492067c16216dbefc" title="Number of non-zero elements in the sparse vector.">nnz</a>();
713<a name="l00792"></a>00792   ivec r(n);
714<a name="l00793"></a>00793   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; n; i++) {
715<a name="l00794"></a>00794     r(i) = <a class="code" href="classitpp_1_1Sparse__Vec.html#a86f06c01f042925d6b8005b26bd6b0b" title="Returns the vector index of the p-th non-zero element.">get_nz_index</a>(i);
716<a name="l00795"></a>00795   }
717<a name="l00796"></a>00796   <span class="keywordflow">return</span> r;
718<a name="l00797"></a>00797 }
719<a name="l00798"></a>00798
720<a name="l00799"></a>00799 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
721<a name="l00800"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#4d5f4ce3ee456b4623b995df6bbe19b5">00800</a> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> <a class="code" href="classitpp_1_1Sparse__Vec.html#4d5f4ce3ee456b4623b995df6bbe19b5" title="Return sparse subvector from index i1 to index i2.">Sparse_Vec&lt;T&gt;::get_subvector</a>(<span class="keywordtype">int</span> i1, <span class="keywordtype">int</span> i2)<span class="keyword"> const</span>
722<a name="l00801"></a>00801 <span class="keyword"></span>{
723<a name="l00802"></a>00802   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v_size &gt; i1 &amp;&amp; v_size &gt; i2 &amp;&amp; i1 &lt;= i2 &amp;&amp; i1 &gt;= 0, <span class="stringliteral">"The index of the element exceeds the size of the sparse vector"</span>);
724<a name="l00803"></a>00803
725<a name="l00804"></a>00804   <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> r(i2 - i1 + 1);
726<a name="l00805"></a>00805
727<a name="l00806"></a>00806   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p = 0; p &lt; used_size; p++) {
728<a name="l00807"></a>00807     <span class="keywordflow">if</span> (index[p] &gt;= i1 &amp;&amp; index[p] &lt;= i2) {
729<a name="l00808"></a>00808       <span class="keywordflow">if</span> (r.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a> == r.<a class="code" href="classitpp_1_1Sparse__Vec.html#e42b4bbb568b40f0fc892fe50fefb39b">data_size</a>)
730<a name="l00809"></a>00809         r.<a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073" title="Set the maximum number of non-zero elements to new_size.">resize_data</a>(r.<a class="code" href="classitpp_1_1Sparse__Vec.html#e42b4bbb568b40f0fc892fe50fefb39b">data_size</a>*2 + 100);
731<a name="l00810"></a>00810       r.<a class="code" href="classitpp_1_1Sparse__Vec.html#31ce2b788940d0c05edc2328af3433f1">data</a>[r.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a>] = data[p];
732<a name="l00811"></a>00811       r.<a class="code" href="classitpp_1_1Sparse__Vec.html#2211187e13cf6bc1e824e606e5bcd28e">index</a>[r.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a>] = index[p] - i1;
733<a name="l00812"></a>00812       r.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a>++;
734<a name="l00813"></a>00813     }
735<a name="l00814"></a>00814   }
736<a name="l00815"></a>00815   r.<a class="code" href="classitpp_1_1Sparse__Vec.html#a04529ad0bd986d655c9a3a60a8f75cc">eps</a> = eps;
737<a name="l00816"></a>00816   r.<a class="code" href="classitpp_1_1Sparse__Vec.html#555c9755a92011a2fdcfb66a6dfe3186">check_small_elems_flag</a> = check_small_elems_flag;
738<a name="l00817"></a>00817   r.<a class="code" href="classitpp_1_1Sparse__Vec.html#eecd9a99a1aef11b939ef9a5a329ee6e" title="Set the maximum number of non-zero elements equal to the actual number of non-zero...">compact</a>();
739<a name="l00818"></a>00818
740<a name="l00819"></a>00819   <span class="keywordflow">return</span> r;
741<a name="l00820"></a>00820 }
742<a name="l00821"></a>00821
743<a name="l00822"></a>00822 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
744<a name="l00823"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#e3dbd58f2a416f2cf9b515e8e91fc95b">00823</a> T <a class="code" href="classitpp_1_1Sparse__Vec.html#e3dbd58f2a416f2cf9b515e8e91fc95b" title="Returns the sum of all values squared.">Sparse_Vec&lt;T&gt;::sqr</a>()<span class="keyword"> const</span>
745<a name="l00824"></a>00824 <span class="keyword"></span>{
746<a name="l00825"></a>00825   T <a class="code" href="group__matrix__functions.html#gfcf8f54c2f4fc257bbc3111700b08355" title="Sum of elements in the matrix m, either along columns or rows.">sum</a>(0);
747<a name="l00826"></a>00826   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p = 0; p &lt; used_size; p++)
748<a name="l00827"></a>00827     sum += data[p] * data[p];
749<a name="l00828"></a>00828
750<a name="l00829"></a>00829   <span class="keywordflow">return</span> sum;
751<a name="l00830"></a>00830 }
752<a name="l00831"></a>00831
753<a name="l00832"></a>00832 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
754<a name="l00833"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#c4ef932d3ed56cba68c8b0ecb7ba278b">00833</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#c4ef932d3ed56cba68c8b0ecb7ba278b" title="Assign sparse vector the value and length of the sparse vector v.">Sparse_Vec&lt;T&gt;::operator=</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v)
755<a name="l00834"></a>00834 {
756<a name="l00835"></a>00835   free();
757<a name="l00836"></a>00836   v_size = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#56544763039cddac697f85e0c93b0cae">v_size</a>;
758<a name="l00837"></a>00837   used_size = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a>;
759<a name="l00838"></a>00838   data_size = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#e42b4bbb568b40f0fc892fe50fefb39b">data_size</a>;
760<a name="l00839"></a>00839   eps = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#a04529ad0bd986d655c9a3a60a8f75cc">eps</a>;
761<a name="l00840"></a>00840   check_small_elems_flag = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#555c9755a92011a2fdcfb66a6dfe3186">check_small_elems_flag</a>;
762<a name="l00841"></a>00841   alloc();
763<a name="l00842"></a>00842
764<a name="l00843"></a>00843   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; used_size; i++) {
765<a name="l00844"></a>00844     data[i] = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#31ce2b788940d0c05edc2328af3433f1">data</a>[i];
766<a name="l00845"></a>00845     index[i] = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#2211187e13cf6bc1e824e606e5bcd28e">index</a>[i];
767<a name="l00846"></a>00846   }
768<a name="l00847"></a>00847 }
769<a name="l00848"></a>00848
770<a name="l00849"></a>00849 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
771<a name="l00850"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#f434c0f6790150b767bf8d6275318360">00850</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#c4ef932d3ed56cba68c8b0ecb7ba278b" title="Assign sparse vector the value and length of the sparse vector v.">Sparse_Vec&lt;T&gt;::operator=</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v)
772<a name="l00851"></a>00851 {
773<a name="l00852"></a>00852   free();
774<a name="l00853"></a>00853   v_size = v.<a class="code" href="classitpp_1_1Vec.html#a906c893cd6184a774e4da8a47217d6a" title="The size of the vector.">size</a>();
775<a name="l00854"></a>00854   used_size = 0;
776<a name="l00855"></a>00855   data_size = <a class="code" href="group__protocol.html#g27dde5be5aac902c0de838b4b872cd2f" title="ADD DOCUMENTATION HERE.">std::min</a>(v.<a class="code" href="classitpp_1_1Vec.html#a906c893cd6184a774e4da8a47217d6a" title="The size of the vector.">size</a>(), 10000);
777<a name="l00856"></a>00856   eps = T(0);
778<a name="l00857"></a>00857   check_small_elems_flag = <span class="keyword">false</span>;
779<a name="l00858"></a>00858   alloc();
780<a name="l00859"></a>00859
781<a name="l00860"></a>00860   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; v_size; i++) {
782<a name="l00861"></a>00861     <span class="keywordflow">if</span> (v(i) != T(0)) {
783<a name="l00862"></a>00862       <span class="keywordflow">if</span> (used_size == data_size)
784<a name="l00863"></a>00863         <a class="code" href="classitpp_1_1Sparse__Vec.html#e13e88712aafec410acce936dc708073" title="Set the maximum number of non-zero elements to new_size.">resize_data</a>(data_size*2);
785<a name="l00864"></a>00864       data[used_size] = v(i);
786<a name="l00865"></a>00865       index[used_size] = i;
787<a name="l00866"></a>00866       used_size++;
788<a name="l00867"></a>00867     }
789<a name="l00868"></a>00868   }
790<a name="l00869"></a>00869   <a class="code" href="classitpp_1_1Sparse__Vec.html#eecd9a99a1aef11b939ef9a5a329ee6e" title="Set the maximum number of non-zero elements equal to the actual number of non-zero...">compact</a>();
791<a name="l00870"></a>00870 }
792<a name="l00871"></a>00871
793<a name="l00872"></a>00872 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
794<a name="l00873"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#db64167ef8f7b46cc6a8b3f2d72a549f">00873</a> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> <a class="code" href="classitpp_1_1Sparse__Vec.html#db64167ef8f7b46cc6a8b3f2d72a549f" title="Returns the sign inverse of all elements in the sparse vector.">Sparse_Vec&lt;T&gt;::operator-</a>()<span class="keyword"> const</span>
795<a name="l00874"></a>00874 <span class="keyword"></span>{
796<a name="l00875"></a>00875   <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec</a> r(v_size, used_size);
797<a name="l00876"></a>00876
798<a name="l00877"></a>00877   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p = 0; p &lt; used_size; p++) {
799<a name="l00878"></a>00878     r.<a class="code" href="classitpp_1_1Sparse__Vec.html#31ce2b788940d0c05edc2328af3433f1">data</a>[p] = -data[p];
800<a name="l00879"></a>00879     r.<a class="code" href="classitpp_1_1Sparse__Vec.html#2211187e13cf6bc1e824e606e5bcd28e">index</a>[p] = index[p];
801<a name="l00880"></a>00880   }
802<a name="l00881"></a>00881   r.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a> = used_size;
803<a name="l00882"></a>00882
804<a name="l00883"></a>00883   <span class="keywordflow">return</span> r;
805<a name="l00884"></a>00884 }
806<a name="l00885"></a>00885
807<a name="l00886"></a>00886 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
808<a name="l00887"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#4a2d2a7bea045243c796d91cfb390a13">00887</a> <span class="keywordtype">bool</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#4a2d2a7bea045243c796d91cfb390a13" title="Compare two sparse vectors. False if wrong sizes or different values.">Sparse_Vec&lt;T&gt;::operator==</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v)
809<a name="l00888"></a>00888 {
810<a name="l00889"></a>00889   <span class="keywordtype">int</span> p, q;
811<a name="l00890"></a>00890   <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;
812<a name="l00891"></a>00891
813<a name="l00892"></a>00892   <span class="comment">//Remove small elements before comparing the two sparse_vectors</span>
814<a name="l00893"></a>00893   <span class="keywordflow">if</span> (check_small_elems_flag)
815<a name="l00894"></a>00894     <a class="code" href="classitpp_1_1Sparse__Vec.html#f4a70276d329e74da185b4b331fbcfa6">remove_small_elements</a>();
816<a name="l00895"></a>00895
817<a name="l00896"></a>00896   <span class="keywordflow">if</span> (v_size != v.<a class="code" href="classitpp_1_1Sparse__Vec.html#56544763039cddac697f85e0c93b0cae">v_size</a>) {
818<a name="l00897"></a>00897     <span class="comment">//Return false if vector sizes are unequal</span>
819<a name="l00898"></a>00898     <span class="keywordflow">return</span> <span class="keyword">false</span>;
820<a name="l00899"></a>00899   }
821<a name="l00900"></a>00900   <span class="keywordflow">else</span> {
822<a name="l00901"></a>00901     <span class="keywordflow">for</span> (p = 0;p &lt; used_size;p++) {
823<a name="l00902"></a>00902       <span class="keywordflow">for</span> (q = 0;q &lt; v.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a>;q++) {
824<a name="l00903"></a>00903         <span class="keywordflow">if</span> (index[p] == v.<a class="code" href="classitpp_1_1Sparse__Vec.html#2211187e13cf6bc1e824e606e5bcd28e">index</a>[q]) {
825<a name="l00904"></a>00904           found = <span class="keyword">true</span>;
826<a name="l00905"></a>00905           <span class="keywordflow">break</span>;
827<a name="l00906"></a>00906         }
828<a name="l00907"></a>00907       }
829<a name="l00908"></a>00908       <span class="keywordflow">if</span> (found == <span class="keyword">false</span>)
830<a name="l00909"></a>00909         <span class="comment">//Return false if non-zero element not found, or if elements are unequal</span>
831<a name="l00910"></a>00910         <span class="keywordflow">return</span> <span class="keyword">false</span>;
832<a name="l00911"></a>00911       <span class="keywordflow">else</span> <span class="keywordflow">if</span> (data[p] != v.<a class="code" href="classitpp_1_1Sparse__Vec.html#31ce2b788940d0c05edc2328af3433f1">data</a>[q])
833<a name="l00912"></a>00912         <span class="comment">//Return false if non-zero element not found, or if elements are unequal</span>
834<a name="l00913"></a>00913         <span class="keywordflow">return</span> <span class="keyword">false</span>;
835<a name="l00914"></a>00914       <span class="keywordflow">else</span>
836<a name="l00915"></a>00915         <span class="comment">//Check next non-zero element</span>
837<a name="l00916"></a>00916         found = <span class="keyword">false</span>;
838<a name="l00917"></a>00917     }
839<a name="l00918"></a>00918   }
840<a name="l00919"></a>00919
841<a name="l00920"></a>00920   <span class="comment">/*Special handling if sizes do not match.</span>
842<a name="l00921"></a>00921 <span class="comment">  Required since v may need to do remove_small_elements() for true comparison*/</span>
843<a name="l00922"></a>00922   <span class="keywordflow">if</span> (used_size != v.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a>) {
844<a name="l00923"></a>00923     <span class="keywordflow">if</span> (used_size &gt; v.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a>) {
845<a name="l00924"></a>00924       <span class="comment">//Return false if number of non-zero elements is less in v</span>
846<a name="l00925"></a>00925       <span class="keywordflow">return</span> <span class="keyword">false</span>;
847<a name="l00926"></a>00926     }
848<a name="l00927"></a>00927     <span class="keywordflow">else</span> {
849<a name="l00928"></a>00928       <span class="comment">//Ensure that the remaining non-zero elements in v are smaller than v.eps</span>
850<a name="l00929"></a>00929       <span class="keywordtype">int</span> nrof_small_elems = 0;
851<a name="l00930"></a>00930       <span class="keywordflow">for</span> (q = 0;q &lt; v.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a>;q++) {
852<a name="l00931"></a>00931         <span class="keywordflow">if</span> (<a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(v.<a class="code" href="classitpp_1_1Sparse__Vec.html#31ce2b788940d0c05edc2328af3433f1">data</a>[q]) &lt;= <a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(v.<a class="code" href="classitpp_1_1Sparse__Vec.html#a04529ad0bd986d655c9a3a60a8f75cc">eps</a>))
853<a name="l00932"></a>00932           nrof_small_elems++;
854<a name="l00933"></a>00933       }
855<a name="l00934"></a>00934       <span class="keywordflow">if</span> (v.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a> - nrof_small_elems != used_size)
856<a name="l00935"></a>00935         <span class="comment">//Return false if the number of "true" non-zero elements are unequal</span>
857<a name="l00936"></a>00936         <span class="keywordflow">return</span> <span class="keyword">false</span>;
858<a name="l00937"></a>00937     }
859<a name="l00938"></a>00938   }
860<a name="l00939"></a>00939
861<a name="l00940"></a>00940   <span class="comment">//All elements checks =&gt; return true</span>
862<a name="l00941"></a>00941   <span class="keywordflow">return</span> <span class="keyword">true</span>;
863<a name="l00942"></a>00942 }
864<a name="l00943"></a>00943
865<a name="l00944"></a>00944 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
866<a name="l00945"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#f801cdfc077c286c2fb4079239ac11d1">00945</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#f801cdfc077c286c2fb4079239ac11d1" title="Add sparse vector v to all non-zero elements of the sparse vector.">Sparse_Vec&lt;T&gt;::operator+=</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v)
867<a name="l00946"></a>00946 {
868<a name="l00947"></a>00947   <span class="keywordtype">int</span> i, p;
869<a name="l00948"></a>00948   T tmp_data;
870<a name="l00949"></a>00949   <span class="keywordtype">int</span> nrof_nz_v = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a>;
871<a name="l00950"></a>00950
872<a name="l00951"></a>00951   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v_size == v.<a class="code" href="classitpp_1_1Sparse__Vec.html#86a41d34d1d5a1dbfe778b6fe21bf98e" title="Returns the size of the sparse vector.">size</a>(), <span class="stringliteral">"Attempted addition of unequal sized sparse vectors"</span>);
873<a name="l00952"></a>00952
874<a name="l00953"></a>00953   <span class="keywordflow">for</span> (p = 0; p &lt; nrof_nz_v; p++) {
875<a name="l00954"></a>00954     i = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#2211187e13cf6bc1e824e606e5bcd28e">index</a>[p];
876<a name="l00955"></a>00955     tmp_data = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#31ce2b788940d0c05edc2328af3433f1">data</a>[p];
877<a name="l00956"></a>00956     <span class="comment">//get_nz(p,i,tmp_data);</span>
878<a name="l00957"></a>00957     <a class="code" href="classitpp_1_1Sparse__Vec.html#63b4e493346887db93f25b40f7352b91" title="Add element i with v.">add_elem</a>(i, tmp_data);
879<a name="l00958"></a>00958   }
880<a name="l00959"></a>00959
881<a name="l00960"></a>00960   check_small_elems_flag = <span class="keyword">true</span>;
882<a name="l00961"></a>00961 }
883<a name="l00962"></a>00962
884<a name="l00963"></a>00963 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
885<a name="l00964"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#ae52eecb5781b416b48d213a9316b399">00964</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#f801cdfc077c286c2fb4079239ac11d1" title="Add sparse vector v to all non-zero elements of the sparse vector.">Sparse_Vec&lt;T&gt;::operator+=</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v)
886<a name="l00965"></a>00965 {
887<a name="l00966"></a>00966   <span class="keywordtype">int</span> i;
888<a name="l00967"></a>00967
889<a name="l00968"></a>00968   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v_size == v.<a class="code" href="classitpp_1_1Vec.html#a906c893cd6184a774e4da8a47217d6a" title="The size of the vector.">size</a>(), <span class="stringliteral">"Attempted addition of unequal sized sparse vectors"</span>);
890<a name="l00969"></a>00969
891<a name="l00970"></a>00970   <span class="keywordflow">for</span> (i = 0; i &lt; v.<a class="code" href="classitpp_1_1Vec.html#a906c893cd6184a774e4da8a47217d6a" title="The size of the vector.">size</a>(); i++)
892<a name="l00971"></a>00971     <span class="keywordflow">if</span> (v(i) != T(0))
893<a name="l00972"></a>00972       <a class="code" href="classitpp_1_1Sparse__Vec.html#63b4e493346887db93f25b40f7352b91" title="Add element i with v.">add_elem</a>(i, v(i));
894<a name="l00973"></a>00973
895<a name="l00974"></a>00974   check_small_elems_flag = <span class="keyword">true</span>;
896<a name="l00975"></a>00975 }
897<a name="l00976"></a>00976
898<a name="l00977"></a>00977
899<a name="l00978"></a>00978 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
900<a name="l00979"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#6e6425041822cfa30871bae71ede7df4">00979</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#6e6425041822cfa30871bae71ede7df4" title="Subtract sparse vector v from all non-zero elements of the sparse vector.">Sparse_Vec&lt;T&gt;::operator-=</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v)
901<a name="l00980"></a>00980 {
902<a name="l00981"></a>00981   <span class="keywordtype">int</span> i, p;
903<a name="l00982"></a>00982   T tmp_data;
904<a name="l00983"></a>00983   <span class="keywordtype">int</span> nrof_nz_v = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a>;
905<a name="l00984"></a>00984
906<a name="l00985"></a>00985   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v_size == v.<a class="code" href="classitpp_1_1Sparse__Vec.html#86a41d34d1d5a1dbfe778b6fe21bf98e" title="Returns the size of the sparse vector.">size</a>(), <span class="stringliteral">"Attempted subtraction of unequal sized sparse vectors"</span>);
907<a name="l00986"></a>00986
908<a name="l00987"></a>00987   <span class="keywordflow">for</span> (p = 0; p &lt; nrof_nz_v; p++) {
909<a name="l00988"></a>00988     i = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#2211187e13cf6bc1e824e606e5bcd28e">index</a>[p];
910<a name="l00989"></a>00989     tmp_data = v.<a class="code" href="classitpp_1_1Sparse__Vec.html#31ce2b788940d0c05edc2328af3433f1">data</a>[p];
911<a name="l00990"></a>00990     <span class="comment">//v.get_nz(p,i,tmp_data);</span>
912<a name="l00991"></a>00991     <a class="code" href="classitpp_1_1Sparse__Vec.html#63b4e493346887db93f25b40f7352b91" title="Add element i with v.">add_elem</a>(i, -tmp_data);
913<a name="l00992"></a>00992   }
914<a name="l00993"></a>00993
915<a name="l00994"></a>00994   check_small_elems_flag = <span class="keyword">true</span>;
916<a name="l00995"></a>00995 }
917<a name="l00996"></a>00996
918<a name="l00997"></a>00997 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
919<a name="l00998"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#1144cbcd69b62d3934e8142ad8df7471">00998</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#6e6425041822cfa30871bae71ede7df4" title="Subtract sparse vector v from all non-zero elements of the sparse vector.">Sparse_Vec&lt;T&gt;::operator-=</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> &amp;v)
920<a name="l00999"></a>00999 {
921<a name="l01000"></a>01000   <span class="keywordtype">int</span> i;
922<a name="l01001"></a>01001
923<a name="l01002"></a>01002   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v_size == v.<a class="code" href="classitpp_1_1Vec.html#a906c893cd6184a774e4da8a47217d6a" title="The size of the vector.">size</a>(), <span class="stringliteral">"Attempted subtraction of unequal sized sparse vectors"</span>);
924<a name="l01003"></a>01003
925<a name="l01004"></a>01004   <span class="keywordflow">for</span> (i = 0; i &lt; v.<a class="code" href="classitpp_1_1Vec.html#a906c893cd6184a774e4da8a47217d6a" title="The size of the vector.">size</a>(); i++)
926<a name="l01005"></a>01005     <span class="keywordflow">if</span> (v(i) != T(0))
927<a name="l01006"></a>01006       <a class="code" href="classitpp_1_1Sparse__Vec.html#63b4e493346887db93f25b40f7352b91" title="Add element i with v.">add_elem</a>(i, -v(i));
928<a name="l01007"></a>01007
929<a name="l01008"></a>01008   check_small_elems_flag = <span class="keyword">true</span>;
930<a name="l01009"></a>01009 }
931<a name="l01010"></a>01010
932<a name="l01011"></a>01011 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
933<a name="l01012"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#70ed1fcb5802f4bd60009ed198c49c20">01012</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#70ed1fcb5802f4bd60009ed198c49c20" title="Multiply the scalar v to all non-zero elements of the sparse vector.">Sparse_Vec&lt;T&gt;::operator*=</a>(<span class="keyword">const</span> T &amp;v)
934<a name="l01013"></a>01013 {
935<a name="l01014"></a>01014   <span class="keywordtype">int</span> p;
936<a name="l01015"></a>01015
937<a name="l01016"></a>01016   <span class="keywordflow">for</span> (p = 0; p &lt; used_size; p++) {
938<a name="l01017"></a>01017     data[p] *= v;
939<a name="l01018"></a>01018   }
940<a name="l01019"></a>01019
941<a name="l01020"></a>01020   check_small_elems_flag = <span class="keyword">true</span>;
942<a name="l01021"></a>01021 }
943<a name="l01022"></a>01022
944<a name="l01023"></a>01023 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
945<a name="l01024"></a><a class="code" href="classitpp_1_1Sparse__Vec.html#16a5b698293b1e9ea3b79d4c5ce58934">01024</a> <span class="keywordtype">void</span> <a class="code" href="classitpp_1_1Sparse__Vec.html#16a5b698293b1e9ea3b79d4c5ce58934" title="Divide all non-zero elements of the sparse vector with the scalar v.">Sparse_Vec&lt;T&gt;::operator/=</a>(<span class="keyword">const</span> T &amp;v)
946<a name="l01025"></a>01025 {
947<a name="l01026"></a>01026   <span class="keywordtype">int</span> p;
948<a name="l01027"></a>01027   <span class="keywordflow">for</span> (p = 0; p &lt; used_size; p++) {
949<a name="l01028"></a>01028     data[p] /= v;
950<a name="l01029"></a>01029   }
951<a name="l01030"></a>01030
952<a name="l01031"></a>01031   <span class="keywordflow">if</span> (<a class="code" href="group__fixed.html#ge0a38d51b2bf99a0ba07f2f8885e6adc" title="Absolute value.">std::abs</a>(eps) &gt; 0) {
953<a name="l01032"></a>01032     check_small_elems_flag = <span class="keyword">true</span>;
954<a name="l01033"></a>01033   }
955<a name="l01034"></a>01034 }
956<a name="l01035"></a>01035
957<a name="l01036"></a>01036 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
958<a name="l01037"></a>01037 T <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v1, <span class="keyword">const</span> <a class="code" href="classitpp_1_1Sparse__Vec.html" title="Templated sparse vector class.">Sparse_Vec&lt;T&gt;</a> &amp;v2)
959<a name="l01038"></a>01038 {
960<a name="l01039"></a>01039   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v1.<a class="code" href="classitpp_1_1Sparse__Vec.html#56544763039cddac697f85e0c93b0cae">v_size</a> == v2.<a class="code" href="classitpp_1_1Sparse__Vec.html#56544763039cddac697f85e0c93b0cae">v_size</a>, <span class="stringliteral">"Sparse_Vec&lt;T&gt; * Sparse_Vec&lt;T&gt;"</span>);
961<a name="l01040"></a>01040
962<a name="l01041"></a>01041   T <a class="code" href="group__matrix__functions.html#gfcf8f54c2f4fc257bbc3111700b08355" title="Sum of elements in the matrix m, either along columns or rows.">sum</a>(0);
963<a name="l01042"></a>01042   <a class="code" href="classitpp_1_1Vec.html">Vec&lt;T&gt;</a> v1f(v1.<a class="code" href="classitpp_1_1Sparse__Vec.html#56544763039cddac697f85e0c93b0cae">v_size</a>);
964<a name="l01043"></a>01043   v1.<a class="code" href="classitpp_1_1Sparse__Vec.html#abb60df924a9f3ad266c24c4da4787ed" title="Returns a full, dense vector in v.">full</a>(v1f);
965<a name="l01044"></a>01044   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p = 0; p &lt; v2.<a class="code" href="classitpp_1_1Sparse__Vec.html#21a89f727ef596d34a7c542d51533ca1">used_size</a>; p++) {
966<a name="l01045"></a>01045     <span class="keywordflow">if</span> (v1f[v2.<a class="code" href="classitpp_1_1Sparse__Vec.html#2211187e13cf6bc1e824e606e5bcd28e">index</a>[p]] != T(0))
967<a name="l01046"></a>01046       <a class="code" href="group__matrix__functions.html#gfcf8f54c2f4fc257bbc3111700b08355" title="Sum of elements in the matrix m, either along columns or rows.">sum</a> += v1f[v2.<a class="code" href="classitpp_1_1Sparse__Vec.html#2211187e13cf6bc1e824e606e5bcd28e">index</a>[p]] * v2.<a class="code" href="classitpp_1_1Sparse__Vec.html#31ce2b788940d0c05edc2328af3433f1">data</a>[p];
968<a name="l01047"></a>01047   }
969<a name="l01048"></a>01048
970<a name="l01049"></a>01049   <span class="keywordflow">return</span> <a class="code" href="group__matrix__functions.html#gfcf8f54c2f4fc257bbc3111700b08355" title="Sum of elements in the matrix m, either along columns or rows.">sum</a>;
971<a name="l01050"></a>01050 }
972<a name="l01051"></a>01051
973<a name="l01052"></a>01052 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
974<a name="l01053"></a>01053 T <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Vec&lt;T&gt; &amp;v2)
975<a name="l01054"></a>01054 {
976<a name="l01055"></a>01055   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v1.size() == v2.size(), <span class="stringliteral">"Multiplication of unequal sized vectors attempted"</span>);
977<a name="l01056"></a>01056
978<a name="l01057"></a>01057   T <a class="code" href="group__matrix__functions.html#gfcf8f54c2f4fc257bbc3111700b08355" title="Sum of elements in the matrix m, either along columns or rows.">sum</a>(0);
979<a name="l01058"></a>01058   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p1 = 0; p1 &lt; v1.used_size; p1++)
980<a name="l01059"></a>01059     <a class="code" href="group__matrix__functions.html#gfcf8f54c2f4fc257bbc3111700b08355" title="Sum of elements in the matrix m, either along columns or rows.">sum</a> += v1.<a class="code" href="classitpp_1_1Vec.html#6a4144a82cbf195a37f6ca2eb4c1f5f8" title="A pointer to the data area.">data</a>[p1] * v2[v1.index[p1]];
981<a name="l01060"></a>01060
982<a name="l01061"></a>01061   <span class="keywordflow">return</span> <a class="code" href="group__matrix__functions.html#gfcf8f54c2f4fc257bbc3111700b08355" title="Sum of elements in the matrix m, either along columns or rows.">sum</a>;
983<a name="l01062"></a>01062 }
984<a name="l01063"></a>01063
985<a name="l01064"></a>01064 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
986<a name="l01065"></a>01065 T <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v2)
987<a name="l01066"></a>01066 {
988<a name="l01067"></a>01067   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v1.size() == v2.size(), <span class="stringliteral">"Multiplication of unequal sized vectors attempted"</span>);
989<a name="l01068"></a>01068
990<a name="l01069"></a>01069   T <a class="code" href="group__matrix__functions.html#gfcf8f54c2f4fc257bbc3111700b08355" title="Sum of elements in the matrix m, either along columns or rows.">sum</a>(0);
991<a name="l01070"></a>01070   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p2 = 0; p2 &lt; v2.used_size; p2++)
992<a name="l01071"></a>01071     <a class="code" href="group__matrix__functions.html#gfcf8f54c2f4fc257bbc3111700b08355" title="Sum of elements in the matrix m, either along columns or rows.">sum</a> += v1[v2.index[p2]] * v2.<a class="code" href="classitpp_1_1Vec.html#6a4144a82cbf195a37f6ca2eb4c1f5f8" title="A pointer to the data area.">data</a>[p2];
993<a name="l01072"></a>01072
994<a name="l01073"></a>01073   <span class="keywordflow">return</span> <a class="code" href="group__matrix__functions.html#gfcf8f54c2f4fc257bbc3111700b08355" title="Sum of elements in the matrix m, either along columns or rows.">sum</a>;
995<a name="l01074"></a>01074 }
996<a name="l01075"></a>01075
997<a name="l01076"></a>01076 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
998<a name="l01077"></a>01077 Sparse_Vec&lt;T&gt; elem_mult(<span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v2)
999<a name="l01078"></a>01078 {
1000<a name="l01079"></a>01079   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v1.v_size == v2.v_size, <span class="stringliteral">"elem_mult(Sparse_Vec&lt;T&gt;, Sparse_Vec&lt;T&gt;)"</span>);
1001<a name="l01080"></a>01080
1002<a name="l01081"></a>01081   Sparse_Vec&lt;T&gt; r(v1.v_size);
1003<a name="l01082"></a>01082   ivec pos(v1.v_size);
1004<a name="l01083"></a>01083   pos = -1;
1005<a name="l01084"></a>01084   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p1 = 0; p1 &lt; v1.used_size; p1++)
1006<a name="l01085"></a>01085     pos[v1.index[p1]] = p1;
1007<a name="l01086"></a>01086   for (<span class="keywordtype">int</span> p2 = 0; p2 &lt; v2.used_size; p2++) {
1008<a name="l01087"></a>01087     <span class="keywordflow">if</span> (pos[v2.index[p2]] != -1) {
1009<a name="l01088"></a>01088       <span class="keywordflow">if</span> (r.used_size == r.data_size)
1010<a name="l01089"></a>01089         r.resize_data(r.used_size*2 + 100);
1011<a name="l01090"></a>01090       r.data[r.used_size] = v1.data[pos[v2.index[p2]]] * v2.data[p2];
1012<a name="l01091"></a>01091       r.index[r.used_size] = v2.index[p2];
1013<a name="l01092"></a>01092       r.used_size++;
1014<a name="l01093"></a>01093     }
1015<a name="l01094"></a>01094   }
1016<a name="l01095"></a>01095   r.compact();
1017<a name="l01096"></a>01096
1018<a name="l01097"></a>01097   <span class="keywordflow">return</span> r;
1019<a name="l01098"></a>01098 }
1020<a name="l01099"></a>01099
1021<a name="l01100"></a>01100 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
1022<a name="l01101"></a>01101 Vec&lt;T&gt; elem_mult(<span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Vec&lt;T&gt; &amp;v2)
1023<a name="l01102"></a>01102 {
1024<a name="l01103"></a>01103   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v1.v_size == v2.size(), <span class="stringliteral">"elem_mult(Sparse_Vec&lt;T&gt;, Vec&lt;T&gt;)"</span>);
1025<a name="l01104"></a>01104
1026<a name="l01105"></a>01105   Vec&lt;T&gt; r(v1.v_size);
1027<a name="l01106"></a>01106   r = T(0);
1028<a name="l01107"></a>01107   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p1 = 0; p1 &lt; v1.used_size; p1++)
1029<a name="l01108"></a>01108     r[v1.index[p1]] = v1.data[p1] * v2[v1.index[p1]];
1030<a name="l01109"></a>01109
1031<a name="l01110"></a>01110   <span class="keywordflow">return</span> r;
1032<a name="l01111"></a>01111 }
1033<a name="l01112"></a>01112
1034<a name="l01113"></a>01113 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
1035<a name="l01114"></a>01114 Sparse_Vec&lt;T&gt; elem_mult_s(<span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Vec&lt;T&gt; &amp;v2)
1036<a name="l01115"></a>01115 {
1037<a name="l01116"></a>01116   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v1.v_size == v2.size(), <span class="stringliteral">"elem_mult(Sparse_Vec&lt;T&gt;, Vec&lt;T&gt;)"</span>);
1038<a name="l01117"></a>01117
1039<a name="l01118"></a>01118   Sparse_Vec&lt;T&gt; r(v1.v_size);
1040<a name="l01119"></a>01119   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p1 = 0; p1 &lt; v1.used_size; p1++) {
1041<a name="l01120"></a>01120     <span class="keywordflow">if</span> (v2[v1.index[p1]] != T(0)) {
1042<a name="l01121"></a>01121       <span class="keywordflow">if</span> (r.used_size == r.data_size)
1043<a name="l01122"></a>01122         r.resize_data(r.used_size*2 + 100);
1044<a name="l01123"></a>01123       r.data[r.used_size] = v1.data[p1] * v2[v1.index[p1]];
1045<a name="l01124"></a>01124       r.index[r.used_size] = v1.index[p1];
1046<a name="l01125"></a>01125       r.used_size++;
1047<a name="l01126"></a>01126     }
1048<a name="l01127"></a>01127   }
1049<a name="l01128"></a>01128   r.compact();
1050<a name="l01129"></a>01129
1051<a name="l01130"></a>01130   <span class="keywordflow">return</span> r;
1052<a name="l01131"></a>01131 }
1053<a name="l01132"></a>01132
1054<a name="l01133"></a>01133 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
1055<a name="l01134"></a>01134 Vec&lt;T&gt; elem_mult(<span class="keyword">const</span> Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v2)
1056<a name="l01135"></a>01135 {
1057<a name="l01136"></a>01136   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v1.size() == v2.v_size, <span class="stringliteral">"elem_mult(Vec&lt;T&gt;, Sparse_Vec&lt;T&gt;)"</span>);
1058<a name="l01137"></a>01137
1059<a name="l01138"></a>01138   Vec&lt;T&gt; r(v2.v_size);
1060<a name="l01139"></a>01139   r = T(0);
1061<a name="l01140"></a>01140   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p2 = 0; p2 &lt; v2.used_size; p2++)
1062<a name="l01141"></a>01141     r[v2.index[p2]] = v1[v2.index[p2]] * v2.data[p2];
1063<a name="l01142"></a>01142
1064<a name="l01143"></a>01143   <span class="keywordflow">return</span> r;
1065<a name="l01144"></a>01144 }
1066<a name="l01145"></a>01145
1067<a name="l01146"></a>01146 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
1068<a name="l01147"></a>01147 Sparse_Vec&lt;T&gt; elem_mult_s(<span class="keyword">const</span> Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v2)
1069<a name="l01148"></a>01148 {
1070<a name="l01149"></a>01149   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v1.size() == v2.v_size, <span class="stringliteral">"elem_mult(Vec&lt;T&gt;, Sparse_Vec&lt;T&gt;)"</span>);
1071<a name="l01150"></a>01150
1072<a name="l01151"></a>01151   Sparse_Vec&lt;T&gt; r(v2.v_size);
1073<a name="l01152"></a>01152   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p2 = 0; p2 &lt; v2.used_size; p2++) {
1074<a name="l01153"></a>01153     <span class="keywordflow">if</span> (v1[v2.index[p2]] != T(0)) {
1075<a name="l01154"></a>01154       <span class="keywordflow">if</span> (r.used_size == r.data_size)
1076<a name="l01155"></a>01155         r.resize_data(r.used_size*2 + 100);
1077<a name="l01156"></a>01156       r.data[r.used_size] = v1[v2.index[p2]] * v2.data[p2];
1078<a name="l01157"></a>01157       r.index[r.used_size] = v2.index[p2];
1079<a name="l01158"></a>01158       r.used_size++;
1080<a name="l01159"></a>01159     }
1081<a name="l01160"></a>01160   }
1082<a name="l01161"></a>01161   r.compact();
1083<a name="l01162"></a>01162
1084<a name="l01163"></a>01163   <span class="keywordflow">return</span> r;
1085<a name="l01164"></a>01164 }
1086<a name="l01165"></a>01165
1087<a name="l01166"></a>01166 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
1088<a name="l01167"></a>01167 Sparse_Vec&lt;T&gt; <a class="code" href="group__fixed.html#g683d6c037357e472e84756fe1b1faae8" title="Fix + cfixmat.">operator+</a>(<span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v1, <span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;v2)
1089<a name="l01168"></a>01168 {
1090<a name="l01169"></a>01169   <a class="code" href="group__errorhandlingfunc.html#gb319550e696ee9d824d23c2a176bc3a6" title="Abort if t is not true and NDEBUG is not defined.">it_assert_debug</a>(v1.v_size == v2.v_size, <span class="stringliteral">"Sparse_Vec&lt;T&gt; + Sparse_Vec&lt;T&gt;"</span>);
1091<a name="l01170"></a>01170
1092<a name="l01171"></a>01171   Sparse_Vec&lt;T&gt; r(v1);
1093<a name="l01172"></a>01172   ivec pos(v1.v_size);
1094<a name="l01173"></a>01173   pos = -1;
1095<a name="l01174"></a>01174   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> p1 = 0; p1 &lt; v1.used_size; p1++)
1096<a name="l01175"></a>01175     pos[v1.index[p1]] = p1;
1097<a name="l01176"></a>01176   for (<span class="keywordtype">int</span> p2 = 0; p2 &lt; v2.used_size; p2++) {
1098<a name="l01177"></a>01177     <span class="keywordflow">if</span> (pos[v2.index[p2]] == -1) {<span class="comment">// A new entry</span>
1099<a name="l01178"></a>01178       <span class="keywordflow">if</span> (r.used_size == r.data_size)
1100<a name="l01179"></a>01179         r.resize_data(r.used_size*2 + 100);
1101<a name="l01180"></a>01180       r.data[r.used_size] = v2.data[p2];
1102<a name="l01181"></a>01181       r.index[r.used_size] = v2.index[p2];
1103<a name="l01182"></a>01182       r.used_size++;
1104<a name="l01183"></a>01183     }
1105<a name="l01184"></a>01184     <span class="keywordflow">else</span>
1106<a name="l01185"></a>01185       r.data[pos[v2.index[p2]]] += v2.data[p2];
1107<a name="l01186"></a>01186   }
1108<a name="l01187"></a>01187   r.check_small_elems_flag = <span class="keyword">true</span><span class="comment">// added dec 7, 2006</span>
1109<a name="l01188"></a>01188   r.compact();
1110<a name="l01189"></a>01189
1111<a name="l01190"></a>01190   <span class="keywordflow">return</span> r;
1112<a name="l01191"></a>01191 }
1113<a name="l01192"></a>01192
1114<a name="l01194"></a>01194 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
1115<a name="l01195"></a>01195 <span class="keyword">inline</span> Sparse_Vec&lt;T&gt; sparse(<span class="keyword">const</span> Vec&lt;T&gt; &amp;v)
1116<a name="l01196"></a>01196 {
1117<a name="l01197"></a>01197   Sparse_Vec&lt;T&gt; s(v);
1118<a name="l01198"></a>01198   <span class="keywordflow">return</span> s;
1119<a name="l01199"></a>01199 }
1120<a name="l01200"></a>01200
1121<a name="l01202"></a>01202 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
1122<a name="l01203"></a>01203 <span class="keyword">inline</span> Sparse_Vec&lt;T&gt; sparse(<span class="keyword">const</span> Vec&lt;T&gt; &amp;v, T epsilon)
1123<a name="l01204"></a>01204 {
1124<a name="l01205"></a>01205   Sparse_Vec&lt;T&gt; s(v, epsilon);
1125<a name="l01206"></a>01206   <span class="keywordflow">return</span> s;
1126<a name="l01207"></a>01207 }
1127<a name="l01208"></a>01208
1128<a name="l01210"></a>01210 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
1129<a name="l01211"></a>01211 <span class="keyword">inline</span> Vec&lt;T&gt; full(<span class="keyword">const</span> Sparse_Vec&lt;T&gt; &amp;s)
1130<a name="l01212"></a>01212 {
1131<a name="l01213"></a>01213   Vec&lt;T&gt; v;
1132<a name="l01214"></a>01214   s.full(v);
1133<a name="l01215"></a>01215   <span class="keywordflow">return</span> v;
1134<a name="l01216"></a>01216 }
1135<a name="l01217"></a>01217
1136<a name="l01219"></a>01219
1137<a name="l01220"></a>01220 <span class="comment">// ---------------------------------------------------------------------</span>
1138<a name="l01221"></a>01221 <span class="comment">// Instantiations</span>
1139<a name="l01222"></a>01222 <span class="comment">// ---------------------------------------------------------------------</span>
1140<a name="l01223"></a>01223
1141<a name="l01224"></a>01224 <span class="preprocessor">#ifdef HAVE_EXTERN_TEMPLATE</span>
1142<a name="l01225"></a>01225 <span class="preprocessor"></span>
1143<a name="l01226"></a>01226 <span class="keyword">extern</span> <span class="keyword">template</span> <span class="keyword">class </span>Sparse_Vec&lt;int&gt;;
1144<a name="l01227"></a>01227 <span class="keyword">extern</span> <span class="keyword">template</span> <span class="keyword">class </span>Sparse_Vec&lt;double&gt;;
1145<a name="l01228"></a>01228 <span class="keyword">extern</span> <span class="keyword">template</span> <span class="keyword">class </span>Sparse_Vec&lt;std::complex&lt;double&gt; &gt;;
1146<a name="l01229"></a>01229
1147<a name="l01230"></a>01230 <span class="keyword">extern</span> <span class="keyword">template</span> sparse_ivec <a class="code" href="group__fixed.html#g683d6c037357e472e84756fe1b1faae8" title="Fix + cfixmat.">operator+</a>(<span class="keyword">const</span> sparse_ivec &amp;,
1148<a name="l01231"></a>01231                                         <span class="keyword">const</span> sparse_ivec &amp;);
1149<a name="l01232"></a>01232 <span class="keyword">extern</span> <span class="keyword">template</span> sparse_vec <a class="code" href="group__fixed.html#g683d6c037357e472e84756fe1b1faae8" title="Fix + cfixmat.">operator+</a>(<span class="keyword">const</span> sparse_vec &amp;,
1150<a name="l01233"></a>01233                                        <span class="keyword">const</span> sparse_vec &amp;);
1151<a name="l01234"></a>01234 <span class="keyword">extern</span> <span class="keyword">template</span> sparse_cvec <a class="code" href="group__fixed.html#g683d6c037357e472e84756fe1b1faae8" title="Fix + cfixmat.">operator+</a>(<span class="keyword">const</span> sparse_cvec &amp;,
1152<a name="l01235"></a>01235                                         <span class="keyword">const</span> sparse_cvec &amp;);
1153<a name="l01236"></a>01236
1154<a name="l01237"></a>01237 <span class="keyword">extern</span> <span class="keyword">template</span> <span class="keywordtype">int</span> <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> sparse_ivec &amp;, <span class="keyword">const</span> sparse_ivec &amp;);
1155<a name="l01238"></a>01238 <span class="keyword">extern</span> <span class="keyword">template</span> <span class="keywordtype">double</span> <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> sparse_vec &amp;, <span class="keyword">const</span> sparse_vec &amp;);
1156<a name="l01239"></a>01239 <span class="keyword">extern</span> <span class="keyword">template</span> std::complex&lt;double&gt; <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> sparse_cvec &amp;,
1157<a name="l01240"></a>01240     <span class="keyword">const</span> sparse_cvec &amp;);
1158<a name="l01241"></a>01241
1159<a name="l01242"></a>01242 <span class="keyword">extern</span> <span class="keyword">template</span> <span class="keywordtype">int</span> <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> sparse_ivec &amp;, <span class="keyword">const</span> ivec &amp;);
1160<a name="l01243"></a>01243 <span class="keyword">extern</span> <span class="keyword">template</span> <span class="keywordtype">double</span> <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> sparse_vec &amp;, <span class="keyword">const</span> vec &amp;);
1161<a name="l01244"></a>01244 <span class="keyword">extern</span> <span class="keyword">template</span> std::complex&lt;double&gt; <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> sparse_cvec &amp;,
1162<a name="l01245"></a>01245     <span class="keyword">const</span> cvec &amp;);
1163<a name="l01246"></a>01246
1164<a name="l01247"></a>01247 <span class="keyword">extern</span> <span class="keyword">template</span> <span class="keywordtype">int</span> <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> ivec &amp;, <span class="keyword">const</span> sparse_ivec &amp;);
1165<a name="l01248"></a>01248 <span class="keyword">extern</span> <span class="keyword">template</span> <span class="keywordtype">double</span> <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> vec &amp;, <span class="keyword">const</span> sparse_vec &amp;);
1166<a name="l01249"></a>01249 <span class="keyword">extern</span> <span class="keyword">template</span> std::complex&lt;double&gt; <a class="code" href="group__fixed.html#g8bb80689611f7b6b0e36f5507d990af7" title="Fix * cfixmat.">operator*</a>(<span class="keyword">const</span> cvec &amp;,
1167<a name="l01250"></a>01250     <span class="keyword">const</span> sparse_cvec &amp;);
1168<a name="l01251"></a>01251
1169<a name="l01252"></a>01252 <span class="keyword">extern</span> <span class="keyword">template</span> sparse_ivec elem_mult(<span class="keyword">const</span> sparse_ivec &amp;,
1170<a name="l01253"></a>01253                                         <span class="keyword">const</span> sparse_ivec &amp;);
1171<a name="l01254"></a>01254 <span class="keyword">extern</span> <span class="keyword">template</span> sparse_vec elem_mult(<span class="keyword">const</span> sparse_vec &amp;, <span class="keyword">const</span> sparse_vec &amp;);
1172<a name="l01255"></a>01255 <span class="keyword">extern</span> <span class="keyword">template</span> sparse_cvec elem_mult(<span class="keyword">const</span> sparse_cvec &amp;,
1173<a name="l01256"></a>01256                                         <span class="keyword">const</span> sparse_cvec &amp;);
1174<a name="l01257"></a>01257
1175<a name="l01258"></a>01258 <span class="keyword">extern</span> <span class="keyword">template</span> ivec elem_mult(<span class="keyword">const</span> sparse_ivec &amp;, <span class="keyword">const</span> ivec &amp;);
1176<a name="l01259"></a>01259 <span class="keyword">extern</span> <span class="keyword">template</span> vec elem_mult(<span class="keyword">const</span> sparse_vec &amp;, <span class="keyword">const</span> vec &amp;);
1177<a name="l01260"></a>01260 <span class="keyword">extern</span> <span class="keyword">template</span> cvec elem_mult(<span class="keyword">const</span> sparse_cvec &amp;, <span class="keyword">const</span> cvec &amp;);
1178<a name="l01261"></a>01261
1179<a name="l01262"></a>01262 <span class="keyword">extern</span> <span class="keyword">template</span> sparse_ivec elem_mult_s(<span class="keyword">const</span> sparse_ivec &amp;, <span class="keyword">const</span> ivec &amp;);
1180<a name="l01263"></a>01263 <span class="keyword">extern</span> <span class="keyword">template</span> sparse_vec elem_mult_s(<span class="keyword">const</span> sparse_vec &amp;, <span class="keyword">const</span> vec &amp;);
1181<a name="l01264"></a>01264 <span class="keyword">extern</span> <span class="keyword">template</span> sparse_cvec elem_mult_s(<span class="keyword">const</span> sparse_cvec &amp;, <span class="keyword">const</span> cvec &amp;);
1182<a name="l01265"></a>01265
1183<a name="l01266"></a>01266 <span class="keyword">extern</span> <span class="keyword">template</span> ivec elem_mult(<span class="keyword">const</span> ivec &amp;, <span class="keyword">const</span> sparse_ivec &amp;);
1184<a name="l01267"></a>01267 <span class="keyword">extern</span> <span class="keyword">template</span> vec elem_mult(<span class="keyword">const</span> vec &amp;, <span class="keyword">const</span> sparse_vec &amp;);
1185<a name="l01268"></a>01268 <span class="keyword">extern</span> <span class="keyword">template</span> cvec elem_mult(<span class="keyword">const</span> cvec &amp;, <span class="keyword">const</span> sparse_cvec &amp;);
1186<a name="l01269"></a>01269
1187<a name="l01270"></a>01270 <span class="keyword">extern</span> <span class="keyword">template</span> sparse_ivec elem_mult_s(<span class="keyword">const</span> ivec &amp;, <span class="keyword">const</span> sparse_ivec &amp;);
1188<a name="l01271"></a>01271 <span class="keyword">extern</span> <span class="keyword">template</span> sparse_vec elem_mult_s(<span class="keyword">const</span> vec &amp;, <span class="keyword">const</span> sparse_vec &amp;);
1189<a name="l01272"></a>01272 <span class="keyword">extern</span> <span class="keyword">template</span> sparse_cvec elem_mult_s(<span class="keyword">const</span> cvec &amp;, <span class="keyword">const</span> sparse_cvec &amp;);
1190<a name="l01273"></a>01273
1191<a name="l01274"></a>01274 <span class="preprocessor">#endif // HAVE_EXTERN_TEMPLATE</span>
1192<a name="l01275"></a>01275 <span class="preprocessor"></span>
1193<a name="l01277"></a>01277
1194<a name="l01278"></a>01278 } <span class="comment">// namespace itpp</span>
1195<a name="l01279"></a>01279
1196<a name="l01280"></a>01280 <span class="preprocessor">#endif // #ifndef SVEC_H</span>
1197<a name="l01281"></a>01281 <span class="preprocessor"></span>
1198</pre></div></div>
1199<hr size="1"><address style="text-align: right;"><small>Generated on Tue Jun 2 10:02:13 2009 for mixpp by&nbsp;
1200<a href="http://www.doxygen.org/index.html">
1201<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
1202</body>
1203</html>
Note: See TracBrowser for help on using the browser.