annotate armadillo-3.900.4/docs.html @ 84:55a047986812 tip

Update library URI so as not to be document-local
author Chris Cannam
date Wed, 22 Apr 2020 14:21:57 +0100
parents 1ec0e2823891
children
rev   line source
Chris@49 1 <!-- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -->
Chris@49 2 <html>
Chris@49 3 <head>
Chris@49 4 <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
Chris@49 5 <title>Armadillo: API Reference</title>
Chris@49 6 <link rel="icon" href="armadillo_icon.png" type="image/png">
Chris@49 7 <style type="text/css">
Chris@49 8 <!--
Chris@49 9 body
Chris@49 10 {
Chris@49 11 font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
Chris@49 12 color: #000000;
Chris@49 13 background-color: #FFFFFF;
Chris@49 14 /* font-size: 10pt; */
Chris@49 15 /* line-height: 120%; */
Chris@49 16 height: 110%;
Chris@49 17 }
Chris@49 18
Chris@49 19 pre
Chris@49 20 {
Chris@49 21 font-family: "DejaVu Sans Mono", "Liberation Mono", "Andale Mono", "Bitstream Vera Sans Mono", "Luxi Mono", monospace;
Chris@49 22 font-size: smaller;
Chris@49 23 color: #666666;
Chris@49 24 }
Chris@49 25
Chris@49 26 a
Chris@49 27 {
Chris@49 28 text-decoration: none;
Chris@49 29 color: #498c05;
Chris@49 30 }
Chris@49 31
Chris@49 32 a:hover
Chris@49 33 {
Chris@49 34 text-decoration: underline;
Chris@49 35 color: #498c05;
Chris@49 36 }
Chris@49 37
Chris@49 38 a.menu
Chris@49 39 {
Chris@49 40 text-decoration: none;
Chris@49 41 color: #CCCCCC;
Chris@49 42 }
Chris@49 43
Chris@49 44 a.menu:hover
Chris@49 45 {
Chris@49 46 text-decoration: none;
Chris@49 47 color: #498c05;
Chris@49 48 }
Chris@49 49
Chris@49 50 a.hidden, a.hidden:hover, a.hidden:active, a.hidden:link, a.hidden:visited
Chris@49 51 {
Chris@49 52 text-decoration: none;
Chris@49 53 border-bottom: 0px
Chris@49 54 }
Chris@49 55
Chris@49 56 table
Chris@49 57 {
Chris@49 58 /* border: 1px solid #000; */
Chris@49 59 /* display: block; */
Chris@49 60 border-collapse: collapse;
Chris@49 61 }
Chris@49 62
Chris@49 63 td.line
Chris@49 64 {
Chris@49 65 border-left: 2px solid rgb(204, 204, 204);
Chris@49 66 }
Chris@49 67
Chris@49 68 .footertext
Chris@49 69 {
Chris@49 70 position: relative;
Chris@49 71 bottom: 0px;
Chris@49 72 }
Chris@49 73
Chris@49 74 hr.greyline
Chris@49 75 {
Chris@49 76 color: rgb(204, 204, 204);
Chris@49 77 /* background-color: rgb(204, 204, 204); */
Chris@49 78 }
Chris@49 79
Chris@49 80
Chris@49 81 #nobreak
Chris@49 82 {
Chris@49 83 white-space: nowrap;
Chris@49 84 }
Chris@49 85
Chris@49 86 .noindent
Chris@49 87 {
Chris@49 88 text-indent: 0px;
Chris@49 89 margin-left: 1ex;
Chris@49 90 margin-right: 0ex;
Chris@49 91 margin-top: 0ex;
Chris@49 92 margin-bottom: 0ex;
Chris@49 93 padding-left: 1ex;
Chris@49 94 padding-right: 0ex;
Chris@49 95 padding-top: 0ex;
Chris@49 96 padding-bottom: 0ex;
Chris@49 97 list-style: disc;
Chris@49 98 }
Chris@49 99 -->
Chris@49 100 </style>
Chris@49 101 </head>
Chris@49 102 <body>
Chris@49 103 <center>
Chris@49 104 <table style="text-align: left; width: 80%; margin-left: auto; margin-right: auto;" border="0" cellpadding="0" cellspacing="0">
Chris@49 105 <tbody>
Chris@49 106 <tr>
Chris@49 107 <td style="vertical-align: top;">
Chris@49 108
Chris@49 109 <table style="text-align: left; width: 100%;" border="0" cellpadding="0" cellspacing="0">
Chris@49 110 <tbody>
Chris@49 111 <tr>
Chris@49 112 <td style="text-align: left; vertical-align: top;">
Chris@49 113 <font size=+2><b>Reference for Armadillo 3.900</b></font>
Chris@49 114 <br>
Chris@49 115 <b>(Bavarian Sunflower)</b>
Chris@49 116 </td>
Chris@49 117 <td style="text-align: right; vertical-align: top;">
Chris@49 118 <b><a href="http://arma.sourceforge.net">to Armadillo home page</a></b>
Chris@49 119 <br>
Chris@49 120 <b><a href="http://nicta.com.au">to NICTA home page</a></b>
Chris@49 121 <br>
Chris@49 122 </td>
Chris@49 123 </tr>
Chris@49 124 </tbody>
Chris@49 125 </table>
Chris@49 126 <hr>
Chris@49 127 <br>
Chris@49 128 <br>
Chris@49 129 <a name="top"></a>
Chris@49 130 <a style="display:scroll; position:fixed; bottom:5px; right:5px;" href="#top"><font size=-1>[top]</font></a>
Chris@49 131
Chris@49 132
Chris@49 133 <!-- BEGIN CONTENT -->
Chris@49 134
Chris@49 135
Chris@49 136 <b>Preamble</b>
Chris@49 137 <br>
Chris@49 138 <br>
Chris@49 139 <table border="0" cellpadding="0" cellspacing="0">
Chris@49 140 <tbody>
Chris@49 141 <tr>
Chris@49 142 <td style="text-align: left; vertical-align: top; width: 50%;">
Chris@49 143 <ul>
Chris@49 144 <li>
Chris@49 145 To aid the conversion of Matlab/Octave programs,
Chris@49 146 there is a <a href="#syntax">syntax conversion table</a>
Chris@49 147 </li>
Chris@49 148 <br>
Chris@49 149 <li>
Chris@49 150 First time users may want to have a look at a short <a href="#example_prog">example program</a>
Chris@49 151 </li>
Chris@49 152 <br>
Chris@49 153 <li>
Chris@49 154 If you find any bugs or regressions, please <a href="http://arma.sourceforge.net/faq.html">report them</a>
Chris@49 155 </li>
Chris@49 156 <br>
Chris@49 157 <li>
Chris@49 158 Notes on <a href="#api_additions">API additions</a>
Chris@49 159 </li>
Chris@49 160 </ul>
Chris@49 161 </td>
Chris@49 162 <td>
Chris@49 163 &nbsp;
Chris@49 164 </td>
Chris@49 165 <td class="line" style="vertical-align: top;">
Chris@49 166 <br>
Chris@49 167 </td>
Chris@49 168 <td style="text-align: left; vertical-align: top; width: 45%;">
Chris@49 169 <ul>
Chris@49 170 <li>
Chris@49 171 Please cite the following tech report if you use Armadillo in your research and/or software.
Chris@49 172 Citations are useful for the continued development and maintenance of the library.
Chris@49 173 <br>
Chris@49 174 <br>
Chris@49 175 <font size=-1>
Chris@49 176 Conrad Sanderson.
Chris@49 177 <br>
Chris@49 178 <i><a href="armadillo_nicta_2010.pdf">Armadillo: An Open Source C++ Linear Algebra Library for Fast Prototyping and Computationally Intensive Experiments</a></i>.
Chris@49 179 <br>
Chris@49 180 Technical Report, NICTA, 2010.
Chris@49 181 </font>
Chris@49 182 </li>
Chris@49 183 </ul>
Chris@49 184 </td>
Chris@49 185 </tr>
Chris@49 186 </tbody>
Chris@49 187 </table>
Chris@49 188
Chris@49 189 <br>
Chris@49 190 <br>
Chris@49 191
Chris@49 192 <b>Matrix, Vector, Cube and Field Classes</b>
Chris@49 193 <ul>
Chris@49 194 <a href="#Mat">Mat&lt;<i>type</i>&gt;, mat and cx_mat</a>&nbsp;&middot;
Chris@49 195 <a href="#Col">Col&lt;<i>type</i>&gt;, colvec and vec</a>&nbsp;&middot;
Chris@49 196 <a href="#Row">Row&lt;<i>type</i>&gt;, rowvec</a>&nbsp;&middot;
Chris@49 197 <a href="#Cube">Cube&lt;<i>type</i>&gt;, cube</a>&nbsp;&middot;
Chris@49 198 <a href="#field">field&lt;<i>object&nbsp;type</i>&gt;</a>&nbsp;&middot;
Chris@49 199 <a href="#SpMat">SpMat&lt;<i>type</i>&gt;, sp_mat and sp_cx_mat</a>
Chris@49 200 </ul>
Chris@49 201 <br>
Chris@49 202
Chris@49 203 <b>Member Functions &amp; Variables</b>
Chris@49 204 <ul>
Chris@49 205 <a href="#attributes">attributes</a>&nbsp;&middot;
Chris@49 206 <a href="#colptr">colptr</a>&nbsp;&middot;
Chris@49 207 <a href="#copy_size">copy_size</a>&nbsp;&middot;
Chris@49 208 <a href="#diag">diag</a>&nbsp;&middot;
Chris@49 209 <a href="#each_colrow">each_col/each_row</a>&nbsp;&middot;
Chris@49 210 <a href="#element_access">element&nbsp;access</a>&nbsp;&middot;
Chris@49 211 <a href="#element_initialisation">element&nbsp;initialisation</a>&nbsp;&middot;
Chris@49 212 <a href="#eval_member">eval</a>&nbsp;&middot;
Chris@49 213 <a href="#eye_member">eye</a>&nbsp;&middot;
Chris@49 214 <a href="#fill">fill</a>&nbsp;&middot;
Chris@49 215 <a href="#i_member">i (inverse)</a>&nbsp;&middot;
Chris@49 216 <a href="#imbue">imbue</a>&nbsp;&middot;
Chris@49 217 <a href="#insert">insert rows/cols/slices</a>&nbsp;&middot;
Chris@49 218 <a href="#in_range">in_range</a>&nbsp;&middot;
Chris@49 219 <a href="#is_empty">is_empty</a>&nbsp;&middot;
Chris@49 220 <a href="#is_finite">is_finite</a>&nbsp;&middot;
Chris@49 221 <a href="#is_square">is_square</a>&nbsp;&middot;
Chris@49 222 <a href="#is_vec">is_vec</a>&nbsp;&middot;
Chris@49 223 <a href="#iterators_mat">iterators (matrices)</a>&nbsp;&middot;
Chris@49 224 <a href="#iterators_cube">iterators (cubes)</a>&nbsp;&middot;
Chris@49 225 <a href="#memptr">memptr</a>&nbsp;&middot;
Chris@49 226 <a href="#min_and_max_member">min/max</a>&nbsp;&middot;
Chris@49 227 <a href="#ones_member">ones</a>&nbsp;&middot;
Chris@49 228 <a href="#operators">operators</a>&nbsp;&middot;
Chris@49 229 <a href="#print">print</a>&nbsp;&middot;
Chris@49 230 <a href="#raw_print">raw_print</a>&nbsp;&middot;
Chris@49 231 <a href="#randu_randn_member">randu/randn</a>&nbsp;&middot;
Chris@49 232 <a href="#reset">reset</a>&nbsp;&middot;
Chris@49 233 <a href="#reshape_member">reshape</a>&nbsp;&middot;
Chris@49 234 <a href="#resize_member">resize</a>&nbsp;&middot;
Chris@49 235 <a href="#save_load_mat">save/load (matrices &amp; cubes)</a>&nbsp;&middot;
Chris@49 236 <a href="#save_load_field">save/load (fields)</a>&nbsp;&middot;
Chris@49 237 <a href="#set_imag">set_imag/real</a>&nbsp;&middot;
Chris@49 238 <a href="#set_size">set_size</a>&nbsp;&middot;
Chris@49 239 <a href="#shed">shed rows/cols/slices</a>&nbsp;&middot;
Chris@49 240 <a href="#stl_container_fns">STL container functions</a>&nbsp;&middot;
Chris@49 241 <a href="#submat">submatrix&nbsp;views</a>&nbsp;&middot;
Chris@49 242 <a href="#subcube">subcube&nbsp;views</a>&nbsp;&middot;
Chris@49 243 <a href="#subfield">subfield&nbsp;views</a>&nbsp;&middot;
Chris@49 244 <a href="#swap">swap</a>&nbsp;&middot;
Chris@49 245 <a href="#swap_rows">swap_rows/cols</a>&nbsp;&middot;
Chris@49 246 <a href="#t_st_members">t/st (transpose)</a>&nbsp;&middot;
Chris@49 247 <a href="#transform">transform</a>&nbsp;&middot;
Chris@49 248 <a href="#zeros_member">zeros</a>
Chris@49 249 </ul>
Chris@49 250 <br>
Chris@49 251
Chris@49 252 <b>Other Classes</b>
Chris@49 253 <ul>
Chris@49 254 <a href="#running_stat">running_stat&lt;<i>type</i>&gt;</a>&nbsp;&middot;
Chris@49 255 <a href="#running_stat_vec">running_stat_vec&lt;<i>type</i>&gt;</a>&nbsp;&middot;
Chris@49 256 <a href="#wall_clock">wall_clock</a>
Chris@49 257 </ul>
Chris@49 258 <br>
Chris@49 259
Chris@49 260 <b>Generated Vectors/Matrices/Cubes</b>
Chris@49 261 <ul>
Chris@49 262 <a href="#eye_standalone">eye</a>&nbsp;&middot;
Chris@49 263 <a href="#linspace">linspace</a>&nbsp;&middot;
Chris@49 264 <a href="#ones_standalone">ones</a>&nbsp;&middot;
Chris@49 265 <a href="#randu_randn_standalone">randu/randn</a>&nbsp;&middot;
Chris@49 266 <a href="#repmat">repmat</a>&nbsp;&middot;
Chris@49 267 <a href="#speye">speye</a>&nbsp;&middot;
Chris@49 268 <a href="#sprandu_sprandn">sprandu/sprandn</a>&nbsp;&middot;
Chris@49 269 <a href="#toeplitz">toeplitz/circ_toeplitz</a>&nbsp;&middot;
Chris@49 270 <a href="#zeros_standalone">zeros</a>
Chris@49 271 </ul>
Chris@49 272 <br>
Chris@49 273
Chris@49 274 <b>Functions Individually Applied to Each Element of a Matrix/Cube</b>
Chris@49 275 <ul>
Chris@49 276 <a href="#abs">abs</a>&nbsp;&middot;
Chris@49 277 <a href="#eps">eps</a>&nbsp;&middot;
Chris@49 278 <a href="#misc_fns">misc functions (exp, log, pow, sqrt, ...)</a>&nbsp;&middot;
Chris@49 279 <a href="#trig_fns">trigonometric functions (cos, sin, ...)</a>
Chris@49 280 </ul>
Chris@49 281 <br>
Chris@49 282
Chris@49 283 <b>Scalar Valued Functions of Vectors/Matrices/Cubes</b>
Chris@49 284 <ul>
Chris@49 285 <a href="#accu">accu</a>&nbsp;&middot;
Chris@49 286 <a href="#as_scalar">as_scalar</a>&nbsp;&middot;
Chris@49 287 <a href="#det">det</a>&nbsp;&middot;
Chris@49 288 <a href="#dot">dot/cdot/norm_dot</a>&nbsp;&middot;
Chris@49 289 <a href="#log_det">log_det</a>&nbsp;&middot;
Chris@49 290 <a href="#norm">norm</a>&nbsp;&middot;
Chris@49 291 <a href="#rank">rank</a>&nbsp;&middot;
Chris@49 292 <a href="#trace">trace</a>
Chris@49 293 </ul>
Chris@49 294 <br>
Chris@49 295
Chris@49 296 <b>Scalar/Vector Valued Functions of Vectors/Matrices</b>
Chris@49 297 <ul>
Chris@49 298 <a href="#diagvec">diagvec</a>&nbsp;&middot;
Chris@49 299 <a href="#min_and_max">min/max</a>&nbsp;&middot;
Chris@49 300 <a href="#prod">prod</a>&nbsp;&middot;
Chris@49 301 <a href="#sum">sum</a>&nbsp;&middot;
Chris@49 302 <a href="#stats_fns">statistics (mean, stddev, ...)</a>
Chris@49 303 </ul>
Chris@49 304 <br>
Chris@49 305
Chris@49 306 <b>Vector/Matrix/Cube Valued Functions of Vectors/Matrices/Cubes</b>
Chris@49 307 <ul>
Chris@49 308 <a href="#conv">conv</a>&nbsp;&middot;
Chris@49 309 <a href="#conv_to">conv_to</a>&nbsp;&middot;
Chris@49 310 <a href="#conj">conj</a>&nbsp;&middot;
Chris@49 311 <a href="#cor">cor</a>&nbsp;&middot;
Chris@49 312 <a href="#cov">cov</a>&nbsp;&middot;
Chris@49 313 <a href="#cross">cross</a>&nbsp;&middot;
Chris@49 314 <a href="#cumsum">cumsum</a>&nbsp;&middot;
Chris@49 315 <a href="#diagmat">diagmat</a>&nbsp;&middot;
Chris@49 316 <a href="#find">find</a>&nbsp;&middot;
Chris@49 317 <a href="#flip">fliplr/flipud</a>&nbsp;&middot;
Chris@49 318 <a href="#hist">hist</a>&nbsp;&middot;
Chris@49 319 <a href="#histc">histc</a>&nbsp;&middot;
Chris@49 320 <a href="#imag_real">imag/real</a>&nbsp;&middot;
Chris@49 321 <a href="#join">join&nbsp;rows/cols/slices</a>&nbsp;&middot;
Chris@49 322 <a href="#kron">kron</a>&nbsp;&middot;
Chris@49 323 <a href="#reshape">reshape</a>&nbsp;&middot;
Chris@49 324 <a href="#resize">resize</a>&nbsp;&middot;
Chris@49 325 <a href="#shuffle">shuffle</a>&nbsp;&middot;
Chris@49 326 <a href="#sort">sort</a>&nbsp;&middot;
Chris@49 327 <a href="#sort_index">sort_index</a>&nbsp;&middot;
Chris@49 328 <a href="#symmat">symmatu/symmatl</a>&nbsp;&middot;
Chris@49 329 <a href="#strans">strans</a>&nbsp;&middot;
Chris@49 330 <a href="#trans">trans</a>&nbsp;&middot;
Chris@49 331 <a href="#trimat">trimatu/trimatl</a>&nbsp;&middot;
Chris@49 332 <a href="#unique">unique</a>
Chris@49 333 </ul>
Chris@49 334 <br>
Chris@49 335
Chris@49 336 <b>Decompositions, Factorisations, Inverses and Equation Solvers</b>
Chris@49 337 <ul>
Chris@49 338 <a href="#chol">chol</a>&nbsp;&middot;
Chris@49 339 <a href="#eig_sym">eig_sym</a>&nbsp;&middot;
Chris@49 340 <a href="#eig_gen">eig_gen</a>&nbsp;&middot;
Chris@49 341 <a href="#fft">fft/ifft</a>&nbsp;&middot;
Chris@49 342 <a href="#inv">inv</a>&nbsp;&middot;
Chris@49 343 <a href="#lu">lu</a>&nbsp;&middot;
Chris@49 344 <a href="#pinv">pinv</a>&nbsp;&middot;
Chris@49 345 <a href="#princomp">princomp</a>&nbsp;&middot;
Chris@49 346 <a href="#qr">qr</a>&nbsp;&middot;
Chris@49 347 <a href="#qr_econ">qr_econ</a>&nbsp;&middot;
Chris@49 348 <a href="#solve">solve</a>&nbsp;&middot;
Chris@49 349 <a href="#svd">svd</a>&nbsp;&middot;
Chris@49 350 <a href="#svd_econ">svd_econ</a>&nbsp;&middot;
Chris@49 351 <a href="#syl">syl</a>
Chris@49 352 </ul>
Chris@49 353 <br>
Chris@49 354
Chris@49 355 <b>Miscellaneous</b>
Chris@49 356 <ul>
Chris@49 357 <a href="#is_finite_standalone">is_finite()</a>&nbsp;&middot;
Chris@49 358 <a href="#logging">logging of errors/warnings</a>&nbsp;&middot;
Chris@49 359 <a href="#constants">various constants (pi, inf, speed of light, ...)</a>&nbsp;&middot;
Chris@49 360 <!--<a href="#log_add">log_add</a>&nbsp;&middot;-->
Chris@49 361 <a href="#uword">uword/sword</a>&nbsp;&middot;
Chris@49 362 <a href="#cx_float_double">cx_float/cx_double</a>&nbsp;&middot;
Chris@49 363 <a href="#syntax">Matlab/Armadillo syntax differences</a>&nbsp;&middot;
Chris@49 364 <a href="#example_prog">example program</a>&nbsp;&middot;
Chris@49 365 <!--<a href="#catching_exceptions">catching exceptions</a>&nbsp;&middot;-->
Chris@49 366 <a href="#config_hpp">config.hpp</a>&nbsp;&middot;
Chris@49 367 <a href="#api_additions">API additions</a>
Chris@49 368 </ul>
Chris@49 369 <br>
Chris@49 370
Chris@49 371 <br>
Chris@49 372 <br>
Chris@49 373 <hr class="greyline">
Chris@49 374 <hr class="greyline">
Chris@49 375 <br>
Chris@49 376 <br>
Chris@49 377 <font size=+1><b>Matrix, Vector, Cube and Field Classes</b></font>
Chris@49 378 <br>
Chris@49 379 <br>
Chris@49 380 <hr class="greyline">
Chris@49 381 <br>
Chris@49 382
Chris@49 383 <a name="Mat"></a><b>Mat&lt;</b><i>type</i><b>&gt;</b>
Chris@49 384 <br><b>mat</b>
Chris@49 385 <br><b>cx_mat</b>
Chris@49 386 <ul>
Chris@49 387 <li>
Chris@49 388 The root matrix class is <b>Mat&lt;</b><i>type</i><b>&gt;</b>, where <i>type</i> can be one of:
Chris@49 389 <ul>
Chris@49 390 <li>
Chris@49 391 <i>float</i>, <i>double</i>, <i>std::complex&lt;float&gt;</i>, <i>std::complex&lt;double&gt;</i>,
Chris@49 392 <i>char</i>, <i>short</i>, <i>int</i>, and unsigned versions of <i>char</i>, <i>short</i>, <i>int</i>.
Chris@49 393 </li>
Chris@49 394 </ul>
Chris@49 395 </li>
Chris@49 396 <br>
Chris@49 397 <li>
Chris@49 398 For convenience the following typedefs have been defined:
Chris@49 399 <ul>
Chris@49 400 <table style="text-align: left;" border="0" cellpadding="2" cellspacing="2">
Chris@49 401 <tbody>
Chris@49 402 <tr>
Chris@49 403 <td style="vertical-align: top;">
Chris@49 404 mat
Chris@49 405 </td>
Chris@49 406 <td style="vertical-align: top;">
Chris@49 407 &nbsp;=&nbsp;
Chris@49 408 </td>
Chris@49 409 <td style="vertical-align: top;">
Chris@49 410 Mat&lt;double&gt;
Chris@49 411 </td>
Chris@49 412 </tr>
Chris@49 413 <tr>
Chris@49 414 <td style="vertical-align: top;">
Chris@49 415 fmat
Chris@49 416 </td>
Chris@49 417 <td style="vertical-align: top;">
Chris@49 418 &nbsp;=&nbsp;
Chris@49 419 </td>
Chris@49 420 <td style="vertical-align: top;">
Chris@49 421 Mat&lt;float&gt;
Chris@49 422 </td>
Chris@49 423 </tr>
Chris@49 424 <tr>
Chris@49 425 <td style="vertical-align: top;">
Chris@49 426 cx_mat
Chris@49 427 </td>
Chris@49 428 <td style="vertical-align: top;">
Chris@49 429 &nbsp;=&nbsp;
Chris@49 430 </td>
Chris@49 431 <td style="vertical-align: top;">
Chris@49 432 Mat&lt;<a href="#cx_float_double">cx_double</a>&gt;
Chris@49 433 </td>
Chris@49 434 </tr>
Chris@49 435 <tr>
Chris@49 436 <td style="vertical-align: top;">
Chris@49 437 cx_fmat
Chris@49 438 </td>
Chris@49 439 <td style="vertical-align: top;">
Chris@49 440 &nbsp;=&nbsp;
Chris@49 441 </td>
Chris@49 442 <td style="vertical-align: top;">
Chris@49 443 Mat&lt;<a href="#cx_float_double">cx_float</a>&gt;
Chris@49 444 </td>
Chris@49 445 </tr>
Chris@49 446 <tr>
Chris@49 447 <td style="vertical-align: top;">
Chris@49 448 umat
Chris@49 449 </td>
Chris@49 450 <td style="vertical-align: top;">
Chris@49 451 &nbsp;=&nbsp;
Chris@49 452 </td>
Chris@49 453 <td style="vertical-align: top;">
Chris@49 454 Mat&lt;<a href="#uword">uword</a>&gt;
Chris@49 455 </td>
Chris@49 456 </tr>
Chris@49 457 <tr>
Chris@49 458 <td style="vertical-align: top;">
Chris@49 459 imat
Chris@49 460 </td>
Chris@49 461 <td style="vertical-align: top;">
Chris@49 462 &nbsp;=&nbsp;
Chris@49 463 </td>
Chris@49 464 <td style="vertical-align: top;">
Chris@49 465 Mat&lt;<a href="#uword">sword</a>&gt;
Chris@49 466 </td>
Chris@49 467 </tr>
Chris@49 468 </tbody>
Chris@49 469 </table>
Chris@49 470 </ul>
Chris@49 471 </li>
Chris@49 472 <br>
Chris@49 473 <li>
Chris@49 474 In this documentation the <i>mat</i> type is used for convenience;
Chris@49 475 it is possible to use other types instead, eg. <i>fmat</i>
Chris@49 476 </li>
Chris@49 477 <br>
Chris@49 478 <li>
Chris@49 479 Functions which are wrappers for LAPACK or ATLAS functions (generally matrix decompositions) are only valid for the following types:
Chris@49 480 <i>fmat</i>, <i>mat</i>, <i>cx_fmat</i>, <i>cx_mat</i>
Chris@49 481 </li>
Chris@49 482 <br>
Chris@49 483 <li>
Chris@49 484 Elements are stored with column-major ordering (ie. column by column)
Chris@49 485 </li>
Chris@49 486 <br>
Chris@49 487 <a name="constructors_mat"></a>
Chris@49 488 <li>
Chris@49 489 Constructors:
Chris@49 490 <ul>
Chris@49 491 <li>mat()</li>
Chris@49 492 <li>mat(n_rows, n_cols)</li>
Chris@49 493 <li>mat(mat)</li>
Chris@49 494 <li>mat(vec)</li>
Chris@49 495 <li>mat(rowvec)</li>
Chris@49 496 <li>mat(string)</li>
Chris@49 497 <li>mat(std::vector) &nbsp; (treated as a column vector)</li>
Chris@49 498 <li>mat(initialiser_list) &nbsp; (C++11 only)</li>
Chris@49 499 <li>cx_mat(mat,mat) &nbsp; (for constructing a complex matrix out of two real matrices)</li>
Chris@49 500 </ul>
Chris@49 501 </li>
Chris@49 502 <br>
Chris@49 503 <li>
Chris@49 504 The string format for the constructor is elements separated by spaces, and rows denoted by semicolons.
Chris@49 505 For example, the 2x2 identity matrix can be created using the format string <code>"1 0; 0 1"</code>.
Chris@49 506 While string based initialisation is compact,
Chris@49 507 directly <a href="#element_access">setting the elements</a>
Chris@49 508 or using <a href="#element_initialisation">element initialisation</a> is considerably faster.
Chris@49 509 </li>
Chris@49 510 <br>
Chris@49 511 <a name="adv_constructors_mat"></a>
Chris@49 512 <li>
Chris@49 513 Advanced constructors:
Chris@49 514 <br>
Chris@49 515 <br>
Chris@49 516 <ul>
Chris@49 517 <li>mat(aux_mem*, n_rows, n_cols, copy_aux_mem = true, strict = true)
Chris@49 518 <br>
Chris@49 519 <br>
Chris@49 520 <ul>
Chris@49 521 Create a matrix using data from writeable auxiliary memory.
Chris@49 522 By default the matrix allocates its own memory and copies data from the auxiliary memory (for safety).
Chris@49 523 However, if <i>copy_aux_mem</i> is set to <i>false</i>,
Chris@49 524 the matrix will instead directly use the auxiliary memory (ie. no copying).
Chris@49 525 This is faster, but can be dangerous unless you know what you're doing!
Chris@49 526 <br>
Chris@49 527 <br>
Chris@49 528 The <i>strict</i> variable comes into effect only if <i>copy_aux_mem</i> is set to <i>false</i>
Chris@49 529 (ie. the matrix is directly using auxiliary memory).
Chris@49 530 If <i>strict</i> is set to <i>true</i>,
Chris@49 531 the matrix will be bound to the auxiliary memory for its lifetime;
Chris@49 532 the number of elements in the matrix can't be changed (directly or indirectly).
Chris@49 533 If <i>strict</i> is set to <i>false</i>, the matrix will not be bound to the auxiliary memory for its lifetime,
Chris@49 534 ie., the size of the matrix can be changed.
Chris@49 535 If the requested number of elements is different to the size of the auxiliary memory,
Chris@49 536 new memory will be allocated and the auxiliary memory will no longer be used.
Chris@49 537 </ul>
Chris@49 538 </li>
Chris@49 539 <br>
Chris@49 540 <li>mat(const aux_mem*, n_rows, n_cols)
Chris@49 541 <br>
Chris@49 542 <br>
Chris@49 543 <ul>
Chris@49 544 Create a matrix by copying data from read-only auxiliary memory.
Chris@49 545 </ul>
Chris@49 546 </li>
Chris@49 547 <a name="adv_constructors_mat_fixed"></a>
Chris@49 548 <br>
Chris@49 549 <li>mat::fixed&lt;n_rows, n_cols&gt;
Chris@49 550 <br>
Chris@49 551 <br>
Chris@49 552 <ul>
Chris@49 553 Create a fixed size matrix, with the size specified via template arguments.
Chris@49 554 Memory for the matrix is allocated at compile time.
Chris@49 555 This is generally faster than dynamic memory allocation, but the size of the matrix can't be changed afterwards (directly or indirectly).
Chris@49 556 <br>
Chris@49 557 <br>
Chris@49 558 For convenience, there are several pre-defined typedefs for each matrix type
Chris@49 559 (where the types are: <i>umat</i>, <i>imat</i>, <i>fmat</i>, <i>mat</i>, <i>cx_fmat</i>, <i>cx_mat</i>).
Chris@49 560 The typedefs specify a square matrix size, ranging from 2x2 to 9x9.
Chris@49 561 The typedefs were defined by simply appending a two digit form of the size to the matrix type
Chris@49 562 -- for example, <i>mat33</i> is equivalent to <i>mat::fixed&lt;3,3&gt;</i>,
Chris@49 563 while <i>cx_mat44</i> is equivalent to <i>cx_mat::fixed&lt;4,4&gt;</i>.
Chris@49 564 </ul>
Chris@49 565 </li>
Chris@49 566 <br>
Chris@49 567 <li>mat::fixed&lt;n_rows, n_cols&gt;(const aux_mem*)
Chris@49 568 <br>
Chris@49 569 <br>
Chris@49 570 <ul>
Chris@49 571 Create a fixed size matrix, with the size specified via template arguments,
Chris@49 572 and copying data from auxiliary memory.
Chris@49 573 </ul>
Chris@49 574 </li>
Chris@49 575 </ul>
Chris@49 576 </li>
Chris@49 577 <br>
Chris@49 578 <br>
Chris@49 579 <li>
Chris@49 580 Examples:
Chris@49 581 <ul>
Chris@49 582 <pre>
Chris@49 583 mat A = randu&lt;mat&gt;(5,5);
Chris@49 584 double x = A(1,2);
Chris@49 585
Chris@49 586 mat B = A + A;
Chris@49 587 mat C = A * B;
Chris@49 588 mat D = A % B;
Chris@49 589
Chris@49 590 cx_mat X(A,B);
Chris@49 591
Chris@49 592 B.zeros();
Chris@49 593 B.set_size(10,10);
Chris@49 594 B.zeros(5,6);
Chris@49 595
Chris@49 596 //
Chris@49 597 // fixed size matrices:
Chris@49 598
Chris@49 599 mat::fixed&lt;5,6&gt; F;
Chris@49 600 F.ones();
Chris@49 601
Chris@49 602 mat44 G;
Chris@49 603 G.randn();
Chris@49 604
Chris@49 605 cout &lt;&lt; mat22().randu() &lt;&lt; endl;
Chris@49 606
Chris@49 607 //
Chris@49 608 // constructing matrices from
Chris@49 609 // auxiliary (external) memory:
Chris@49 610
Chris@49 611 double aux_mem[24];
Chris@49 612 mat H(aux_mem, 4, 6, false);
Chris@49 613 </pre>
Chris@49 614 </ul>
Chris@49 615 </li>
Chris@49 616 <br>
Chris@49 617 <li><b>Caveat:</b>
Chris@49 618 For mathematical correctness, scalars are treated as 1x1 matrices during initialisation.
Chris@49 619 As such, the code below <b>will not</b> generate a 5x5 matrix with every element equal to 123.0:
Chris@49 620 <ul>
Chris@49 621 <pre>
Chris@49 622 mat A(5,5); A = 123.0;
Chris@49 623 </pre>
Chris@49 624 </ul>
Chris@49 625 Use the following code instead:
Chris@49 626 <ul>
Chris@49 627 <pre>
Chris@49 628 mat A(5,5); A.fill(123.0);
Chris@49 629 </pre>
Chris@49 630 </ul>
Chris@49 631 <br>
Chris@49 632 <li>
Chris@49 633 See also:
Chris@49 634 <ul>
Chris@49 635 <li><a href="#attributes">matrix attributes</a></li>
Chris@49 636 <li><a href="#element_access">accessing elements</a></li>
Chris@49 637 <li><a href="#element_initialisation">initialising elements</a></li>
Chris@49 638 <li><a href="#operators">math &amp; relational operators</a></li>
Chris@49 639 <li><a href="#submat">submatrix views</a></li>
Chris@49 640 <li><a href="#save_load_mat">saving &amp; loading matrices</a></li>
Chris@49 641 <li><a href="#print">printing matrices</a></li>
Chris@49 642 <li><a href="#iterators_mat">STL-style element iterators</a></li>
Chris@49 643 <li><a href="#eval_member">.eval()</a></li>
Chris@49 644 <li><a href="#conv_to">conv_to()</a> (convert between matrix types)</li>
Chris@49 645 <li><a href="http://www.cplusplus.com/doc/tutorial/other_data_types/">explanation of <i>typedef</i></a> (cplusplus.com)
Chris@49 646 <li><a href="#Col">Col class</a></li>
Chris@49 647 <li><a href="#Row">Row class</a></li>
Chris@49 648 <li><a href="#Cube">Cube class</a></li>
Chris@49 649 <li><a href="#SpMat">SpMat class</a> (sparse matrix)</li>
Chris@49 650 <li><a href="#config_hpp">config.hpp</a></li>
Chris@49 651 </ul>
Chris@49 652 </li>
Chris@49 653 <br>
Chris@49 654 </ul>
Chris@49 655 <hr class="greyline">
Chris@49 656 <br>
Chris@49 657
Chris@49 658 <a name="Col"></a><b>Col&lt;</b><i>type</i><b>&gt;</b>
Chris@49 659 <br><b>colvec</b>
Chris@49 660 <br><b>vec</b>
Chris@49 661 <ul>
Chris@49 662 <li>
Chris@49 663 Classes for column vectors (matrices with one column)
Chris@49 664 </li>
Chris@49 665 <br>
Chris@49 666 <li>The <b>Col&lt;</b><i>type</i><b>&gt;</b> class is derived from the <b>Mat&lt;</b><i>type</i><b>&gt;</b> class
Chris@49 667 and inherits most of the member functions
Chris@49 668 </li>
Chris@49 669 <br>
Chris@49 670 <li>
Chris@49 671 For convenience the following typedefs have been defined:
Chris@49 672 <ul>
Chris@49 673 <table style="text-align: left;" border="0" cellpadding="2" cellspacing="2">
Chris@49 674 <tbody>
Chris@49 675 <tr>
Chris@49 676 <td style="vertical-align: top;">
Chris@49 677 vec, colvec
Chris@49 678 </td>
Chris@49 679 <td style="vertical-align: top;">
Chris@49 680 &nbsp;=&nbsp;
Chris@49 681 </td>
Chris@49 682 <td style="vertical-align: top;">
Chris@49 683 Col&lt;double&gt;
Chris@49 684 </td>
Chris@49 685 </tr>
Chris@49 686 <tr>
Chris@49 687 <td style="vertical-align: top;">
Chris@49 688 fvec, fcolvec
Chris@49 689 </td>
Chris@49 690 <td style="vertical-align: top;">
Chris@49 691 &nbsp;=&nbsp;
Chris@49 692 </td>
Chris@49 693 <td style="vertical-align: top;">
Chris@49 694 Col&lt;float&gt;
Chris@49 695 </td>
Chris@49 696 </tr>
Chris@49 697 <tr>
Chris@49 698 <td style="vertical-align: top;">
Chris@49 699 cx_vec, cx_colvec
Chris@49 700 </td>
Chris@49 701 <td style="vertical-align: top;">
Chris@49 702 &nbsp;=&nbsp;
Chris@49 703 </td>
Chris@49 704 <td style="vertical-align: top;">
Chris@49 705 Col&lt;<a href="#cx_float_double">cx_double</a>&gt;
Chris@49 706 </td>
Chris@49 707 </tr>
Chris@49 708 <tr>
Chris@49 709 <td style="vertical-align: top;">
Chris@49 710 cx_fvec, cx_fcolvec
Chris@49 711 </td>
Chris@49 712 <td style="vertical-align: top;">
Chris@49 713 &nbsp;=&nbsp;
Chris@49 714 </td>
Chris@49 715 <td style="vertical-align: top;">
Chris@49 716 Col&lt;<a href="#cx_float_double">cx_float</a>&gt;
Chris@49 717 </td>
Chris@49 718 </tr>
Chris@49 719 <tr>
Chris@49 720 <td style="vertical-align: top;">
Chris@49 721 uvec, ucolvec
Chris@49 722 </td>
Chris@49 723 <td style="vertical-align: top;">
Chris@49 724 &nbsp;=&nbsp;
Chris@49 725 </td>
Chris@49 726 <td style="vertical-align: top;">
Chris@49 727 Col&lt;<a href="#uword">uword</a>&gt;
Chris@49 728 </td>
Chris@49 729 </tr>
Chris@49 730 <tr>
Chris@49 731 <td style="vertical-align: top;">
Chris@49 732 ivec, icolvec
Chris@49 733 </td>
Chris@49 734 <td style="vertical-align: top;">
Chris@49 735 &nbsp;=&nbsp;
Chris@49 736 </td>
Chris@49 737 <td style="vertical-align: top;">
Chris@49 738 Col&lt;<a href="#uword">sword</a>&gt;
Chris@49 739 </td>
Chris@49 740 </tr>
Chris@49 741 </tbody>
Chris@49 742 </table>
Chris@49 743 </ul>
Chris@49 744 </li>
Chris@49 745 <br>
Chris@49 746 <li>
Chris@49 747 In this documentation, the <b><i>vec</i></b> and <b><i>colvec</i></b> types have the <b>same meaning</b> and are used <b>interchangeably</b>
Chris@49 748 </li>
Chris@49 749 <br>
Chris@49 750 <li>
Chris@49 751 In this documentation, the types <i>vec</i> or <i>colvec</i> are used for convenience; it is possible to use other types instead, eg.&nbsp;<i>fvec</i>, <i>fcolvec</i>
Chris@49 752 </li>
Chris@49 753 <br>
Chris@49 754 <li>
Chris@49 755 Functions which take <i>Mat</i> as input can generally also take <i>Col</i> as input.
Chris@49 756 Main exceptions are functions which require square matrices
Chris@49 757 </li>
Chris@49 758 <br>
Chris@49 759 <li>
Chris@49 760 Constructors
Chris@49 761 <ul>
Chris@49 762 <li>vec(n_elem=0)</li>
Chris@49 763 <li>vec(vec)</li>
Chris@49 764 <li>vec(mat) &nbsp; (a <i>std::logic_error</i> exception is thrown if the given matrix has more than one column)</li>
Chris@49 765 <li>vec(string) &nbsp; (elements separated by spaces)</li>
Chris@49 766 <li>vec(std::vector)</li>
Chris@49 767 <li>vec(initialiser_list) &nbsp; (C++11 only)</li>
Chris@49 768 </ul>
Chris@49 769 </li>
Chris@49 770 <br>
Chris@49 771 <a name="adv_constructors_col"></a>
Chris@49 772 <li>
Chris@49 773 Advanced constructors:
Chris@49 774 <br>
Chris@49 775 <br>
Chris@49 776 <ul>
Chris@49 777 <li>vec(aux_mem*, number_of_elements, copy_aux_mem = true, strict = true)
Chris@49 778 <br>
Chris@49 779 <br>
Chris@49 780 <ul>
Chris@49 781 Create a column vector using data from writeable auxiliary memory.
Chris@49 782 By default the vector allocates its own memory and copies data from the auxiliary memory (for safety).
Chris@49 783 However, if <i>copy_aux_mem</i> is set to <i>false</i>,
Chris@49 784 the vector will instead directly use the auxiliary memory (ie. no copying).
Chris@49 785 This is faster, but can be dangerous unless you know what you're doing!
Chris@49 786 <br>
Chris@49 787 <br>
Chris@49 788 The <i>strict</i> variable comes into effect only if <i>copy_aux_mem</i> is set to <i>false</i>
Chris@49 789 (ie. the vector is directly using auxiliary memory).
Chris@49 790 If <i>strict</i> is set to <i>true</i>,
Chris@49 791 the vector will be bound to the auxiliary memory for its lifetime;
Chris@49 792 the number of elements in the vector can't be changed (directly or indirectly).
Chris@49 793 If <i>strict</i> is set to <i>false</i>, the vector will not be bound to the auxiliary memory for its lifetime,
Chris@49 794 ie., the vector's size can be changed.
Chris@49 795 If the requested number of elements is different to the size of the auxiliary memory,
Chris@49 796 new memory will be allocated and the auxiliary memory will no longer be used.
Chris@49 797 </ul>
Chris@49 798 </li>
Chris@49 799 <br>
Chris@49 800 <li>vec(const aux_mem*, number_of_elements)
Chris@49 801 <br>
Chris@49 802 <br>
Chris@49 803 <ul>
Chris@49 804 Create a column vector by copying data from read-only auxiliary memory.
Chris@49 805 </ul>
Chris@49 806 </li>
Chris@49 807 <a name="adv_constructors_col_fixed"></a>
Chris@49 808 <br>
Chris@49 809 <li>vec::fixed&lt;number_of_elements&gt;
Chris@49 810 <br>
Chris@49 811 <br>
Chris@49 812 <ul>
Chris@49 813 Create a fixed size column vector, with the size specified via the template argument.
Chris@49 814 Memory for the vector is allocated at compile time.
Chris@49 815 This is generally faster than dynamic memory allocation, but the size of the vector can't be changed afterwards (directly or indirectly).
Chris@49 816 <br>
Chris@49 817 <br>
Chris@49 818 For convenience, there are several pre-defined typedefs for each vector type
Chris@49 819 (where the types are: <i>uvec</i>, <i>ivec</i>, <i>fvec</i>, <i>vec</i>, <i>cx_fvec</i>, <i>cx_vec</i> as well as the corresponding <i>colvec</i> versions).
Chris@49 820 The pre-defined typedefs specify vector sizes ranging from 2 to 9.
Chris@49 821 The typedefs were defined by simply appending a single digit form of the size to the vector type
Chris@49 822 -- for example, <i>vec3</i> is equivalent to <i>vec::fixed&lt;3&gt;</i>,
Chris@49 823 while <i>cx_vec4</i> is equivalent to <i>cx_vec::fixed&lt;4&gt;</i>.
Chris@49 824 </ul>
Chris@49 825 </li>
Chris@49 826 <br>
Chris@49 827 <li>vec::fixed&lt;number_of_elements&gt;(const aux_mem*)
Chris@49 828 <br>
Chris@49 829 <br>
Chris@49 830 <ul>
Chris@49 831 Create a fixed size column vector, with the size specified via the template argument,
Chris@49 832 and copying data from auxiliary memory.
Chris@49 833 </ul>
Chris@49 834 </li>
Chris@49 835 </ul>
Chris@49 836 </li>
Chris@49 837 <br>
Chris@49 838 <br>
Chris@49 839 <li>
Chris@49 840 Examples:
Chris@49 841 <ul>
Chris@49 842 <pre>
Chris@49 843 vec x(10);
Chris@49 844 vec y = zeros&lt;vec&gt;(10,1);
Chris@49 845
Chris@49 846 mat A = randu&lt;mat&gt;(10,10);
Chris@49 847 vec z = A.col(5); // extract a column vector
Chris@49 848 </pre>
Chris@49 849 </ul>
Chris@49 850 </li>
Chris@49 851 <br>
Chris@49 852 <li><b>Caveat:</b>
Chris@49 853 For mathematical correctness, scalars are treated as 1x1 matrices during initialisation.
Chris@49 854 As such, the code below <b>will not</b> generate a column vector with every element equal to 123.0:
Chris@49 855 <ul>
Chris@49 856 <pre>
Chris@49 857 vec a(5); a = 123.0;
Chris@49 858 </pre>
Chris@49 859 </ul>
Chris@49 860 Use the following code instead:
Chris@49 861 <ul>
Chris@49 862 <pre>
Chris@49 863 vec a(5); a.fill(123.0);
Chris@49 864 </pre>
Chris@49 865 </ul>
Chris@49 866 </li>
Chris@49 867 <br>
Chris@49 868 <li>See also:
Chris@49 869 <ul>
Chris@49 870 <li><a href="#Mat">Mat class</a></li>
Chris@49 871 <li><a href="#Row">Row class</a></li>
Chris@49 872 </ul>
Chris@49 873 </li>
Chris@49 874 <br>
Chris@49 875 </ul>
Chris@49 876 <hr class="greyline"><br>
Chris@49 877
Chris@49 878 <a name="Row"></a>
Chris@49 879 <b>Row&lt;</b><i>type</i><b>&gt;</b>
Chris@49 880 <br><b>rowvec</b>
Chris@49 881 <ul>
Chris@49 882 <li>
Chris@49 883 Classes for row vectors (matrices with one row)
Chris@49 884 </li>
Chris@49 885 <br>
Chris@49 886 <li>The template <b>Row&lt;</b><i>type</i><b>&gt;</b> class is derived from the <b>Mat&lt;</b><i>type</i><b>&gt;</b> class
Chris@49 887 and inherits most of the member functions
Chris@49 888 </li>
Chris@49 889 <br>
Chris@49 890 <li>
Chris@49 891 For convenience the following typedefs have been defined:
Chris@49 892 <ul>
Chris@49 893 <table style="text-align: left;" border="0" cellpadding="2" cellspacing="2">
Chris@49 894 <tbody>
Chris@49 895 <tr>
Chris@49 896 <td style="vertical-align: top;">
Chris@49 897 rowvec
Chris@49 898 </td>
Chris@49 899 <td style="vertical-align: top;">
Chris@49 900 &nbsp;=&nbsp;
Chris@49 901 </td>
Chris@49 902 <td style="vertical-align: top;">
Chris@49 903 Row&lt;double&gt;
Chris@49 904 </td>
Chris@49 905 </tr>
Chris@49 906 <tr>
Chris@49 907 <td style="vertical-align: top;">
Chris@49 908 frowvec
Chris@49 909 </td>
Chris@49 910 <td style="vertical-align: top;">
Chris@49 911 &nbsp;=&nbsp;
Chris@49 912 </td>
Chris@49 913 <td style="vertical-align: top;">
Chris@49 914 Row&lt;float&gt;
Chris@49 915 </td>
Chris@49 916 </tr>
Chris@49 917 <tr>
Chris@49 918 <td style="vertical-align: top;">
Chris@49 919 cx_rowvec
Chris@49 920 </td>
Chris@49 921 <td style="vertical-align: top;">
Chris@49 922 &nbsp;=&nbsp;
Chris@49 923 </td>
Chris@49 924 <td style="vertical-align: top;">
Chris@49 925 Row&lt;<a href="#cx_float_double">cx_double</a>&gt;
Chris@49 926 </td>
Chris@49 927 </tr>
Chris@49 928 <tr>
Chris@49 929 <td style="vertical-align: top;">
Chris@49 930 cx_frowvec
Chris@49 931 </td>
Chris@49 932 <td style="vertical-align: top;">
Chris@49 933 &nbsp;=&nbsp;
Chris@49 934 </td>
Chris@49 935 <td style="vertical-align: top;">
Chris@49 936 Row&lt;<a href="#cx_float_double">cx_float</a>&gt;
Chris@49 937 </td>
Chris@49 938 </tr>
Chris@49 939 <tr>
Chris@49 940 <td style="vertical-align: top;">
Chris@49 941 urowvec
Chris@49 942 </td>
Chris@49 943 <td style="vertical-align: top;">
Chris@49 944 &nbsp;=&nbsp;
Chris@49 945 </td>
Chris@49 946 <td style="vertical-align: top;">
Chris@49 947 Row&lt;<a href="#uword">uword</a>&gt;
Chris@49 948 </td>
Chris@49 949 </tr>
Chris@49 950 <tr>
Chris@49 951 <td style="vertical-align: top;">
Chris@49 952 irowvec
Chris@49 953 </td>
Chris@49 954 <td style="vertical-align: top;">
Chris@49 955 &nbsp;=&nbsp;
Chris@49 956 </td>
Chris@49 957 <td style="vertical-align: top;">
Chris@49 958 Row&lt;<a href="#uword">sword</a>&gt;
Chris@49 959 </td>
Chris@49 960 </tr>
Chris@49 961 </tbody>
Chris@49 962 </table>
Chris@49 963 </ul>
Chris@49 964 </li>
Chris@49 965 <br>
Chris@49 966 <li>
Chris@49 967 In this documentation, the <i>rowvec</i> type is used for convenience;
Chris@49 968 it is possible to use other types instead, eg. <i>frowvec</i>
Chris@49 969 </li>
Chris@49 970 <br>
Chris@49 971 <li>
Chris@49 972 Functions which take <i>Mat</i> as input can generally also take <i>Row</i> as input.
Chris@49 973 Main exceptions are functions which require square matrices
Chris@49 974 </li>
Chris@49 975 <br>
Chris@49 976 <li>
Chris@49 977 Constructors
Chris@49 978 <ul>
Chris@49 979 <li>rowvec(n_elem=0)</li>
Chris@49 980 <li>rowvec(rowvec)</li>
Chris@49 981 <li>rowvec(mat) &nbsp; (a <i>std::logic_error</i> exception is thrown if the given matrix has more than one row)</li>
Chris@49 982 <li>rowvec(string) &nbsp; (elements separated by spaces)</li>
Chris@49 983 <li>rowvec(std::vector)</li>
Chris@49 984 <li>rowvec(initialiser_list) &nbsp; (C++11 only)</li>
Chris@49 985 </ul>
Chris@49 986 </li>
Chris@49 987 <br>
Chris@49 988 <a name="adv_constructors_row"></a>
Chris@49 989 <li>
Chris@49 990 Advanced constructors:
Chris@49 991 <br>
Chris@49 992 <br>
Chris@49 993 <ul>
Chris@49 994 <li>rowvec(aux_mem*, number_of_elements, copy_aux_mem = true, strict = true)
Chris@49 995 <br>
Chris@49 996 <br>
Chris@49 997 <ul>
Chris@49 998 Create a row vector using data from writeable auxiliary memory.
Chris@49 999 By default the vector allocates its own memory and copies data from the auxiliary memory (for safety).
Chris@49 1000 However, if <i>copy_aux_mem</i> is set to <i>false</i>,
Chris@49 1001 the vector will instead directly use the auxiliary memory (ie. no copying).
Chris@49 1002 This is faster, but can be dangerous unless you know what you're doing!
Chris@49 1003 <br>
Chris@49 1004 <br>
Chris@49 1005 The <i>strict</i> variable comes into effect only if <i>copy_aux_mem</i> is set to <i>false</i>
Chris@49 1006 (ie. the vector is directly using auxiliary memory).
Chris@49 1007 If <i>strict</i> is set to <i>true</i>,
Chris@49 1008 the vector will be bound to the auxiliary memory for its lifetime;
Chris@49 1009 the number of elements in the vector can't be changed (directly or indirectly).
Chris@49 1010 If <i>strict</i> is set to <i>false</i>, the vector will not be bound to the auxiliary memory for its lifetime,
Chris@49 1011 ie., the vector's size can be changed.
Chris@49 1012 If the requested number of elements is different to the size of the auxiliary memory,
Chris@49 1013 new memory will be allocated and the auxiliary memory will no longer be used.
Chris@49 1014 </ul>
Chris@49 1015 </li>
Chris@49 1016 <br>
Chris@49 1017 <li>rowvec(const aux_mem*, number_of_elements)
Chris@49 1018 <br>
Chris@49 1019 <br>
Chris@49 1020 <ul>
Chris@49 1021 Create a row vector by copying data from read-only auxiliary memory.
Chris@49 1022 </ul>
Chris@49 1023 </li>
Chris@49 1024 <br>
Chris@49 1025 <li>rowvec::fixed&lt;number_of_elements&gt;
Chris@49 1026 <br>
Chris@49 1027 <br>
Chris@49 1028 <ul>
Chris@49 1029 Create a fixed size row vector, with the size specified via the template argument.
Chris@49 1030 Memory for the vector is allocated at compile time.
Chris@49 1031 This is generally faster than dynamic memory allocation, but the size of the vector can't be changed afterwards (directly or indirectly).
Chris@49 1032 <br>
Chris@49 1033 <br>
Chris@49 1034 For convenience, there are several pre-defined typedefs for each vector type
Chris@49 1035 (where the types are: <i>urowvec</i>, <i>irowvec</i>, <i>frowvec</i>, <i>rowvec</i>, <i>cx_frowvec</i>, <i>cx_rowvec</i>).
Chris@49 1036 The pre-defined typedefs specify vector sizes ranging from 2 to 9.
Chris@49 1037 The typedefs were defined by simply appending a single digit form of the size to the vector type
Chris@49 1038 -- for example, <i>rowvec3</i> is equivalent to <i>rowvec::fixed&lt;3&gt;</i>,
Chris@49 1039 while <i>cx_rowvec4</i> is equivalent to <i>cx_rowvec::fixed&lt;4&gt;</i>.
Chris@49 1040 </ul>
Chris@49 1041 </li>
Chris@49 1042 <br>
Chris@49 1043 <li>rowvec::fixed&lt;number_of_elements&gt;(const aux_mem*)
Chris@49 1044 <br>
Chris@49 1045 <br>
Chris@49 1046 <ul>
Chris@49 1047 Create a fixed size row vector, with the size specified via the template argument,
Chris@49 1048 and copying data from auxiliary memory.
Chris@49 1049 </ul>
Chris@49 1050 </li>
Chris@49 1051 </ul>
Chris@49 1052 </li>
Chris@49 1053 <br>
Chris@49 1054 <br>
Chris@49 1055 <li>
Chris@49 1056 Examples:
Chris@49 1057 <ul>
Chris@49 1058 <pre>
Chris@49 1059 rowvec x(10);
Chris@49 1060 rowvec y = zeros&lt;mat&gt;(1,10);
Chris@49 1061
Chris@49 1062 mat A = randu&lt;mat&gt;(10,10);
Chris@49 1063 rowvec z = A.row(5); // extract a row vector
Chris@49 1064 </pre>
Chris@49 1065 </ul>
Chris@49 1066 </li>
Chris@49 1067 <br>
Chris@49 1068 <li>
Chris@49 1069 <b>Caveat:</b>
Chris@49 1070 For mathematical correctness, scalars are treated as 1x1 matrices during initialisation.
Chris@49 1071 As such, the code below <b>will not</b> generate a row vector with every element equal to 123.0:
Chris@49 1072 <ul>
Chris@49 1073 <pre>
Chris@49 1074 rowvec r(5); r = 123.0;
Chris@49 1075 </pre>
Chris@49 1076 </ul>
Chris@49 1077 Use the following code instead:
Chris@49 1078 <ul>
Chris@49 1079 <pre>
Chris@49 1080 rowvec r(5); r.fill(123.0);
Chris@49 1081 </pre>
Chris@49 1082 </ul>
Chris@49 1083 <br>
Chris@49 1084 <li>See also:
Chris@49 1085 <ul>
Chris@49 1086 <li><a href="#Mat">Mat class</a></li>
Chris@49 1087 <li><a href="#Col">Col class</a></li>
Chris@49 1088 </ul>
Chris@49 1089 </li>
Chris@49 1090 <br>
Chris@49 1091 </ul>
Chris@49 1092 <hr class="greyline">
Chris@49 1093 <br>
Chris@49 1094
Chris@49 1095 <a name="Cube"></a>
Chris@49 1096 <b>Cube&lt;</b><i>type</i><b>&gt;</b>
Chris@49 1097 <br><b>cube</b>
Chris@49 1098 <br><b>cx_cube</b>
Chris@49 1099 <ul>
Chris@49 1100 <li>
Chris@49 1101 Classes for cubes, also known as "3D matrices" or 3rd order tensors
Chris@49 1102 </li>
Chris@49 1103 <br>
Chris@49 1104 <li>
Chris@49 1105 The cube class is <b>Cube&lt;</b><i>type</i><b>&gt;</b>, where <i>type</i> can be one of:
Chris@49 1106 <i>char</i>, <i>int</i>, <i>float</i>, <i>double</i>, <i>std::complex&lt;double&gt;</i>, etc
Chris@49 1107 </li>
Chris@49 1108 <br>
Chris@49 1109 <li>
Chris@49 1110 For convenience the following typedefs have been defined:
Chris@49 1111 <ul>
Chris@49 1112 <table style="text-align: left;" border="0" cellpadding="2" cellspacing="2">
Chris@49 1113 <tbody>
Chris@49 1114 <tr>
Chris@49 1115 <td style="vertical-align: top;">
Chris@49 1116 cube
Chris@49 1117 </td>
Chris@49 1118 <td style="vertical-align: top;">
Chris@49 1119 &nbsp;=&nbsp;
Chris@49 1120 </td>
Chris@49 1121 <td style="vertical-align: top;">
Chris@49 1122 Cube&lt;double&gt;
Chris@49 1123 </td>
Chris@49 1124 </tr>
Chris@49 1125 <tr>
Chris@49 1126 <td style="vertical-align: top;">
Chris@49 1127 fcube
Chris@49 1128 </td>
Chris@49 1129 <td style="vertical-align: top;">
Chris@49 1130 &nbsp;=&nbsp;
Chris@49 1131 </td>
Chris@49 1132 <td style="vertical-align: top;">
Chris@49 1133 Cube&lt;float&gt;
Chris@49 1134 </td>
Chris@49 1135 </tr>
Chris@49 1136 <tr>
Chris@49 1137 <td style="vertical-align: top;">
Chris@49 1138 cx_cube
Chris@49 1139 </td>
Chris@49 1140 <td style="vertical-align: top;">
Chris@49 1141 &nbsp;=&nbsp;
Chris@49 1142 </td>
Chris@49 1143 <td style="vertical-align: top;">
Chris@49 1144 Cube&lt;<a href="#cx_float_double">cx_double</a>&gt;
Chris@49 1145 </td>
Chris@49 1146 </tr>
Chris@49 1147 <tr>
Chris@49 1148 <td style="vertical-align: top;">
Chris@49 1149 cx_fcube
Chris@49 1150 </td>
Chris@49 1151 <td style="vertical-align: top;">
Chris@49 1152 &nbsp;=&nbsp;
Chris@49 1153 </td>
Chris@49 1154 <td style="vertical-align: top;">
Chris@49 1155 Cube&lt;<a href="#cx_float_double">cx_float</a>&gt;
Chris@49 1156 </td>
Chris@49 1157 </tr>
Chris@49 1158 <tr>
Chris@49 1159 <td style="vertical-align: top;">
Chris@49 1160 ucube
Chris@49 1161 </td>
Chris@49 1162 <td style="vertical-align: top;">
Chris@49 1163 &nbsp;=&nbsp;
Chris@49 1164 </td>
Chris@49 1165 <td style="vertical-align: top;">
Chris@49 1166 Cube&lt;<a href="#uword">uword</a>&gt;
Chris@49 1167 </td>
Chris@49 1168 </tr>
Chris@49 1169 <tr>
Chris@49 1170 <td style="vertical-align: top;">
Chris@49 1171 icube
Chris@49 1172 </td>
Chris@49 1173 <td style="vertical-align: top;">
Chris@49 1174 &nbsp;=&nbsp;
Chris@49 1175 </td>
Chris@49 1176 <td style="vertical-align: top;">
Chris@49 1177 Cube&lt;<a href="#uword">sword</a>&gt;
Chris@49 1178 </td>
Chris@49 1179 </tr>
Chris@49 1180 </tbody>
Chris@49 1181 </table>
Chris@49 1182 </ul>
Chris@49 1183 </li>
Chris@49 1184 <br>
Chris@49 1185 <li>
Chris@49 1186 In this documentation the <i>cube</i> type is used for convenience;
Chris@49 1187 it is possible to use other types instead, eg. <i>fcube</i>
Chris@49 1188 </li>
Chris@49 1189 <br>
Chris@49 1190 <li>
Chris@49 1191 Cube data is stored as a set of slices (matrices) stored contiguously within memory.
Chris@49 1192 Within each slice, elements are stored with column-major ordering (ie. column by column)
Chris@49 1193 </li>
Chris@49 1194 <br>
Chris@49 1195 <li>
Chris@49 1196 Each slice can be interpreted as a matrix, hence functions which take <i>Mat</i> as input can generally also take cube slices as input
Chris@49 1197 </li>
Chris@49 1198 <br>
Chris@49 1199 <a name="constructors_cube"></a>
Chris@49 1200 <li>
Chris@49 1201 Constructors:
Chris@49 1202 <ul>
Chris@49 1203 cube()
Chris@49 1204 <br>cube(cube)
Chris@49 1205 <br>cube(n_rows, n_cols, n_slices)
Chris@49 1206 <br>cx_cube(cube, cube) (for constructing a complex cube out of two real cubes)
Chris@49 1207 </ul>
Chris@49 1208 </li>
Chris@49 1209 <br>
Chris@49 1210
Chris@49 1211 <a name="adv_constructors_cube"></a>
Chris@49 1212 <li>
Chris@49 1213 Advanced constructors:
Chris@49 1214 <br>
Chris@49 1215 <br>
Chris@49 1216 <ul>
Chris@49 1217 <li>
Chris@49 1218 cube::fixed&lt;n_rows, n_cols, n_slices&gt;
Chris@49 1219 <br>
Chris@49 1220 <br>
Chris@49 1221 <ul>
Chris@49 1222 Create a fixed size cube, with the size specified via template arguments.
Chris@49 1223 Memory for the cube is allocated at compile time.
Chris@49 1224 This is generally faster than dynamic memory allocation, but the size of the cube can't be changed afterwards (directly or indirectly).
Chris@49 1225 </ul>
Chris@49 1226 </li>
Chris@49 1227 <br>
Chris@49 1228 <li>cube(aux_mem*, n_rows, n_cols, n_slices, copy_aux_mem = true, strict = true)
Chris@49 1229 <br>
Chris@49 1230 <br>
Chris@49 1231 <ul>
Chris@49 1232 Create a cube using data from writeable auxiliary memory.
Chris@49 1233 By default the cube allocates its own memory and copies data from the auxiliary memory (for safety).
Chris@49 1234 However, if <i>copy_aux_mem</i> is set to <i>false</i>,
Chris@49 1235 the cube will instead directly use the auxiliary memory (ie. no copying).
Chris@49 1236 This is faster, but can be dangerous unless you know what you're doing!
Chris@49 1237 <br>
Chris@49 1238 <br>
Chris@49 1239 The <i>strict</i> variable comes into effect only if <i>copy_aux_mem</i> is set to <i>false</i>
Chris@49 1240 (ie. the cube is directly using auxiliary memory).
Chris@49 1241 If <i>strict</i> is set to <i>true</i>,
Chris@49 1242 the cube will be bound to the auxiliary memory for its lifetime;
Chris@49 1243 the number of elements in the cube can't be changed (directly or indirectly).
Chris@49 1244 If <i>strict</i> is set to <i>false</i>, the cube will not be bound to the auxiliary memory for its lifetime,
Chris@49 1245 ie., the size of the cube can be changed.
Chris@49 1246 If the requested number of elements is different to the size of the auxiliary memory,
Chris@49 1247 new memory will be allocated and the auxiliary memory will no longer be used.
Chris@49 1248 </ul>
Chris@49 1249 </li>
Chris@49 1250 <br>
Chris@49 1251 <li>cube(const aux_mem*, n_rows, n_cols, n_slices)
Chris@49 1252 <br>
Chris@49 1253 <br>
Chris@49 1254 <ul>
Chris@49 1255 Create a cube by copying data from read-only auxiliary memory.
Chris@49 1256 </ul>
Chris@49 1257 </li>
Chris@49 1258 </ul>
Chris@49 1259 </li>
Chris@49 1260 <br>
Chris@49 1261 <br>
Chris@49 1262 <li>
Chris@49 1263 Examples:
Chris@49 1264 <ul>
Chris@49 1265 <pre>
Chris@49 1266 cube x(1,2,3);
Chris@49 1267 cube y = randu&lt;cube&gt;(4,5,6);
Chris@49 1268
Chris@49 1269 mat A = y.slice(1); // extract a slice from the cube
Chris@49 1270 // (each slice is a matrix)
Chris@49 1271
Chris@49 1272 mat B = randu&lt;mat&gt;(4,5);
Chris@49 1273 y.slice(2) = B; // set a slice in the cube
Chris@49 1274
Chris@49 1275 cube q = y + y; // cube addition
Chris@49 1276 cube r = y % y; // element-wise cube multiplication
Chris@49 1277
Chris@49 1278 cube::fixed&lt;4,5,6&gt; f;
Chris@49 1279 f.ones();
Chris@49 1280 </pre>
Chris@49 1281 </ul>
Chris@49 1282 </li>
Chris@49 1283 <br>
Chris@49 1284 <li>
Chris@49 1285 <b>Caveats</b>
Chris@49 1286 <br>
Chris@49 1287 <br>
Chris@49 1288 <ul>
Chris@49 1289 <li>
Chris@49 1290 The size of individual slices can't be changed.
Chris@49 1291 For example, the following <b>will not</b> work:
Chris@49 1292 <ul>
Chris@49 1293 <pre>
Chris@49 1294 cube c(5,6,7);
Chris@49 1295 c.slice(0) = randu&lt;mat&gt;(10,20); // wrong size
Chris@49 1296 </pre>
Chris@49 1297 </ul>
Chris@49 1298 </li>
Chris@49 1299 <li>
Chris@49 1300 For mathematical correctness, scalars are treated as 1x1x1 cubes during initialisation.
Chris@49 1301 As such, the code below <b>will not</b> generate a cube with every element equal to 123.0:
Chris@49 1302 <ul>
Chris@49 1303 <pre>
Chris@49 1304 cube c(5,6,7); c = 123.0;
Chris@49 1305 </pre>
Chris@49 1306 </ul>
Chris@49 1307 Use the following code instead:
Chris@49 1308 <ul>
Chris@49 1309 <pre>
Chris@49 1310 cube c(5,6,7); c.fill(123.0);
Chris@49 1311 </pre>
Chris@49 1312 </ul>
Chris@49 1313 <br>
Chris@49 1314 </ul>
Chris@49 1315 <li>
Chris@49 1316 See also:
Chris@49 1317 <ul>
Chris@49 1318 <li><a href="#attributes">cube attributes</a></li>
Chris@49 1319 <li><a href="#element_access">accessing elements</a></li>
Chris@49 1320 <li><a href="#operators">math &amp; relational operators</a></li>
Chris@49 1321 <li><a href="#subcube">subcube views and slices</a></li>
Chris@49 1322 <li><a href="#save_load_mat">saving &amp; loading cubes</a></li>
Chris@49 1323 <li><a href="#iterators_cube">STL-style element iterators</a></li>
Chris@49 1324 <li><a href="#Mat">Mat class</a></li>
Chris@49 1325 </ul>
Chris@49 1326 </li>
Chris@49 1327 <br>
Chris@49 1328 </ul>
Chris@49 1329 <hr class="greyline">
Chris@49 1330 <br>
Chris@49 1331
Chris@49 1332 <a name="field"></a>
Chris@49 1333 <b>field&lt;</b><i>object type</i><b>&gt;</b>
Chris@49 1334 <ul>
Chris@49 1335 <li>
Chris@49 1336 Class for one and two dimensional fields of arbitrary objects
Chris@49 1337 </li>
Chris@49 1338 <br>
Chris@49 1339 <li>
Chris@49 1340 Constructors (where <i>object type</i> is another class, eg. <i>std::string</i>, <i>mat</i>, <i>vec</i>, <i>rowvec</i>, etc):
Chris@49 1341 <ul>
Chris@49 1342 field&lt;<i>object type</i>&gt;(n_elem=0)
Chris@49 1343 <br>field&lt;<i>object type</i>&gt;(n_rows, n_cols)
Chris@49 1344 <br>field&lt;<i>object type</i>&gt;(field&lt;<i>object type</i>&gt;)
Chris@49 1345 </ul>
Chris@49 1346 </li>
Chris@49 1347 <br>
Chris@49 1348 <li>
Chris@49 1349 Examples:
Chris@49 1350 <ul>
Chris@49 1351 <pre>
Chris@49 1352 // create a field of strings
Chris@49 1353 field&lt;std::string&gt; S(3,2);
Chris@49 1354
Chris@49 1355 S(0,0) = "hello";
Chris@49 1356 S(1,0) = "there";
Chris@49 1357
Chris@49 1358 // string fields can be saved as plain text files
Chris@49 1359 S.save("string_field");
Chris@49 1360
Chris@49 1361 // create a vec field with 3 rows and 2 columns
Chris@49 1362 field&lt;vec&gt; F(3,2);
Chris@49 1363
Chris@49 1364 // access components of the field
Chris@49 1365 F(0,0) = vec(5);
Chris@49 1366 F(1,1) = randu&lt;vec&gt;(6);
Chris@49 1367 F(2,0).set_size(7);
Chris@49 1368
Chris@49 1369 // access element 1 of the vec stored at 2,0
Chris@49 1370 double x = F(2,0)(1);
Chris@49 1371
Chris@49 1372 // copy rows
Chris@49 1373 F.row(0) = F.row(2);
Chris@49 1374
Chris@49 1375 // extract a row of vecs from F
Chris@49 1376 field&lt;vec&gt; G = F.row(1);
Chris@49 1377
Chris@49 1378 // print the field to the standard output
Chris@49 1379 G.print("G =");
Chris@49 1380
Chris@49 1381 // save the field to a binary file
Chris@49 1382 G.save("vec_field");
Chris@49 1383 </pre>
Chris@49 1384 </ul>
Chris@49 1385 </li>
Chris@49 1386 <br>
Chris@49 1387 <li>See also:
Chris@49 1388 <ul>
Chris@49 1389 <li><a href="#attributes">field attributes</a></li>
Chris@49 1390 <li><a href="#subfield">subfield views</a></li>
Chris@49 1391 <li><a href="#save_load_field">saving/loading fields</a></li>
Chris@49 1392 <li><a href="http://cplusplus.com/reference/string/string/">string class in the standard C++ library</a> (cplusplus.com)</li>
Chris@49 1393 </ul>
Chris@49 1394 </li>
Chris@49 1395 <br>
Chris@49 1396 </ul>
Chris@49 1397 <hr class="greyline">
Chris@49 1398 <br>
Chris@49 1399
Chris@49 1400
Chris@49 1401 <a name="SpMat"></a><b>SpMat&lt;</b><i>type</i><b>&gt;</b>
Chris@49 1402 <br><b>sp_mat</b>
Chris@49 1403 <br><b>sp_cx_mat</b>
Chris@49 1404 <ul>
Chris@49 1405 <li>
Chris@49 1406 The root sparse matrix class is <b>SpMat&lt;</b><i>type</i><b>&gt;</b>, where <i>type</i> can be one of:
Chris@49 1407 <i>char</i>, <i>int</i>, <i>float</i>, <i>double</i>, <i>std::complex&lt;double&gt;</i>, etc.
Chris@49 1408 </li>
Chris@49 1409 <br>
Chris@49 1410 <li>
Chris@49 1411 For convenience the following typedefs have been defined:
Chris@49 1412 <ul>
Chris@49 1413 <table style="text-align: left;" border="0" cellpadding="2" cellspacing="2">
Chris@49 1414 <tbody>
Chris@49 1415 <tr>
Chris@49 1416 <td style="vertical-align: top;">
Chris@49 1417 sp_mat
Chris@49 1418 </td>
Chris@49 1419 <td style="vertical-align: top;">
Chris@49 1420 &nbsp;=&nbsp;
Chris@49 1421 </td>
Chris@49 1422 <td style="vertical-align: top;">
Chris@49 1423 SpMat&lt;double&gt;
Chris@49 1424 </td>
Chris@49 1425 </tr>
Chris@49 1426 <tr>
Chris@49 1427 <td style="vertical-align: top;">
Chris@49 1428 sp_fmat
Chris@49 1429 </td>
Chris@49 1430 <td style="vertical-align: top;">
Chris@49 1431 &nbsp;=&nbsp;
Chris@49 1432 </td>
Chris@49 1433 <td style="vertical-align: top;">
Chris@49 1434 SpMat&lt;float&gt;
Chris@49 1435 </td>
Chris@49 1436 </tr>
Chris@49 1437 <tr>
Chris@49 1438 <td style="vertical-align: top;">
Chris@49 1439 sp_cx_mat
Chris@49 1440 </td>
Chris@49 1441 <td style="vertical-align: top;">
Chris@49 1442 &nbsp;=&nbsp;
Chris@49 1443 </td>
Chris@49 1444 <td style="vertical-align: top;">
Chris@49 1445 SpMat&lt;<a href="#cx_float_double">cx_double</a>&gt;
Chris@49 1446 </td>
Chris@49 1447 </tr>
Chris@49 1448 <tr>
Chris@49 1449 <td style="vertical-align: top;">
Chris@49 1450 sp_cx_fmat
Chris@49 1451 </td>
Chris@49 1452 <td style="vertical-align: top;">
Chris@49 1453 &nbsp;=&nbsp;
Chris@49 1454 </td>
Chris@49 1455 <td style="vertical-align: top;">
Chris@49 1456 SpMat&lt;<a href="#cx_float_double">cx_float</a>&gt;
Chris@49 1457 </td>
Chris@49 1458 </tr>
Chris@49 1459 <tr>
Chris@49 1460 <td style="vertical-align: top;">
Chris@49 1461 sp_umat
Chris@49 1462 </td>
Chris@49 1463 <td style="vertical-align: top;">
Chris@49 1464 &nbsp;=&nbsp;
Chris@49 1465 </td>
Chris@49 1466 <td style="vertical-align: top;">
Chris@49 1467 SpMat&lt;<a href="#uword">uword</a>&gt;
Chris@49 1468 </td>
Chris@49 1469 </tr>
Chris@49 1470 <tr>
Chris@49 1471 <td style="vertical-align: top;">
Chris@49 1472 sp_imat
Chris@49 1473 </td>
Chris@49 1474 <td style="vertical-align: top;">
Chris@49 1475 &nbsp;=&nbsp;
Chris@49 1476 </td>
Chris@49 1477 <td style="vertical-align: top;">
Chris@49 1478 SpMat&lt;<a href="#uword">sword</a>&gt;
Chris@49 1479 </td>
Chris@49 1480 </tr>
Chris@49 1481 </tbody>
Chris@49 1482 </table>
Chris@49 1483 </ul>
Chris@49 1484 </li>
Chris@49 1485 <br>
Chris@49 1486 <li>
Chris@49 1487 In this documentation the <i>sp_mat</i> type is used for convenience;
Chris@49 1488 it is possible to use other types instead, eg. <i>sp_fmat</i>
Chris@49 1489 </li>
Chris@49 1490 <br>
Chris@49 1491 <a name="constructors_sp_mat"></a>
Chris@49 1492 <li>
Chris@49 1493 Constructors:
Chris@49 1494 <ul>
Chris@49 1495 <li>sp_mat()</li>
Chris@49 1496 <li>sp_mat(n_rows, n_cols)</li>
Chris@49 1497 <li>sp_mat(sp_mat)</li>
Chris@49 1498 <li>sp_mat(string)</li>
Chris@49 1499 <li>sp_cx_mat(sp_mat,sp_mat) &nbsp; (for constructing a complex matrix out of two real matrices)</li>
Chris@49 1500 </ul>
Chris@49 1501 <br>
Chris@49 1502 <li>
Chris@49 1503 <a name="batch_constructors_sp_mat"></a>
Chris@49 1504 Batch insertion constructors:
Chris@49 1505 <ul>
Chris@49 1506 <li>sp_mat(locations, values, n_rows, n_cols, sort_locations = true)</li>
Chris@49 1507 <li>sp_mat(locations, values, sort_locations = true)</li>
Chris@49 1508 </ul>
Chris@49 1509 <br>
Chris@49 1510 <li>
Chris@49 1511 Elements are stored in the <i>compressed sparse column</i> (CSC) format
Chris@49 1512 </li>
Chris@49 1513 <br>
Chris@49 1514 <li>
Chris@49 1515 All elements are treated as zero by default
Chris@49 1516 </li>
Chris@49 1517 <br>
Chris@49 1518 <li>
Chris@49 1519 This class behaves in a similar manner to the <a href="#Mat">Mat</a> class,
Chris@49 1520 however, member functions which set all elements to non-zero values (and hence do not make sense for sparse matrices) have been deliberately omitted;
Chris@49 1521 examples of omitted functions: <a href="#fill">.fill()</a>, <a href="#ones_member">.ones()</a>, +=&nbsp;scalar, etc.
Chris@49 1522 </li>
Chris@49 1523 <br>
Chris@49 1524
Chris@49 1525 <li>Batch insertion of values:
Chris@49 1526 <ul>
Chris@49 1527 <li>
Chris@49 1528 Using batch insertion constructors is generally much faster than consecutively inserting values using <a href="#element_access">element access operators</a>
Chris@49 1529 </li>
Chris@49 1530 <br>
Chris@49 1531 <li>
Chris@49 1532 <i>locations</i> is a dense matrix of type <i>umat</i>, with a size of <i>2</i>&nbsp;x&nbsp;<i>N</i>, where <i>N</i> is the number of values to be inserted.
Chris@49 1533 The row and column of the <i>i</i>-th element are specified as <i>locations(0,i)</i> and <i>locations(1,i)</i>, respectively.
Chris@49 1534 </li>
Chris@49 1535 <br>
Chris@49 1536 <li>
Chris@49 1537 <i>values</i> is a dense column vector containing the values to be inserted.
Chris@49 1538 It must have the same element type as the sparse matrix.
Chris@49 1539 The value in <i>values[i]</i> will be inserted at the location specified by the <i>i</i>-th column of the <i>locations</i> matrix.
Chris@49 1540 </li>
Chris@49 1541 <br>
Chris@49 1542 <li>
Chris@49 1543 The size of the constructed matrix is either manually specified via <i>n_rows</i> and <i>n_cols</i>,
Chris@49 1544 or automatically determined from the maximal locations in the <i>locations</i> matrix.
Chris@49 1545 </li>
Chris@49 1546 <br>
Chris@49 1547 <li>
Chris@49 1548 If <i>sort_locations</i> is set to <i>false</i>, the <i>locations</i> matrix is assumed to contain locations that are already sorted according to column-major ordering.
Chris@49 1549 </li>
Chris@49 1550 </ul>
Chris@49 1551 </li>
Chris@49 1552 <br>
Chris@49 1553
Chris@49 1554 <li>
Chris@49 1555 <b>Caveat:</b>
Chris@49 1556 support for sparse matrices in this version is <b>preliminary</b>;
Chris@49 1557 it is not yet fully optimised, and sparse matrix decompositions/factorisations are not yet implemented.
Chris@49 1558 The following subset of operations currently works with sparse matrices:
Chris@49 1559 <ul>
Chris@49 1560 <li>element access</li>
Chris@49 1561 <li>fundamental arithmetic operations (such as addition and multiplication)</li>
Chris@49 1562 <li>submatrix views</li>
Chris@49 1563 <li>saving and loading (in <i>arma_binary</i> format)</li>
Chris@49 1564 <li>
Chris@49 1565 <a href="#abs">abs()</a>,
Chris@49 1566 <a href="#accu">accu()</a>,
Chris@49 1567 <a href="#as_scalar">as_scalar()</a>,
Chris@49 1568 <a href="#dot">dot()</a>,
Chris@49 1569 <a href="#stats_fns">mean()</a>,
Chris@49 1570 <a href="#min_and_max">min()</a>,
Chris@49 1571 <a href="#min_and_max">max()</a>,
Chris@49 1572 <a href="#norm">norm()</a>,
Chris@49 1573 <a href="#print">print()</a>,
Chris@49 1574 <a href="#speye">speye()</a>,
Chris@49 1575 <a href="#sprandu_sprandn">sprandu()/sprandn()</a>,
Chris@49 1576 <a href="#misc_fns">square()</a>,
Chris@49 1577 <a href="#misc_fns">sqrt()</a>,
Chris@49 1578 <a href="#sum">sum()</a>,
Chris@49 1579 <a href="#trace">trace()</a>,
Chris@49 1580 <a href="#trans">trans()</a>,
Chris@49 1581 <a href="#stats_fns">var()</a>
Chris@49 1582 </li>
Chris@49 1583 </ul>
Chris@49 1584 </li>
Chris@49 1585 <br>
Chris@49 1586
Chris@49 1587 <li>
Chris@49 1588 Examples:
Chris@49 1589 <ul>
Chris@49 1590 <pre>
Chris@49 1591 sp_mat A(5,6);
Chris@49 1592 sp_mat B(6,5);
Chris@49 1593
Chris@49 1594 A(0,0) = 1;
Chris@49 1595 A(1,0) = 2;
Chris@49 1596
Chris@49 1597 B(0,0) = 3;
Chris@49 1598 B(0,1) = 4;
Chris@49 1599
Chris@49 1600 sp_mat C = 2*B;
Chris@49 1601
Chris@49 1602 sp_mat D = A*C;
Chris@49 1603
Chris@49 1604
Chris@49 1605 // batch insertion of two values at (5, 6) and (9, 9)
Chris@49 1606 umat locations;
Chris@49 1607 locations &lt;&lt; 5 &lt;&lt; 9 &lt;&lt; endr
Chris@49 1608 &lt;&lt; 6 &lt;&lt; 9 &lt;&lt; endr;
Chris@49 1609
Chris@49 1610 vec values;
Chris@49 1611 values &lt;&lt; 1.5 &lt;&lt; 3.2 &lt;&lt; endr;
Chris@49 1612
Chris@49 1613 sp_mat X(locations, values);
Chris@49 1614 </pre>
Chris@49 1615 </ul>
Chris@49 1616 </li>
Chris@49 1617 <br>
Chris@49 1618 <li>
Chris@49 1619 See also:
Chris@49 1620 <ul>
Chris@49 1621 <li><a href="#element_access">accessing elements</a></li>
Chris@49 1622 <li><a href="#print">printing matrices</a></li>
Chris@49 1623 <!--
Chris@49 1624 <li><a href="#SpCol">SpCol class</a> (TODO: add to documentation)</li>
Chris@49 1625 <li><a href="#SpRow">SpRow class</a> (TODO: add to documentation)</li>
Chris@49 1626 -->
Chris@49 1627 <li><a href="http://en.wikipedia.org/wiki/Sparse_matrix">Sparse Matrix in Wikipedia</a></li>
Chris@49 1628 <li><a href="#Mat">Mat class</a> (dense matrix)</li>
Chris@49 1629 </ul>
Chris@49 1630 </li>
Chris@49 1631 <br>
Chris@49 1632 </ul>
Chris@49 1633 <hr class="greyline">
Chris@49 1634 <hr class="greyline">
Chris@49 1635 <br>
Chris@49 1636 <br>
Chris@49 1637 <font size=+1><b>Member Functions &amp; Variables</b></font>
Chris@49 1638 <br>
Chris@49 1639 <br>
Chris@49 1640 <hr class="greyline">
Chris@49 1641 <br>
Chris@49 1642
Chris@49 1643 <a name="attributes"></a>
Chris@49 1644
Chris@49 1645 <b>attributes</b>
Chris@49 1646 <ul>
Chris@49 1647 <table style="text-align: left;" border="0" cellpadding="0" cellspacing="0">
Chris@49 1648 <tbody>
Chris@49 1649 <tr>
Chris@49 1650 <td>
Chris@49 1651 <b>.n_rows</b>
Chris@49 1652 </td>
Chris@49 1653 <td>&nbsp;&nbsp;</td>
Chris@49 1654 <td>
Chris@49 1655 (number of rows)
Chris@49 1656 </td>
Chris@49 1657 </tr>
Chris@49 1658 <tr>
Chris@49 1659 <td>
Chris@49 1660 <b>.n_cols</b>
Chris@49 1661 </td>
Chris@49 1662 <td>&nbsp;&nbsp;</td>
Chris@49 1663 <td>
Chris@49 1664 (number of columns)
Chris@49 1665 </td>
Chris@49 1666 </tr>
Chris@49 1667 <tr>
Chris@49 1668 <td>
Chris@49 1669 <b>.n_elem</b>
Chris@49 1670 </td>
Chris@49 1671 <td>&nbsp;&nbsp;</td>
Chris@49 1672 <td>
Chris@49 1673 (total number of elements)
Chris@49 1674 </td>
Chris@49 1675 </tr>
Chris@49 1676 <tr>
Chris@49 1677 <td>
Chris@49 1678 <b>.n_slices</b>
Chris@49 1679 </td>
Chris@49 1680 <td>&nbsp;&nbsp;</td>
Chris@49 1681 <td>
Chris@49 1682 (number of slices)
Chris@49 1683 </td>
Chris@49 1684 </tr>
Chris@49 1685 <tr>
Chris@49 1686 <td>
Chris@49 1687 <b>.n_nonzero</b>
Chris@49 1688 </td>
Chris@49 1689 <td>&nbsp;&nbsp;</td>
Chris@49 1690 <td>
Chris@49 1691 (number of nonzero elements)
Chris@49 1692 </td>
Chris@49 1693 </tr>
Chris@49 1694 </tbody>
Chris@49 1695 </table>
Chris@49 1696 </ul>
Chris@49 1697 <br>
Chris@49 1698 <ul>
Chris@49 1699 <li>
Chris@49 1700 Member variables which are read-only;
Chris@49 1701 to change the size, use
Chris@49 1702 <a href="#set_size">.set_size()</a>,
Chris@49 1703 <a href="#copy_size">.copy_size()</a>,
Chris@49 1704 <a href="#zeros_member">.zeros()</a>,
Chris@49 1705 <a href="#ones_member">.ones()</a>,
Chris@49 1706 or
Chris@49 1707 <a href="#reset">.reset()</a>
Chris@49 1708 </li>
Chris@49 1709 <br>
Chris@49 1710 <li><i>n_rows</i>, <i>n_cols</i> and <i>n_elem</i> are applicable to <i>Mat</i>, <i>SpMat</i>, <i>Col</i>, <i>Row</i>, <i>Cube</i> and <i>field</i> classes</li>
Chris@49 1711 <br>
Chris@49 1712 <li><i>n_slices</i> is applicable only to the <i>Cube</i> class</li>
Chris@49 1713 <br>
Chris@49 1714 <li><i>n_nonzero</i> is applicable only to the <i>SpMat</i> class</li>
Chris@49 1715 <br>
Chris@49 1716 <li>
Chris@49 1717 For the <i>Col</i> and <i>Row</i> classes, <i>n_elem</i> also indicates vector length</li>
Chris@49 1718 <br>
Chris@49 1719 <li>The variables are of type <a href="#uword">uword</a></li>
Chris@49 1720 <br>
Chris@49 1721 <li>
Chris@49 1722 Examples:
Chris@49 1723 <ul>
Chris@49 1724 <pre>
Chris@49 1725 mat X(4,5);
Chris@49 1726 cout &lt;&lt; "X has " &lt;&lt; X.n_cols &lt;&lt; " columns" &lt;&lt; endl;
Chris@49 1727 </pre>
Chris@49 1728 </ul>
Chris@49 1729 </li>
Chris@49 1730 <br>
Chris@49 1731 <li>
Chris@49 1732 See also:
Chris@49 1733 <ul>
Chris@49 1734 <li><a href="#set_size">.set_size()</a></li>
Chris@49 1735 <li><a href="#copy_size">.copy_size()</a></li>
Chris@49 1736 <li><a href="#zeros_member">.zeros()</a></li>
Chris@49 1737 <li><a href="#ones_member">.ones()</a></li>
Chris@49 1738 <li><a href="#reset">.reset()</a></li>
Chris@49 1739 </ul>
Chris@49 1740 </li>
Chris@49 1741 <br>
Chris@49 1742 </ul>
Chris@49 1743 <hr class="greyline"><br>
Chris@49 1744
Chris@49 1745 <a name="colptr"></a>
Chris@49 1746 <b>.colptr(col_number)</b>
Chris@49 1747 <ul>
Chris@49 1748 <li>
Chris@49 1749 Member function of <i>Mat</i>
Chris@49 1750 </li>
Chris@49 1751 <br>
Chris@49 1752 <li>
Chris@49 1753 Obtain a raw pointer to the memory used by the specified column
Chris@49 1754 </li>
Chris@49 1755 <br>
Chris@49 1756 <li>
Chris@49 1757 As soon as the size of the matrix is changed, the pointer is no longer valid
Chris@49 1758 </li>
Chris@49 1759 <br>
Chris@49 1760 <li>This function is not recommended for use unless you know what you're doing
Chris@49 1761 -- you may wish to use <a href="#submat">submatrix views</a> instead
Chris@49 1762 </li>
Chris@49 1763 <br>
Chris@49 1764 <li>
Chris@49 1765 Examples:
Chris@49 1766 <ul>
Chris@49 1767 <pre>
Chris@49 1768 mat A = randu&lt;mat&gt;(5,5);
Chris@49 1769
Chris@49 1770 double* mem = A.colptr(2);
Chris@49 1771 </pre>
Chris@49 1772 </ul>
Chris@49 1773 </li>
Chris@49 1774 <br>
Chris@49 1775 <li>
Chris@49 1776 See also:
Chris@49 1777 <ul>
Chris@49 1778 <li><a href="#memptr">.memptr()</a></li>
Chris@49 1779 <li><a href="#submat">submatrix views</a></li>
Chris@49 1780 <li><a href="#element_access">element access</a></li>
Chris@49 1781 <li><a href="#iterators_mat">iterators (matrices)</a></li>
Chris@49 1782 <li><a href="#adv_constructors_mat">advanced constructors (matrices)</a></li>
Chris@49 1783 </ul>
Chris@49 1784 </li>
Chris@49 1785 <br>
Chris@49 1786 </ul>
Chris@49 1787 <hr class="greyline"><br>
Chris@49 1788
Chris@49 1789 <a name="copy_size"></a>
Chris@49 1790 <b>.copy_size(A)</b>
Chris@49 1791 <ul>
Chris@49 1792 <li>
Chris@49 1793 Member function of <i>Mat</i>, <i>Col</i>, <i>Row</i>, <i>Cube</i> and <i>field</i>
Chris@49 1794 </li>
Chris@49 1795 <br>
Chris@49 1796 <li>
Chris@49 1797 Set the size to be the same as object <i>A</i>
Chris@49 1798 </li>
Chris@49 1799 <br>
Chris@49 1800 <li>
Chris@49 1801 Object <i>A</i> must be of the same root type as the object being modified
Chris@49 1802 (eg. you can't set the size of a matrix by providing a cube)
Chris@49 1803 </li>
Chris@49 1804 <br>
Chris@49 1805 <li>
Chris@49 1806 Examples:
Chris@49 1807 <ul>
Chris@49 1808 <pre>
Chris@49 1809 mat A = randu&lt;mat&gt;(5,6);
Chris@49 1810 mat B;
Chris@49 1811 B.copy_size(A);
Chris@49 1812
Chris@49 1813 cout &lt;&lt; B.n_rows &lt;&lt; endl;
Chris@49 1814 cout &lt;&lt; B.n_cols &lt;&lt; endl;
Chris@49 1815 </pre>
Chris@49 1816 </ul>
Chris@49 1817 </li>
Chris@49 1818 <br>
Chris@49 1819 <li>
Chris@49 1820 See also:
Chris@49 1821 <ul>
Chris@49 1822 <li><a href="#reset">.reset()</a></li>
Chris@49 1823 <li><a href="#set_size">.set_size()</a></li>
Chris@49 1824 <li><a href="#reshape_member">.reshape()</a></li>
Chris@49 1825 <li><a href="#resize_member">.resize()</a></li>
Chris@49 1826 <li><a href="#zeros_member">.zeros()</a></li>
Chris@49 1827 </ul>
Chris@49 1828 </li>
Chris@49 1829 </ul>
Chris@49 1830 <br>
Chris@49 1831 <hr class="greyline"><br>
Chris@49 1832
Chris@49 1833 <a name="diag"></a>
Chris@49 1834 <b>.diag(</b><i>k=0</i><b>)</b>
Chris@49 1835 <ul>
Chris@49 1836 <li>
Chris@49 1837 Member function of <i>Mat</i>
Chris@49 1838 </li>
Chris@49 1839 <br>
Chris@49 1840 <li>
Chris@49 1841 Read/write access to the <i>k</i>-th diagonal in a matrix
Chris@49 1842 </li>
Chris@49 1843 <br>
Chris@49 1844 <li>The argument <i>k</i> is optional -- by default the main diagonal is accessed (<i>k=0</i>)</li>
Chris@49 1845 <br>
Chris@49 1846 <li>For <i>k &gt; 0</i>, the <i>k</i>-th super-diagonal is accessed (top-right corner)</li>
Chris@49 1847 <br>
Chris@49 1848 <li>For <i>k &lt; 0</i>, the <i>k</i>-th sub-diagonal is accessed (bottom-left corner)</li>
Chris@49 1849 <br>
Chris@49 1850 <li>
Chris@49 1851 An extracted diagonal is interpreted as a column vector
Chris@49 1852 </li>
Chris@49 1853 <br>
Chris@49 1854 <li>
Chris@49 1855 Examples:
Chris@49 1856 <ul>
Chris@49 1857 <pre>
Chris@49 1858 mat X = randu&lt;mat&gt;(5,5);
Chris@49 1859
Chris@49 1860 vec a = X.diag();
Chris@49 1861 vec b = X.diag(1);
Chris@49 1862 vec c = X.diag(-2);
Chris@49 1863
Chris@49 1864 X.diag() = randu&lt;vec&gt;(5);
Chris@49 1865 X.diag() += 6;
Chris@49 1866 </pre>
Chris@49 1867 </ul>
Chris@49 1868 </li>
Chris@49 1869 <br>
Chris@49 1870 <li>
Chris@49 1871 See also:
Chris@49 1872 <ul>
Chris@49 1873 <li><a href="#eye_member">.eye()</a></li>
Chris@49 1874 <li><a href="#diagvec">diagvec()</a></li>
Chris@49 1875 <li><a href="#diagmat">diagmat()</a></li>
Chris@49 1876 <li><a href="#submat">submatrix views</a></li>
Chris@49 1877 <li><a href="#each_colrow">.each_col() &amp; .each_row()</a></li>
Chris@49 1878 <li><a href="#trace">trace()</a></li>
Chris@49 1879 </ul>
Chris@49 1880 </li>
Chris@49 1881 </ul>
Chris@49 1882 <br>
Chris@49 1883 <hr class="greyline"><br>
Chris@49 1884
Chris@49 1885 <a name="each_colrow"></a>
Chris@49 1886 <b>.each_col()</b>
Chris@49 1887 <br>
Chris@49 1888 <b>.each_row()</b>
Chris@49 1889 <br>
Chris@49 1890 <br>
Chris@49 1891 <b>.each_col(</b><i>vector_of_indices</i><b>)</b>
Chris@49 1892 <br>
Chris@49 1893 <b>.each_row(</b><i>vector_of_indices</i><b>)</b>
Chris@49 1894 <ul>
Chris@49 1895 <li>
Chris@49 1896 Member functions of <i>Mat</i>
Chris@49 1897 </li>
Chris@49 1898 <br>
Chris@49 1899 <li>
Chris@49 1900 Write access to each column or row of a matrix/submatrix,
Chris@49 1901 allowing a vector operation to be repeated on each column or row
Chris@49 1902 </li>
Chris@49 1903 <br>
Chris@49 1904 <li>
Chris@49 1905 The operation can be in-place vector addition, subtraction, element-wise multiplication, element-wise division, or simply vector copy
Chris@49 1906 </li>
Chris@49 1907 <br>
Chris@49 1908 <li>The argument <i>vector_of_indices</i> is optional -- by default all columns or rows are accessed</li>
Chris@49 1909 <br>
Chris@49 1910 <li>
Chris@49 1911 If the argument <i>vector_of_indices</i> is used, it must evaluate to be a vector of type <i><a href="#Col">uvec</a></i>;
Chris@49 1912 the vector contains a list of indices of the columns or rows to be accessed
Chris@49 1913 </li>
Chris@49 1914 <br>
Chris@49 1915 <li>
Chris@49 1916 These functions were added in version 3.4
Chris@49 1917 </li>
Chris@49 1918 <br>
Chris@49 1919 <li>
Chris@49 1920 Examples:
Chris@49 1921 <ul>
Chris@49 1922 <pre>
Chris@49 1923 mat X = ones&lt;mat&gt;(6,5);
Chris@49 1924 vec v = linspace&lt;vec&gt;(10,15,6);
Chris@49 1925
Chris@49 1926 // add v to each column in X
Chris@49 1927 X.each_col() += v;
Chris@49 1928
Chris@49 1929 // subtract v from columns 0 through to 3 in X
Chris@49 1930 X.cols(0,3).each_col() -= v;
Chris@49 1931
Chris@49 1932 uvec indices(2);
Chris@49 1933 indices(0) = 2;
Chris@49 1934 indices(1) = 4;
Chris@49 1935
Chris@49 1936 // copy v to columns 2 and 4 in X
Chris@49 1937 X.each_col(indices) = v;
Chris@49 1938 </pre>
Chris@49 1939 </ul>
Chris@49 1940 </li>
Chris@49 1941 <br>
Chris@49 1942 <li>
Chris@49 1943 See also:
Chris@49 1944 <ul>
Chris@49 1945 <li><a href="#diag">diagonal views</a></li>
Chris@49 1946 <li><a href="#submat">submatrix views</a></li>
Chris@49 1947 </ul>
Chris@49 1948 </li>
Chris@49 1949 </ul>
Chris@49 1950 <br>
Chris@49 1951 <hr class="greyline"><br>
Chris@49 1952
Chris@49 1953 <a name="element_access"></a>
Chris@49 1954 <b>element/object access via (), [] and .at()</b>
Chris@49 1955 <ul>
Chris@49 1956 <li>
Chris@49 1957 Provide access to individual elements or objects stored in a container object
Chris@49 1958 (ie., <i>Mat</i>, <i>Col</i>, <i>Row</i>, <i>Cube</i>, <i>field</i>)<br>
Chris@49 1959 <br>
Chris@49 1960 <ul>
Chris@49 1961 <table style="text-align: left; width: 100%;"
Chris@49 1962 border="0" cellpadding="2" cellspacing="2">
Chris@49 1963 <tbody>
Chris@49 1964 <tr>
Chris@49 1965 <td style="vertical-align: top;">
Chris@49 1966 <pre>(n)</pre>
Chris@49 1967 </td>
Chris@49 1968 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 1969 </td>
Chris@49 1970 <td style="vertical-align: top;">
Chris@49 1971 For <i>vec</i> and <i>rowvec</i>, access the <i>n</i>-th element.
Chris@49 1972 For <i>mat</i>, <i>cube</i> and <i>field</i>, access the <i>n</i>-th element/object under the assumption of a flat layout,
Chris@49 1973 with column-major ordering of data (ie. column by column).
Chris@49 1974 A <i>std::logic_error</i> exception is thrown if the requested element is out of bounds.
Chris@49 1975 The bounds check can be <a href="#element_access_bounds_check_note">optionally disabled</a> at compile-time to get more speed.
Chris@49 1976 </td>
Chris@49 1977 </tr>
Chris@49 1978 <tr>
Chris@49 1979 <td>&nbsp;</td>
Chris@49 1980 <td>&nbsp;</td>
Chris@49 1981 <td>&nbsp;</td>
Chris@49 1982 </tr>
Chris@49 1983 <tr>
Chris@49 1984 <td style="vertical-align: top;">
Chris@49 1985 <pre>.at(n) and [n]</pre>
Chris@49 1986 </td>
Chris@49 1987 <td style="vertical-align: top;"><br>
Chris@49 1988 </td>
Chris@49 1989 <td style="vertical-align: top;">
Chris@49 1990 As for <i>(n)</i>, but without a bounds check.
Chris@49 1991 Not recommended for use unless your code has been thoroughly debugged.
Chris@49 1992 </td>
Chris@49 1993 </tr>
Chris@49 1994 <tr>
Chris@49 1995 <td>&nbsp;</td>
Chris@49 1996 <td>&nbsp;</td>
Chris@49 1997 <td>&nbsp;</td>
Chris@49 1998 </tr>
Chris@49 1999 <tr>
Chris@49 2000 <td style="vertical-align: top;">
Chris@49 2001 <pre>(i,j)</pre>
Chris@49 2002 </td>
Chris@49 2003 <td style="vertical-align: top;"><br>
Chris@49 2004 </td>
Chris@49 2005 <td style="vertical-align: top;">
Chris@49 2006 For <i>mat</i> and <i>field</i> classes, access the element/object stored at the <i>i</i>-th row and <i>j</i>-th column.
Chris@49 2007 A <i>std::logic_error</i> exception is thrown if the requested element is out of bounds.
Chris@49 2008 The bounds check can be <a href="#element_access_bounds_check_note">optionally disabled</a> at compile-time to get more speed.
Chris@49 2009 </td>
Chris@49 2010 </tr>
Chris@49 2011 <tr>
Chris@49 2012 <td>&nbsp;</td>
Chris@49 2013 <td>&nbsp;</td>
Chris@49 2014 <td>&nbsp;</td>
Chris@49 2015 </tr>
Chris@49 2016 <tr>
Chris@49 2017 <td style="vertical-align: top;">
Chris@49 2018 <pre>.at(i,j)</pre>
Chris@49 2019 </td>
Chris@49 2020 <td style="vertical-align: top;"><br>
Chris@49 2021 </td>
Chris@49 2022 <td style="vertical-align: top;">
Chris@49 2023 As for <i>(i,j)</i>, but without a bounds check.
Chris@49 2024 Not recommended for use unless your code has been thoroughly debugged.
Chris@49 2025 </td>
Chris@49 2026 <td style="vertical-align: top;"><br>
Chris@49 2027 </td>
Chris@49 2028 </tr>
Chris@49 2029 <tr>
Chris@49 2030 <td>&nbsp;</td>
Chris@49 2031 <td>&nbsp;</td>
Chris@49 2032 <td>&nbsp;</td>
Chris@49 2033 </tr>
Chris@49 2034 <tr>
Chris@49 2035 <td style="vertical-align: top;">
Chris@49 2036 <pre>(i,j,k)</pre>
Chris@49 2037 </td>
Chris@49 2038 <td style="vertical-align: top;"><br>
Chris@49 2039 </td>
Chris@49 2040 <td style="vertical-align: top;">
Chris@49 2041 Cube only: access the element stored at the <i>i</i>-th row, <i>j</i>-th column and <i>k</i>-th slice.
Chris@49 2042 A <i>std::logic_error</i> exception is thrown if the requested element is out of bounds.
Chris@49 2043 The bounds check can be <a href="#element_access_bounds_check_note">optionally disabled</a> at compile-time to get more speed.
Chris@49 2044 </td>
Chris@49 2045 </tr>
Chris@49 2046 <tr>
Chris@49 2047 <td>&nbsp;</td>
Chris@49 2048 <td>&nbsp;</td>
Chris@49 2049 <td>&nbsp;</td>
Chris@49 2050 </tr>
Chris@49 2051 <tr>
Chris@49 2052 <td style="vertical-align: top;">
Chris@49 2053 <pre>.at(i,j,k)</pre>
Chris@49 2054 </td>
Chris@49 2055 <td style="vertical-align: top;"><br>
Chris@49 2056 </td>
Chris@49 2057 <td style="vertical-align: top;">
Chris@49 2058 As for <i>(i,j,k)</i>, but without a bounds check.
Chris@49 2059 Not recommended for use unless your code has been thoroughly debugged.</td>
Chris@49 2060 </tr>
Chris@49 2061 </tbody>
Chris@49 2062 </table>
Chris@49 2063 </ul>
Chris@49 2064 </li>
Chris@49 2065 <br>
Chris@49 2066 <a name="element_access_bounds_check_note"></a>
Chris@49 2067 <li>
Chris@49 2068 The bounds checks used by the <i>(n)</i>, <i>(i,j)</i> and <i>(i,j,k)</i> access forms
Chris@49 2069 can be disabled by defining <a href="#config_hpp_arma_no_debug"><i>ARMA_NO_DEBUG</i></a> or <i>NDEBUG</i> macros
Chris@49 2070 before including the <i>armadillo</i> header file (eg. <i>#define ARMA_NO_DEBUG</i>).
Chris@49 2071 Disabling the bounds checks is not recommended until your code has been thoroughly debugged
Chris@49 2072 -- it's better to write correct code first, and then maximise its speed.
Chris@49 2073 </li>
Chris@49 2074 <br>
Chris@49 2075 <li>
Chris@49 2076 <b>Note</b>: for <a href="#SpMat">sparse matrices</a>, using element access operators to insert values via loops can be inefficient;
Chris@49 2077 you may wish to use <a href="#batch_constructors_sp_mat">batch insertion constructors</a> instead
Chris@49 2078 </li>
Chris@49 2079 <br>
Chris@49 2080 <li>
Chris@49 2081 Examples:
Chris@49 2082 <ul>
Chris@49 2083 <pre>
Chris@49 2084 mat A = randu&lt;mat&gt;(10,10);
Chris@49 2085 A(9,9) = 123.0;
Chris@49 2086 double x = A.at(9,9);
Chris@49 2087 double y = A[99];
Chris@49 2088
Chris@49 2089 vec p = randu&lt;vec&gt;(10,1);
Chris@49 2090 p(9) = 123.0;
Chris@49 2091 double z = p[9];
Chris@49 2092 </pre>
Chris@49 2093 </ul>
Chris@49 2094 </li>
Chris@49 2095 <br>
Chris@49 2096 <li>See also:
Chris@49 2097 <ul>
Chris@49 2098 <li><a href="#in_range">.in_range()</a></li>
Chris@49 2099 <li><a href="#element_initialisation">element initialisation</a></li>
Chris@49 2100 <li><a href="#submat">submatrix views</a></li>
Chris@49 2101 <li><a href="#memptr">.memptr()</a></li>
Chris@49 2102 <li><a href="#iterators_mat">iterators (matrices)</a></li>
Chris@49 2103 <li><a href="#iterators_cube">iterators (cubes)</a></li>
Chris@49 2104 <li><a href="#config_hpp">config.hpp</a></li>
Chris@49 2105 </ul>
Chris@49 2106 </li>
Chris@49 2107 <br>
Chris@49 2108 </ul>
Chris@49 2109 <hr class="greyline"><br>
Chris@49 2110
Chris@49 2111 <a name="element_initialisation"></a>
Chris@49 2112 <b>element initialisation</b>
Chris@49 2113 <ul>
Chris@49 2114 <li>
Chris@49 2115 Instances of <i>Mat</i>, <i>Col</i>, <i>Row</i> and <i>field</i> classes can be initialised via repeated use of the &lt;&lt; operator
Chris@49 2116 </li>
Chris@49 2117 <br>
Chris@49 2118 <li>
Chris@49 2119 Special element <i>endr</i> indicates "end of row" (conceptually similar to <i>std::endl</i>)
Chris@49 2120 </li>
Chris@49 2121 <br>
Chris@49 2122 <li>
Chris@49 2123 Setting elements via &lt;&lt; is a bit slower than directly <a href="#element_access">accessing</a> the elements,
Chris@49 2124 but code using &lt;&lt; is generally more readable as well as being easier to write
Chris@49 2125 </li>
Chris@49 2126 <br>
Chris@49 2127 <li>
Chris@49 2128 If you have a C++11 compiler, instances of <i>Mat</i>, <i>Col</i> and <i>Row</i> classes can be also initialised via initialiser lists;
Chris@49 2129 this requires support for the C++11 standard to be <a href="#config_hpp_arma_use_cxx11">explicitly enabled</a>
Chris@49 2130 </li>
Chris@49 2131 <br>
Chris@49 2132 <li>
Chris@49 2133 Examples:
Chris@49 2134 <ul>
Chris@49 2135 <pre>
Chris@49 2136 mat A;
Chris@49 2137
Chris@49 2138 A &lt;&lt; 1 &lt;&lt; 2 &lt;&lt; 3 &lt;&lt; endr
Chris@49 2139 &lt;&lt; 4 &lt;&lt; 5 &lt;&lt; 6 &lt;&lt; endr;
Chris@49 2140
Chris@49 2141 mat B = { 1, 2, 3, 4, 5, 6 }; // C++11 only
Chris@49 2142 B.reshape(2,3);
Chris@49 2143 </pre>
Chris@49 2144 </ul>
Chris@49 2145 </li>
Chris@49 2146 <br>
Chris@49 2147 <li>
Chris@49 2148 See also:
Chris@49 2149 <ul>
Chris@49 2150 <li><a href="#element_access">element access</a></li>
Chris@49 2151 <li><a href="#print">.print()</a></li>
Chris@49 2152 <li><a href="#save_load_mat">saving &amp; loading matrices</a></li>
Chris@49 2153 <li><a href="#adv_constructors_mat">advanced constructors (matrices)</a></li>
Chris@49 2154 </ul>
Chris@49 2155 </li>
Chris@49 2156 <br>
Chris@49 2157 </ul>
Chris@49 2158 <hr class="greyline"><br>
Chris@49 2159
Chris@49 2160 <a name="eval_member"></a>
Chris@49 2161 <b>.eval()</b>
Chris@49 2162 <br>
Chris@49 2163 <ul>
Chris@49 2164 <li>
Chris@49 2165 Member function of any matrix or vector expression
Chris@49 2166 </li>
Chris@49 2167 <br>
Chris@49 2168 <li>
Chris@49 2169 Explicitly forces the evaluation of a delayed expression and outputs a matrix
Chris@49 2170 </li>
Chris@49 2171 <br>
Chris@49 2172 <li>
Chris@49 2173 This function should be used sparingly and only in cases where it is absolutely necessary; indiscriminate use can cause slow downs
Chris@49 2174 </li>
Chris@49 2175 <br>
Chris@49 2176 <li>
Chris@49 2177 This function was added in version 3.2
Chris@49 2178 </li>
Chris@49 2179 <br>
Chris@49 2180 <li>
Chris@49 2181 Examples:
Chris@49 2182 <ul>
Chris@49 2183 <pre>
Chris@49 2184 cx_mat A( randu&lt;mat&gt;(4,4), randu&lt;mat&gt;(4,4) );
Chris@49 2185
Chris@49 2186 real(A).eval().save("A_real.dat", raw_ascii);
Chris@49 2187 imag(A).eval().save("A_imag.dat", raw_ascii);
Chris@49 2188 </pre>
Chris@49 2189 </ul>
Chris@49 2190 </li>
Chris@49 2191 <br>
Chris@49 2192 <li>See also:
Chris@49 2193 <ul>
Chris@49 2194 <li><a href="#Mat">Mat class</a></li>
Chris@49 2195 </ul>
Chris@49 2196 </li>
Chris@49 2197 <br>
Chris@49 2198 </ul>
Chris@49 2199 <hr class="greyline"><br>
Chris@49 2200
Chris@49 2201 <a name="eye_member"></a>
Chris@49 2202 <b>.eye()</b>
Chris@49 2203 <br>
Chris@49 2204 <b>.eye(n_rows, n_cols)</b>
Chris@49 2205 <ul>
Chris@49 2206 <li>
Chris@49 2207 Set the elements along the main diagonal to one and off-diagonal elements set to zero,
Chris@49 2208 optionally first resizing to specified dimensions
Chris@49 2209 </li>
Chris@49 2210 <br>
Chris@49 2211 <li>
Chris@49 2212 An identity matrix is generated when <i>n_rows</i> = <i>n_cols</i>
Chris@49 2213 </li>
Chris@49 2214 <br>
Chris@49 2215 <li>
Chris@49 2216 Examples:
Chris@49 2217 <ul>
Chris@49 2218 <pre>
Chris@49 2219 mat A(5,5);
Chris@49 2220 A.eye();
Chris@49 2221
Chris@49 2222 mat B;
Chris@49 2223 B.eye(5,5);
Chris@49 2224 </pre>
Chris@49 2225 </ul>
Chris@49 2226 </li>
Chris@49 2227 <br>
Chris@49 2228 <li>See also:
Chris@49 2229 <ul>
Chris@49 2230 <li><a href="#ones_member">.ones()</a></li>
Chris@49 2231 <li><a href="#diag">.diag()</a></li>
Chris@49 2232 <li><a href="#diagmat">diagmat()</a></li>
Chris@49 2233 <li><a href="#diagvec">diagvec()</a></li>
Chris@49 2234 <li><a href="#eye_standalone">eye()</a> (standalone function)</li>
Chris@49 2235 </ul>
Chris@49 2236 </li>
Chris@49 2237 <br>
Chris@49 2238 </ul>
Chris@49 2239 <hr class="greyline"><br>
Chris@49 2240
Chris@49 2241 <a name="fill"></a>
Chris@49 2242 <b>.fill(</b>value<b>)</b>
Chris@49 2243 <ul>
Chris@49 2244 <li>
Chris@49 2245 Member function of <i>Mat</i>, <i>Col</i>, <i>Row</i> and <i>Cube</i> classes.
Chris@49 2246 </li>
Chris@49 2247 <br>
Chris@49 2248 <li>Sets the elements to a specified value</li>
Chris@49 2249 <br>
Chris@49 2250 <li>the type of value must match the type of elements used by the container object (eg. for <i>mat</i> the type is double)
Chris@49 2251 </li>
Chris@49 2252 <br>
Chris@49 2253 <li>
Chris@49 2254 Examples:
Chris@49 2255 <ul>
Chris@49 2256 <pre>
Chris@49 2257 mat A(5,5);
Chris@49 2258 A.fill(123.0);
Chris@49 2259 </pre>
Chris@49 2260 </ul>
Chris@49 2261 </li>
Chris@49 2262 <br>
Chris@49 2263 <li>
Chris@49 2264 See also:
Chris@49 2265 <ul>
Chris@49 2266 <li><a href="#imbue">.imbue()</a></li>
Chris@49 2267 <li><a href="#ones_member">.ones()</a></li>
Chris@49 2268 <li><a href="#zeros_member">.zeros()</a></li>
Chris@49 2269 <li><a href="#randu_randn_member">.randu() &amp; .randn()</a></li>
Chris@49 2270 </ul>
Chris@49 2271 </li>
Chris@49 2272 <br>
Chris@49 2273 </ul>
Chris@49 2274 <hr class="greyline"><br>
Chris@49 2275
Chris@49 2276 <a name="i_member"></a>
Chris@49 2277 <b>.i(</b> <i>slow=false</i> <b>)</b>
Chris@49 2278 <ul>
Chris@49 2279 <li>
Chris@49 2280 Member function of any matrix expression
Chris@49 2281 </li>
Chris@49 2282 <br>
Chris@49 2283 <li>
Chris@49 2284 Provides an inverse of the matrix expression
Chris@49 2285 </li>
Chris@49 2286 <br>
Chris@49 2287 <li>the <i>slow</i> argument is optional</li>
Chris@49 2288 <br>
Chris@49 2289 <li>
Chris@49 2290 If the matrix expression is not square, a <i>std::logic_error</i> exception is thrown
Chris@49 2291 </li>
Chris@49 2292 <br>
Chris@49 2293 <li>
Chris@49 2294 If the matrix expression appears to be singular, the output matrix is reset and a <i>std::runtime_error</i> exception is thrown
Chris@49 2295 </li>
Chris@49 2296 <br>
Chris@49 2297 <li>
Chris@49 2298 For matrix sizes &le; 4x4, a fast inverse algorithm is used by default.
Chris@49 2299 In rare instances, the fast algorithm might be less precise than the standard algorithm.
Chris@49 2300 To force the use of the standard algorithm, set the <i>slow</i> argument to <i>true</i>
Chris@49 2301 </li>
Chris@49 2302 <br>
Chris@49 2303 <li>
Chris@49 2304 <b>NOTE:</b> in many cases it is more efficient/faster to use the <a href="#solve">solve()</a> function instead of performing a matrix inverse
Chris@49 2305 </li>
Chris@49 2306 <br>
Chris@49 2307 <li>
Chris@49 2308 This function was added in version 3.0
Chris@49 2309 </li>
Chris@49 2310 <br>
Chris@49 2311 <li>
Chris@49 2312 Examples:
Chris@49 2313 <ul>
Chris@49 2314 <pre>
Chris@49 2315 mat A = randu&lt;mat&gt;(4,4);
Chris@49 2316
Chris@49 2317 mat X = A.i();
Chris@49 2318 mat Y = (A+A).i();
Chris@49 2319
Chris@49 2320 mat B = randu&lt;mat&gt;(4,1);
Chris@49 2321 mat Z = A.i() * B; // automatically converted to Z=solve(A,B)
Chris@49 2322
Chris@49 2323 </pre>
Chris@49 2324 </ul>
Chris@49 2325 </li>
Chris@49 2326 <li>
Chris@49 2327 See also:
Chris@49 2328 <ul>
Chris@49 2329 <li><a href="#inv">inv()</a></li>
Chris@49 2330 <li><a href="#pinv">pinv()</a></li>
Chris@49 2331 <li><a href="#solve">solve()</a></li>
Chris@49 2332 </ul>
Chris@49 2333 </li>
Chris@49 2334 <br>
Chris@49 2335 </ul>
Chris@49 2336 <hr class="greyline"><br>
Chris@49 2337
Chris@49 2338 <a name="in_range"></a>
Chris@49 2339 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 2340 <tbody>
Chris@49 2341 <tr>
Chris@49 2342 <td style="vertical-align: top;"><b>.in_range(</b> i <b>)</b></td>
Chris@49 2343 <td style="vertical-align: top;"><br>
Chris@49 2344 </td>
Chris@49 2345 <td style="vertical-align: top;">(member of <i>Mat</i>, <i>Col</i>, <i>Row</i>, <i>Cube</i> and <i>field</i>)
Chris@49 2346 </td>
Chris@49 2347 </tr>
Chris@49 2348 <tr>
Chris@49 2349 <td style="vertical-align: top;"><b>.in_range( span(</b>start<b>,</b> end<b>) )</b></td>
Chris@49 2350 <td style="vertical-align: top;"><br>
Chris@49 2351 </td>
Chris@49 2352 <td style="vertical-align: top;">(member of <i>Mat</i>, <i>Col</i>, <i>Row</i>, <i>Cube</i> and <i>field</i>)
Chris@49 2353 </td>
Chris@49 2354 </tr>
Chris@49 2355 <tr>
Chris@49 2356 <td>
Chris@49 2357 &nbsp;
Chris@49 2358 </td>
Chris@49 2359 </tr>
Chris@49 2360 <tr>
Chris@49 2361 <td style="vertical-align: top;"><b>.in_range(</b> row<b>,</b> col <b>)</b></td>
Chris@49 2362 <td style="vertical-align: top;"><br>
Chris@49 2363 </td>
Chris@49 2364 <td style="vertical-align: top;">(member of <i>Mat</i>, <i>Col</i>, <i>Row</i> and <i>field</i>)
Chris@49 2365 </td>
Chris@49 2366 </tr>
Chris@49 2367 <tr>
Chris@49 2368 <td style="vertical-align: top;"><b>.in_range( <font size=-1>span(</b>start_row<b>,</b> end_row<b>), span(</b>start_col<b>,</b> end_col<b>)</font> )</b></td>
Chris@49 2369 <td style="vertical-align: top;"><br>
Chris@49 2370 </td>
Chris@49 2371 <td style="vertical-align: top;">(member of <i>Mat</i>, <i>Col</i>, <i>Row</i> and <i>field</i>)
Chris@49 2372 </td>
Chris@49 2373 </tr>
Chris@49 2374 <tr>
Chris@49 2375 <td>
Chris@49 2376 &nbsp;
Chris@49 2377 </td>
Chris@49 2378 </tr>
Chris@49 2379 <tr>
Chris@49 2380 <td style="vertical-align: top;"><b>.in_range(</b> row<b>,</b> col<b>,</b> slice <b>)</b></td>
Chris@49 2381 <td style="vertical-align: top;"><br>
Chris@49 2382 </td>
Chris@49 2383 <td style="vertical-align: top;">(member of <i>Cube</i>)
Chris@49 2384 </td>
Chris@49 2385 </tr>
Chris@49 2386 <tr>
Chris@49 2387 <td style="vertical-align: top;"><b>.in_range( <font size=-1>span(</b>start_row<b>,</b> end_row<b>), span(</b>start_col<b>,</b> end_col<b>), span(</b>start_slice<b>,</b> end_slice<b>)</font> )</b></td>
Chris@49 2388 <td style="vertical-align: top;"><br>
Chris@49 2389 </td>
Chris@49 2390 <td style="vertical-align: top;">(member of <i>Cube</i>)
Chris@49 2391 </td>
Chris@49 2392 </tr>
Chris@49 2393 </tbody>
Chris@49 2394 </table>
Chris@49 2395 <br>
Chris@49 2396 <ul>
Chris@49 2397 <li>Returns <i>true</i> if the given location or span is currently valid
Chris@49 2398 </li>
Chris@49 2399 <br>
Chris@49 2400 <li>Returns <i>false</i> if the object is empty, the location is out of bounds, or the span is out of bounds
Chris@49 2401 </li>
Chris@49 2402 <br>
Chris@49 2403 <li>
Chris@49 2404 Instances of <i>span(a,b)</i> can be replaced by:
Chris@49 2405 <ul>
Chris@49 2406 <li><i>span()</i> or <i>span::all</i>, to indicate the entire range</li>
Chris@49 2407 <li><i>span(a)</i>, to indicate a particular row, column or slice</li>
Chris@49 2408 </ul>
Chris@49 2409 </li>
Chris@49 2410 <br>
Chris@49 2411 <li>
Chris@49 2412 Examples:
Chris@49 2413 <ul>
Chris@49 2414 <pre>
Chris@49 2415 mat A = randu&lt;mat&gt;(4,5);
Chris@49 2416
Chris@49 2417 cout &lt;&lt; A.in_range(0,0) &lt;&lt; endl; // true
Chris@49 2418 cout &lt;&lt; A.in_range(3,4) &lt;&lt; endl; // true
Chris@49 2419 cout &lt;&lt; A.in_range(4,5) &lt;&lt; endl; // false
Chris@49 2420 </pre>
Chris@49 2421 </ul>
Chris@49 2422 </li>
Chris@49 2423 <br>
Chris@49 2424 <li>
Chris@49 2425 See also:
Chris@49 2426 <ul>
Chris@49 2427 <li><a href="#element_access">element access</a></li>
Chris@49 2428 <li><a href="#submat">submatrix views</a></li>
Chris@49 2429 <li><a href="#subcube">subcube views</a></li>
Chris@49 2430 <li><a href="#subfield">subfield views</a></li>
Chris@49 2431 <li><a href="#set_size">.set_size()</a></li>
Chris@49 2432 </ul>
Chris@49 2433 </li>
Chris@49 2434 <br>
Chris@49 2435 </ul>
Chris@49 2436 <hr class="greyline"><br>
Chris@49 2437
Chris@49 2438 <a name="is_empty"></a>
Chris@49 2439 <b>.is_empty()</b>
Chris@49 2440 <ul>
Chris@49 2441 <li>
Chris@49 2442 Member function of <i>Mat</i>, <i>Col</i>, <i>Row</i>, <i>Cube</i> and <i>field</i> classes
Chris@49 2443 </li>
Chris@49 2444 <br>
Chris@49 2445 <li>Returns true if the object has no elements
Chris@49 2446 </li>
Chris@49 2447 <br>
Chris@49 2448 <li>Returns false if the object has one or more elements
Chris@49 2449 </li>
Chris@49 2450 <br>
Chris@49 2451 <li>
Chris@49 2452 Examples:
Chris@49 2453 <ul>
Chris@49 2454 <pre>
Chris@49 2455 mat A = randu&lt;mat&gt;(5,5);
Chris@49 2456 cout &lt;&lt; A.is_empty() &lt;&lt; endl;
Chris@49 2457
Chris@49 2458 A.reset();
Chris@49 2459 cout &lt;&lt; A.is_empty() &lt;&lt; endl;
Chris@49 2460 </pre>
Chris@49 2461 </ul>
Chris@49 2462 </li>
Chris@49 2463 <br>
Chris@49 2464 <li>
Chris@49 2465 See also:
Chris@49 2466 <ul>
Chris@49 2467 <li><a href="#is_square">.is_square()</a></li>
Chris@49 2468 <li><a href="#is_vec">.is_vec()</a></li>
Chris@49 2469 <li><a href="#is_finite">.is_finite()</a></li>
Chris@49 2470 <li><a href="#reset">.reset()</a></li>
Chris@49 2471 </ul>
Chris@49 2472 </li>
Chris@49 2473 <br>
Chris@49 2474 </ul>
Chris@49 2475 <hr class="greyline"><br>
Chris@49 2476
Chris@49 2477 <a name="is_finite"></a>
Chris@49 2478 <b>.is_finite()</b>
Chris@49 2479 <ul>
Chris@49 2480 <li>
Chris@49 2481 Member function of <i>Mat</i>, <i>Col</i>, <i>Row</i> and <i>Cube</i> classes
Chris@49 2482 </li>
Chris@49 2483 <br>
Chris@49 2484 <li>Returns <i>true</i> if all elements of the object are finite
Chris@49 2485 </li>
Chris@49 2486 <br>
Chris@49 2487 <li>Returns <i>false</i> if at least one of the elements of the object is non-finite (&plusmn;infinity or NaN)
Chris@49 2488 </li>
Chris@49 2489 <br>
Chris@49 2490 <li>
Chris@49 2491 Examples:
Chris@49 2492 <ul>
Chris@49 2493 <pre>
Chris@49 2494 mat A = randu&lt;mat&gt;(5,5);
Chris@49 2495 mat B = randu&lt;mat&gt;(5,5);
Chris@49 2496
Chris@49 2497 B(1,1) = datum::nan;
Chris@49 2498
Chris@49 2499 cout &lt;&lt; A.is_finite() &lt;&lt; endl;
Chris@49 2500 cout &lt;&lt; B.is_finite() &lt;&lt; endl;
Chris@49 2501 </pre>
Chris@49 2502 </ul>
Chris@49 2503 </li>
Chris@49 2504 <br>
Chris@49 2505 <li>
Chris@49 2506 See also:
Chris@49 2507 <ul>
Chris@49 2508 <li><a href="#constants">datum::nan</a></li>
Chris@49 2509 <li><a href="#constants">datum::inf</a></li>
Chris@49 2510 <li><a href="#is_finite_standalone">is_finite()</a> (standalone function)</li>
Chris@49 2511 </ul>
Chris@49 2512 </li>
Chris@49 2513 <br>
Chris@49 2514 </ul>
Chris@49 2515 <hr class="greyline"><br>
Chris@49 2516
Chris@49 2517 <a name="is_square"></a>
Chris@49 2518 <b>.is_square()</b>
Chris@49 2519 <ul>
Chris@49 2520 <li>
Chris@49 2521 Member function of the <i>Mat</i> class
Chris@49 2522 </li>
Chris@49 2523 <br>
Chris@49 2524 <li>Returns <i>true</i> if the matrix is square, ie., number of rows is equal to the number of columns
Chris@49 2525 </li>
Chris@49 2526 <br>
Chris@49 2527 <li>Returns <i>false</i> if the matrix is not square
Chris@49 2528 </li>
Chris@49 2529 <br>
Chris@49 2530 <li>
Chris@49 2531 Examples:
Chris@49 2532 <ul>
Chris@49 2533 <pre>
Chris@49 2534 mat A = randu&lt;mat&gt;(5,5);
Chris@49 2535 mat B = randu&lt;mat&gt;(6,7);
Chris@49 2536
Chris@49 2537 cout &lt;&lt; A.is_square() &lt;&lt; endl;
Chris@49 2538 cout &lt;&lt; B.is_square() &lt;&lt; endl;
Chris@49 2539 </pre>
Chris@49 2540 </ul>
Chris@49 2541 </li>
Chris@49 2542 <br>
Chris@49 2543 <li>
Chris@49 2544 See also:
Chris@49 2545 <ul>
Chris@49 2546 <li><a href="#is_empty">.is_empty()</a></li>
Chris@49 2547 <li><a href="#is_vec">.is_vec()</a></li>
Chris@49 2548 <li><a href="#is_finite">.is_finite()</a></li>
Chris@49 2549 </ul>
Chris@49 2550 </li>
Chris@49 2551 </ul>
Chris@49 2552 <br>
Chris@49 2553 <hr class="greyline"><br>
Chris@49 2554
Chris@49 2555 <a name="is_vec"></a>
Chris@49 2556 <b>.is_vec()</b>
Chris@49 2557 <br><b>.is_colvec()</b>
Chris@49 2558 <br><b>.is_rowvec()</b>
Chris@49 2559 <ul>
Chris@49 2560 <li>
Chris@49 2561 Member functions of the <i>Mat</i> class
Chris@49 2562 </li>
Chris@49 2563 <br>
Chris@49 2564
Chris@49 2565 <li>.is_vec():
Chris@49 2566 <ul>
Chris@49 2567 <li>Returns <i>true</i> if the matrix can be interpreted as a vector (either column or row vector)
Chris@49 2568 </li>
Chris@49 2569 <li>Returns <i>false</i> if the matrix does not have exactly one column or one row
Chris@49 2570 </li>
Chris@49 2571 </ul>
Chris@49 2572 </li>
Chris@49 2573 <br>
Chris@49 2574
Chris@49 2575 <li>.is_colvec():
Chris@49 2576 <ul>
Chris@49 2577 <li>Returns <i>true</i> if the matrix can be interpreted as a column vector
Chris@49 2578 </li>
Chris@49 2579 <li>Returns <i>false</i> if the matrix does not have exactly one column
Chris@49 2580 </li>
Chris@49 2581 </ul>
Chris@49 2582 </li>
Chris@49 2583 <br>
Chris@49 2584
Chris@49 2585 <li>.is_rowvec():
Chris@49 2586 <ul>
Chris@49 2587 <li>Returns <i>true</i> if the matrix can be interpreted as a row vector
Chris@49 2588 </li>
Chris@49 2589 <li>Returns <i>false</i> if the matrix does not have exactly one row
Chris@49 2590 </li>
Chris@49 2591 </ul>
Chris@49 2592 </li>
Chris@49 2593 <br>
Chris@49 2594
Chris@49 2595 <li><b>Caveat:</b> do not assume that the vector has elements if these functions return <i>true</i> -- it is possible to have an empty vector (eg. 0x1)
Chris@49 2596 </li>
Chris@49 2597 <br>
Chris@49 2598 <li>
Chris@49 2599 Examples:
Chris@49 2600 <ul>
Chris@49 2601 <pre>
Chris@49 2602 mat A = randu&lt;mat&gt;(1,5);
Chris@49 2603 mat B = randu&lt;mat&gt;(5,1);
Chris@49 2604 mat C = randu&lt;mat&gt;(5,5);
Chris@49 2605
Chris@49 2606 cout &lt;&lt; A.is_vec() &lt;&lt; endl;
Chris@49 2607 cout &lt;&lt; B.is_vec() &lt;&lt; endl;
Chris@49 2608 cout &lt;&lt; C.is_vec() &lt;&lt; endl;
Chris@49 2609 </pre>
Chris@49 2610 </ul>
Chris@49 2611 </li>
Chris@49 2612 <br>
Chris@49 2613 <li>
Chris@49 2614 See also:
Chris@49 2615 <ul>
Chris@49 2616 <li><a href="#is_empty">.is_empty()</a></li>
Chris@49 2617 <li><a href="#is_square">.is_square()</a></li>
Chris@49 2618 <li><a href="#is_finite">.is_finite()</a></li>
Chris@49 2619 </ul>
Chris@49 2620 </li>
Chris@49 2621 </ul>
Chris@49 2622 <br>
Chris@49 2623 <hr class="greyline"><br>
Chris@49 2624
Chris@49 2625 <a name="imbue"></a>
Chris@49 2626 <b>.imbue(&nbsp;</b>functor<b>&nbsp;)</b>
Chris@49 2627 <br>
Chris@49 2628 <b>.imbue(&nbsp;</b>lambda function<b>&nbsp;)</b>&nbsp;&nbsp;&nbsp;<i>(C++11 only)</i>
Chris@49 2629 <br>
Chris@49 2630 <ul>
Chris@49 2631 <li>
Chris@49 2632 Imbue (fill) with values provided by a functor or lambda function
Chris@49 2633 </li>
Chris@49 2634 <br>
Chris@49 2635 <li>
Chris@49 2636 For matrices, filling is done column-by-column (ie. column 0 is filled, then column 1, ...)
Chris@49 2637 </li>
Chris@49 2638 <br>
Chris@49 2639 <li>
Chris@49 2640 For cubes, filling is done slice-by-slice; each slice is filled column-by-column
Chris@49 2641 </li>
Chris@49 2642 <br>
Chris@49 2643 <li>
Chris@49 2644 This function was added in version 3.800
Chris@49 2645 </li>
Chris@49 2646 <br>
Chris@49 2647 <li>
Chris@49 2648 Examples:
Chris@49 2649 <ul>
Chris@49 2650 <pre>
Chris@49 2651 // C++11 only example
Chris@49 2652 // need to include &lt;random&gt;
Chris@49 2653
Chris@49 2654 std::mt19937 engine; // Mersenne twister random number engine
Chris@49 2655
Chris@49 2656 std::uniform_real_distribution&lt;double&gt; distr(0.0, 1.0);
Chris@49 2657
Chris@49 2658 mat A(4,5);
Chris@49 2659
Chris@49 2660 A.imbue( [&amp;]() { return distr(engine); } );
Chris@49 2661 </pre>
Chris@49 2662 </ul>
Chris@49 2663 </li>
Chris@49 2664 <br>
Chris@49 2665 <li>
Chris@49 2666 See also:
Chris@49 2667 <ul>
Chris@49 2668 <li><a href="#fill">.fill()</a></li>
Chris@49 2669 <li><a href="#transform">.transform()</a></li>
Chris@49 2670 <li><a href="http://en.wikipedia.org/wiki/Function_object">function object</a> at Wikipedia</li>
Chris@49 2671 <li><a href="http://en.wikipedia.org/wiki/C%2B%2B11#Lambda_functions_and_expressions">C++11 lambda functions</a> at Wikipedia</li>
Chris@49 2672 <li><a href="http://www.cprogramming.com/c++11/c++11-lambda-closures.html">lambda function</a> at cprogramming.com</li>
Chris@49 2673 </ul>
Chris@49 2674 </li>
Chris@49 2675 <br>
Chris@49 2676 </ul>
Chris@49 2677 <hr class="greyline"><br>
Chris@49 2678
Chris@49 2679 <a name="insert"></a>
Chris@49 2680 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 2681 <tbody>
Chris@49 2682 <tr>
Chris@49 2683 <td style="vertical-align: top;">
Chris@49 2684 <b>.insert_rows(&nbsp;</b>row_number, X<b>&nbsp;)</b>
Chris@49 2685 <br>
Chris@49 2686 <b>.insert_rows(&nbsp;</b>row_number, number_of_rows, set_to_zero&nbsp;=&nbsp;true<b>&nbsp;)</b>
Chris@49 2687 </td>
Chris@49 2688 <td style="vertical-align: top;"><br></td>
Chris@49 2689 <td style="vertical-align: top;">(member functions of <i>Mat</i> and <i>Col</i>)
Chris@49 2690 </td>
Chris@49 2691 </tr>
Chris@49 2692 <tr>
Chris@49 2693 <td>&nbsp;</td>
Chris@49 2694 </tr>
Chris@49 2695 <tr>
Chris@49 2696 <td style="vertical-align: top;">
Chris@49 2697 <b>.insert_cols(&nbsp;</b>col_number, X<b>&nbsp;)</b>
Chris@49 2698 <br>
Chris@49 2699 <b>.insert_cols(&nbsp;</b>col_number, number_of_cols, set_to_zero&nbsp;=&nbsp;true<b>&nbsp;)</b>
Chris@49 2700 </td>
Chris@49 2701 <td style="vertical-align: top;"><br></td>
Chris@49 2702 <td style="vertical-align: top;">(member functions of <i>Mat</i> and <i>Row</i>)
Chris@49 2703 </td>
Chris@49 2704 </tr>
Chris@49 2705 <tr>
Chris@49 2706 <td>&nbsp;</td>
Chris@49 2707 </tr>
Chris@49 2708 <tr>
Chris@49 2709 <td style="vertical-align: top;">
Chris@49 2710 <b>.insert_slices(&nbsp;</b>slice_number, X<b>&nbsp;)</b>
Chris@49 2711 <br>
Chris@49 2712 <b>.insert_slices(&nbsp;</b>slice_number, number_of_slices, set_to_zero&nbsp;=&nbsp;true<b>&nbsp;)</b>
Chris@49 2713 </td>
Chris@49 2714 <td style="vertical-align: top;"><br></td>
Chris@49 2715 <td style="vertical-align: top;">(member functions of <i>Cube</i>)
Chris@49 2716 </td>
Chris@49 2717 </tr>
Chris@49 2718 </tbody>
Chris@49 2719 </table>
Chris@49 2720 <br>
Chris@49 2721 <ul>
Chris@49 2722 <li>
Chris@49 2723 Functions with the <i>X</i> argument: insert a copy of X at the specified row/column/slice
Chris@49 2724 <ul>
Chris@49 2725 <li>if inserting rows, X must have the same number of columns as the recipient object</li>
Chris@49 2726 <li>if inserting columns, X must have the same number of rows as the recipient object</li>
Chris@49 2727 <li>if inserting slices, X must have the same number of rows and columns as the recipient object (ie. all slices must have the same size)</li>
Chris@49 2728 </ul>
Chris@49 2729 </li>
Chris@49 2730 <br>
Chris@49 2731 <li>
Chris@49 2732 Functions with the <i>number_of_...</i> argument: expand the object by creating new rows/columns/slices.
Chris@49 2733 By default, the new rows/columns/slices are set to zero.
Chris@49 2734 If <i>set_to_zero</i> is <i>false</i>, the memory used by the new rows/columns/slices will not be initialised.
Chris@49 2735 </li>
Chris@49 2736 <br>
Chris@49 2737 <li>
Chris@49 2738 Examples:
Chris@49 2739 <ul>
Chris@49 2740 <pre>
Chris@49 2741 mat A = randu&lt;mat&gt;(5,10);
Chris@49 2742 mat B = ones&lt;mat&gt;(5,2);
Chris@49 2743
Chris@49 2744 // at column 2, insert a copy of B;
Chris@49 2745 // A will now have 12 columns
Chris@49 2746 A.insert_cols(2, B);
Chris@49 2747
Chris@49 2748 // at column 1, insert 5 zeroed columns;
Chris@49 2749 // B will now have 7 columns
Chris@49 2750 B.insert_cols(1, 5);
Chris@49 2751 </pre>
Chris@49 2752 </ul>
Chris@49 2753 </li>
Chris@49 2754 <br>
Chris@49 2755 <li>
Chris@49 2756 See also:
Chris@49 2757 <ul>
Chris@49 2758 <li><a href="#shed">shed rows/columns/slices</a></li>
Chris@49 2759 <li><a href="#join">join rows/columns/slices</a></li>
Chris@49 2760 <li><a href="#resize_member">.resize()</a></li>
Chris@49 2761 <li><a href="#submat">submatrix views</a></li>
Chris@49 2762 <li><a href="#subcube">subcube views</a></li>
Chris@49 2763 </ul>
Chris@49 2764 </li>
Chris@49 2765 <br>
Chris@49 2766 </ul>
Chris@49 2767 <hr class="greyline"><br>
Chris@49 2768
Chris@49 2769 <a name="iterators_mat"></a>
Chris@49 2770 <b>iterators (matrices &amp; vectors)</b>
Chris@49 2771 <ul>
Chris@49 2772 <li>
Chris@49 2773 STL-style iterators and associated member functions of the <i>Mat</i>, <i>Col</i> and <i>Row</i> classes
Chris@49 2774 </li>
Chris@49 2775 <br>
Chris@49 2776 <li>
Chris@49 2777 iterator types:
Chris@49 2778 <br>
Chris@49 2779 <br>
Chris@49 2780 <ul>
Chris@49 2781 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 2782 <tbody>
Chris@49 2783 <tr>
Chris@49 2784 <td style="vertical-align: top;">
Chris@49 2785 <b>mat::iterator</b>
Chris@49 2786 <br>
Chris@49 2787 <b>vec::iterator</b>
Chris@49 2788 <br>
Chris@49 2789 <b>rowvec::iterator</b>
Chris@49 2790 </td>
Chris@49 2791 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2792 </td>
Chris@49 2793 <td style="vertical-align: top;">
Chris@49 2794 random access iterators, for read/write access to elements
Chris@49 2795 (which are stored column by column)
Chris@49 2796 </td>
Chris@49 2797 </tr>
Chris@49 2798 <tr>
Chris@49 2799 <td style="vertical-align: top;">
Chris@49 2800 &nbsp;
Chris@49 2801 </td>
Chris@49 2802 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2803 </td>
Chris@49 2804 <td style="vertical-align: top;">
Chris@49 2805 &nbsp;
Chris@49 2806 </td>
Chris@49 2807 </tr>
Chris@49 2808 <tr>
Chris@49 2809 <td style="vertical-align: top;">
Chris@49 2810 <b>mat::const_iterator</b>
Chris@49 2811 <br>
Chris@49 2812 <b>vec::const_iterator</b>
Chris@49 2813 <br>
Chris@49 2814 <b>rowvec::const_iterator</b>
Chris@49 2815 </td>
Chris@49 2816 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2817 </td>
Chris@49 2818 <td style="vertical-align: top;">
Chris@49 2819 random access iterators, for read-only access to elements
Chris@49 2820 (which are stored column by column)
Chris@49 2821 </td>
Chris@49 2822 </tr>
Chris@49 2823 <tr>
Chris@49 2824 <td style="vertical-align: top;">
Chris@49 2825 &nbsp;
Chris@49 2826 </td>
Chris@49 2827 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2828 </td>
Chris@49 2829 <td style="vertical-align: top;">
Chris@49 2830 &nbsp;
Chris@49 2831 </td>
Chris@49 2832 </tr>
Chris@49 2833 <tr>
Chris@49 2834 <td style="vertical-align: top;">
Chris@49 2835 <b>mat::col_iterator</b>
Chris@49 2836 <br>
Chris@49 2837 <b>vec::col_iterator</b>
Chris@49 2838 <br>
Chris@49 2839 <b>rowvec::col_iterator</b>
Chris@49 2840 </td>
Chris@49 2841 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2842 </td>
Chris@49 2843 <td style="vertical-align: top;">
Chris@49 2844 random access iterators, for read/write access to the elements of a specific column
Chris@49 2845 </td>
Chris@49 2846 </tr>
Chris@49 2847 <tr>
Chris@49 2848 <td style="vertical-align: top;">
Chris@49 2849 &nbsp;
Chris@49 2850 </td>
Chris@49 2851 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2852 </td>
Chris@49 2853 <td style="vertical-align: top;">
Chris@49 2854 &nbsp;
Chris@49 2855 </td>
Chris@49 2856 </tr>
Chris@49 2857 <tr>
Chris@49 2858 <td style="vertical-align: top;">
Chris@49 2859 <b>mat::const_col_iterator</b>
Chris@49 2860 <br>
Chris@49 2861 <b>vec::const_col_iterator</b>
Chris@49 2862 <br>
Chris@49 2863 <b>rowvec::const_col_iterator</b>
Chris@49 2864 </td>
Chris@49 2865 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2866 </td>
Chris@49 2867 <td style="vertical-align: top;">
Chris@49 2868 random access iterators, for read-only access to the elements of a specific column
Chris@49 2869 </td>
Chris@49 2870 </tr>
Chris@49 2871 <tr>
Chris@49 2872 <td style="vertical-align: top;">
Chris@49 2873 &nbsp;
Chris@49 2874 </td>
Chris@49 2875 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2876 </td>
Chris@49 2877 <td style="vertical-align: top;">
Chris@49 2878 &nbsp;
Chris@49 2879 </td>
Chris@49 2880 </tr>
Chris@49 2881 <tr>
Chris@49 2882 <td style="vertical-align: top;">
Chris@49 2883 <b>mat::row_iterator</b>
Chris@49 2884 </td>
Chris@49 2885 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2886 </td>
Chris@49 2887 <td style="vertical-align: top;">
Chris@49 2888 rudimentary forward iterator, for read/write access to the elements of a specific row
Chris@49 2889 </td>
Chris@49 2890 </tr>
Chris@49 2891 <tr>
Chris@49 2892 <td style="vertical-align: top;">
Chris@49 2893 &nbsp;
Chris@49 2894 </td>
Chris@49 2895 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2896 </td>
Chris@49 2897 <td style="vertical-align: top;">
Chris@49 2898 &nbsp;
Chris@49 2899 </td>
Chris@49 2900 </tr>
Chris@49 2901 <tr>
Chris@49 2902 <td style="vertical-align: top;">
Chris@49 2903 <b>mat::const_row_iterator</b>
Chris@49 2904 </td>
Chris@49 2905 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2906 </td>
Chris@49 2907 <td style="vertical-align: top;">
Chris@49 2908 rudimentary forward iterator, for read-only access to the elements of a specific row
Chris@49 2909 </td>
Chris@49 2910 </tr>
Chris@49 2911 <tr>
Chris@49 2912 <td style="vertical-align: top;">
Chris@49 2913 &nbsp;
Chris@49 2914 </td>
Chris@49 2915 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2916 </td>
Chris@49 2917 <td style="vertical-align: top;">
Chris@49 2918 &nbsp;
Chris@49 2919 </td>
Chris@49 2920 </tr>
Chris@49 2921 <tr>
Chris@49 2922 <td style="vertical-align: top;">
Chris@49 2923 <b>vec::row_iterator</b>
Chris@49 2924 <br>
Chris@49 2925 <b>rowvec::row_iterator</b>
Chris@49 2926 </td>
Chris@49 2927 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2928 </td>
Chris@49 2929 <td style="vertical-align: top;">
Chris@49 2930 random access iterators, for read/write access to the elements of a specific row
Chris@49 2931 </td>
Chris@49 2932 </tr>
Chris@49 2933 <tr>
Chris@49 2934 <td style="vertical-align: top;">
Chris@49 2935 &nbsp;
Chris@49 2936 </td>
Chris@49 2937 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2938 </td>
Chris@49 2939 <td style="vertical-align: top;">
Chris@49 2940 &nbsp;
Chris@49 2941 </td>
Chris@49 2942 </tr>
Chris@49 2943 <tr>
Chris@49 2944 <td style="vertical-align: top;">
Chris@49 2945 <b>vec::const_row_iterator</b>
Chris@49 2946 <br>
Chris@49 2947 <b>rowvec::const_row_iterator</b>
Chris@49 2948 </td>
Chris@49 2949 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2950 </td>
Chris@49 2951 <td style="vertical-align: top;">
Chris@49 2952 random access iterators, for read-only access to the elements of a specific row
Chris@49 2953 </td>
Chris@49 2954 </tr>
Chris@49 2955 </tbody>
Chris@49 2956 </table>
Chris@49 2957 </ul>
Chris@49 2958 </li>
Chris@49 2959 <br>
Chris@49 2960 <br>
Chris@49 2961 <li>
Chris@49 2962 Member functions:
Chris@49 2963 <br>
Chris@49 2964 <br>
Chris@49 2965 <ul>
Chris@49 2966 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 2967 <tbody>
Chris@49 2968 <tr>
Chris@49 2969 <td style="vertical-align: top;">
Chris@49 2970 <b>.begin()</b>
Chris@49 2971 </td>
Chris@49 2972 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2973 </td>
Chris@49 2974 <td style="vertical-align: top;">
Chris@49 2975 iterator referring to the first element
Chris@49 2976 </td>
Chris@49 2977 </tr>
Chris@49 2978 <tr>
Chris@49 2979 <td style="vertical-align: top;">
Chris@49 2980 <b>.end()</b>
Chris@49 2981 </td>
Chris@49 2982 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2983 </td>
Chris@49 2984 <td style="vertical-align: top;">
Chris@49 2985 iterator referring to the <i>past-the-end</i> element
Chris@49 2986 </td>
Chris@49 2987 </tr>
Chris@49 2988 <tr>
Chris@49 2989 <td>
Chris@49 2990 &nbsp;
Chris@49 2991 </td>
Chris@49 2992 </tr>
Chris@49 2993 <tr>
Chris@49 2994 <td style="vertical-align: top;">
Chris@49 2995 <b>.begin_row(</b><i>row_number</i><b>)</b>
Chris@49 2996 </td>
Chris@49 2997 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 2998 </td>
Chris@49 2999 <td style="vertical-align: top;">
Chris@49 3000 iterator referring to the first element of the specified row
Chris@49 3001 </td>
Chris@49 3002 </tr>
Chris@49 3003 <tr>
Chris@49 3004 <td style="vertical-align: top;">
Chris@49 3005 <b>.end_row(</b><i>row_number</i><b>)</b>
Chris@49 3006 </td>
Chris@49 3007 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3008 </td>
Chris@49 3009 <td style="vertical-align: top;">
Chris@49 3010 iterator referring to the <i>past-the-end</i> element of the specified row
Chris@49 3011 </td>
Chris@49 3012 </tr>
Chris@49 3013 <tr>
Chris@49 3014 <td>
Chris@49 3015 &nbsp;
Chris@49 3016 </td>
Chris@49 3017 </tr>
Chris@49 3018 <tr>
Chris@49 3019 <td style="vertical-align: top;">
Chris@49 3020 <b>.begin_col(</b><i>col_number</i><b>)</b>
Chris@49 3021 </td>
Chris@49 3022 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3023 </td>
Chris@49 3024 <td style="vertical-align: top;">
Chris@49 3025 iterator referring to the first element of the specified column
Chris@49 3026 </td>
Chris@49 3027 </tr>
Chris@49 3028 <tr>
Chris@49 3029 <td style="vertical-align: top;">
Chris@49 3030 <b>.end_col(</b><i>col_number</i><b>)</b>
Chris@49 3031 </td>
Chris@49 3032 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3033 </td>
Chris@49 3034 <td style="vertical-align: top;">
Chris@49 3035 iterator referring to the <i>past-the-end</i> element of the specified column
Chris@49 3036 </td>
Chris@49 3037 </tr>
Chris@49 3038 </tbody>
Chris@49 3039 </table>
Chris@49 3040 </ul>
Chris@49 3041 </li>
Chris@49 3042 <br>
Chris@49 3043 <br>
Chris@49 3044 <li>
Chris@49 3045 Examples:
Chris@49 3046 <ul>
Chris@49 3047 <pre>
Chris@49 3048 mat X = randu&lt;mat&gt;(5,5);
Chris@49 3049
Chris@49 3050
Chris@49 3051 mat::iterator a = X.begin();
Chris@49 3052 mat::iterator b = X.end();
Chris@49 3053
Chris@49 3054 for(mat::iterator i=a; i!=b; ++i)
Chris@49 3055 {
Chris@49 3056 cout &lt;&lt; *i &lt;&lt; endl;
Chris@49 3057 }
Chris@49 3058
Chris@49 3059
Chris@49 3060 mat::col_iterator c = X.begin_col(1); // start of column 1
Chris@49 3061 mat::col_iterator d = X.end_col(3); // end of column 3
Chris@49 3062
Chris@49 3063 for(mat::col_iterator i=c; i!=d; ++i)
Chris@49 3064 {
Chris@49 3065 cout &lt;&lt; *i &lt;&lt; endl;
Chris@49 3066 (*i) = 123.0;
Chris@49 3067 }
Chris@49 3068 </pre>
Chris@49 3069 </ul>
Chris@49 3070 </li>
Chris@49 3071 <br>
Chris@49 3072 <li>
Chris@49 3073 See also:
Chris@49 3074 <ul>
Chris@49 3075 <li><a href="#stl_container_fns">STL container functions</a></li>
Chris@49 3076 <li><a href="http://cplusplus.com/reference/std/iterator/">iterator at cplusplus.com</a></li>
Chris@49 3077 <li><a href="#element_access">element access</a></li>
Chris@49 3078 <li><a href="#memptr">.memptr()</a></li>
Chris@49 3079 <li><a href="#colptr">.colptr()</a></li>
Chris@49 3080 <li><a href="#submat">submatrix views</a></li>
Chris@49 3081 </ul>
Chris@49 3082 </li>
Chris@49 3083 <br>
Chris@49 3084 </ul>
Chris@49 3085 <hr class="greyline"><br>
Chris@49 3086
Chris@49 3087 <a name="iterators_cube"></a>
Chris@49 3088 <b>iterators (cubes)</b>
Chris@49 3089 <ul>
Chris@49 3090 <li>
Chris@49 3091 STL-style iterators and associated member functions of the <i>Cube</i> class
Chris@49 3092 </li>
Chris@49 3093 <br>
Chris@49 3094 <li>
Chris@49 3095 iterator types:
Chris@49 3096 <br>
Chris@49 3097 <br>
Chris@49 3098 <ul>
Chris@49 3099 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 3100 <tbody>
Chris@49 3101 <tr>
Chris@49 3102 <td style="vertical-align: top;">
Chris@49 3103 <b>cube::iterator</b>
Chris@49 3104 </td>
Chris@49 3105 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3106 </td>
Chris@49 3107 <td style="vertical-align: top;">
Chris@49 3108 random access iterator, for read/write access to elements;
Chris@49 3109 the elements are ordered slice by slice;
Chris@49 3110 the elements within each slice are ordered column by column
Chris@49 3111 </td>
Chris@49 3112 </tr>
Chris@49 3113 <tr>
Chris@49 3114 <td style="vertical-align: top;">
Chris@49 3115 &nbsp;
Chris@49 3116 </td>
Chris@49 3117 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3118 </td>
Chris@49 3119 <td style="vertical-align: top;">
Chris@49 3120 &nbsp;
Chris@49 3121 </td>
Chris@49 3122 </tr>
Chris@49 3123 <tr>
Chris@49 3124 <td style="vertical-align: top;">
Chris@49 3125 <b>cube::const_iterator</b>
Chris@49 3126 </td>
Chris@49 3127 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3128 </td>
Chris@49 3129 <td style="vertical-align: top;">
Chris@49 3130 random access iterators, for read-only access to elements
Chris@49 3131 </td>
Chris@49 3132 </tr>
Chris@49 3133 <tr>
Chris@49 3134 <td style="vertical-align: top;">
Chris@49 3135 &nbsp;
Chris@49 3136 </td>
Chris@49 3137 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3138 </td>
Chris@49 3139 <td style="vertical-align: top;">
Chris@49 3140 &nbsp;
Chris@49 3141 </td>
Chris@49 3142 </tr>
Chris@49 3143 <tr>
Chris@49 3144 <td style="vertical-align: top;">
Chris@49 3145 <b>cube::slice_iterator</b>
Chris@49 3146 </td>
Chris@49 3147 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3148 </td>
Chris@49 3149 <td style="vertical-align: top;">
Chris@49 3150 random access iterator, for read/write access to the elements of a particular slice;
Chris@49 3151 the elements are ordered column by column
Chris@49 3152 </td>
Chris@49 3153 </tr>
Chris@49 3154 <tr>
Chris@49 3155 <td style="vertical-align: top;">
Chris@49 3156 &nbsp;
Chris@49 3157 </td>
Chris@49 3158 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3159 </td>
Chris@49 3160 <td style="vertical-align: top;">
Chris@49 3161 &nbsp;
Chris@49 3162 </td>
Chris@49 3163 </tr>
Chris@49 3164 <tr>
Chris@49 3165 <td style="vertical-align: top;">
Chris@49 3166 <b>cube::const_slice_iterator</b>
Chris@49 3167 </td>
Chris@49 3168 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3169 </td>
Chris@49 3170 <td style="vertical-align: top;">
Chris@49 3171 random access iterators, for read-only access to the elements of a particular slice
Chris@49 3172 </td>
Chris@49 3173 </tr>
Chris@49 3174 </tbody>
Chris@49 3175 </table>
Chris@49 3176 </ul>
Chris@49 3177 </li>
Chris@49 3178 <br>
Chris@49 3179 <br>
Chris@49 3180 <li>
Chris@49 3181 Member functions:
Chris@49 3182 <br>
Chris@49 3183 <br>
Chris@49 3184 <ul>
Chris@49 3185 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 3186 <tbody>
Chris@49 3187 <tr>
Chris@49 3188 <td style="vertical-align: top;">
Chris@49 3189 <b>.begin()</b>
Chris@49 3190 </td>
Chris@49 3191 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3192 </td>
Chris@49 3193 <td style="vertical-align: top;">
Chris@49 3194 iterator referring to the first element
Chris@49 3195 </td>
Chris@49 3196 </tr>
Chris@49 3197 <tr>
Chris@49 3198 <td style="vertical-align: top;">
Chris@49 3199 <b>.end()</b>
Chris@49 3200 </td>
Chris@49 3201 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3202 </td>
Chris@49 3203 <td style="vertical-align: top;">
Chris@49 3204 iterator referring to the <i>past-the-end</i> element
Chris@49 3205 </td>
Chris@49 3206 </tr>
Chris@49 3207 <tr>
Chris@49 3208 <td>
Chris@49 3209 &nbsp;
Chris@49 3210 </td>
Chris@49 3211 </tr>
Chris@49 3212 <tr>
Chris@49 3213 <td style="vertical-align: top;">
Chris@49 3214 <b>.begin_slice(</b><i>slice_number</i><b>)</b>
Chris@49 3215 </td>
Chris@49 3216 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3217 </td>
Chris@49 3218 <td style="vertical-align: top;">
Chris@49 3219 iterator referring to the first element of the specified slice
Chris@49 3220 </td>
Chris@49 3221 </tr>
Chris@49 3222 <tr>
Chris@49 3223 <td style="vertical-align: top;">
Chris@49 3224 <b>.end_slice(</b><i>slice_number</i><b>)</b>
Chris@49 3225 </td>
Chris@49 3226 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 3227 </td>
Chris@49 3228 <td style="vertical-align: top;">
Chris@49 3229 iterator referring to the <i>past-the-end</i> element of the specified slice
Chris@49 3230 </td>
Chris@49 3231 </tr>
Chris@49 3232 </tbody>
Chris@49 3233 </table>
Chris@49 3234 </ul>
Chris@49 3235 </li>
Chris@49 3236 <br>
Chris@49 3237 <br>
Chris@49 3238 <li>
Chris@49 3239 Examples:
Chris@49 3240 <ul>
Chris@49 3241 <pre>
Chris@49 3242 cube X = randu&lt;cube&gt;(2,3,4);
Chris@49 3243
Chris@49 3244
Chris@49 3245 cube::iterator a = X.begin();
Chris@49 3246 cube::iterator b = X.end();
Chris@49 3247
Chris@49 3248 for(cube::iterator i=a; i!=b; ++i)
Chris@49 3249 {
Chris@49 3250 cout &lt;&lt; *i &lt;&lt; endl;
Chris@49 3251 }
Chris@49 3252
Chris@49 3253
Chris@49 3254 cube::slice_iterator c = X.begin_slice(1); // start of slice 1
Chris@49 3255 cube::slice_iterator d = X.end_slice(2); // end of slice 2
Chris@49 3256
Chris@49 3257 for(cube::slice_iterator i=c; i!=d; ++i)
Chris@49 3258 {
Chris@49 3259 cout &lt;&lt; *i &lt;&lt; endl;
Chris@49 3260 (*i) = 123.0;
Chris@49 3261 }
Chris@49 3262 </pre>
Chris@49 3263 </ul>
Chris@49 3264 </li>
Chris@49 3265 <br>
Chris@49 3266 <li>
Chris@49 3267 See also:
Chris@49 3268 <ul>
Chris@49 3269 <li><a href="http://cplusplus.com/reference/std/iterator/">iterator at cplusplus.com</a></li>
Chris@49 3270 <li><a href="#element_access">element access</a></li>
Chris@49 3271 </ul>
Chris@49 3272 </li>
Chris@49 3273 <br>
Chris@49 3274 </ul>
Chris@49 3275 <hr class="greyline"><br>
Chris@49 3276
Chris@49 3277 <a name="memptr"></a>
Chris@49 3278 <b>.memptr()</b>
Chris@49 3279 <ul>
Chris@49 3280 <li>
Chris@49 3281 Member function of <i>Mat</i>, <i>Col</i>, <i>Row</i> and <i>Cube</i> classes
Chris@49 3282 </li>
Chris@49 3283 <br>
Chris@49 3284 <li>
Chris@49 3285 Obtain a raw pointer to the memory used for storing elements. Not recommended for use unless you know what you're doing!
Chris@49 3286 </li>
Chris@49 3287 <br>
Chris@49 3288 <li>
Chris@49 3289 The function can be used for interfacing with libraries such as <a href="http://www.fftw.org/">FFTW</a>
Chris@49 3290 </li>
Chris@49 3291 <br>
Chris@49 3292 <li>
Chris@49 3293 As soon as the size of the matrix/vector/cube is changed, the pointer is no longer valid
Chris@49 3294 </li>
Chris@49 3295 <br>
Chris@49 3296 <li>
Chris@49 3297 Data for matrices is stored in a column-by-column order
Chris@49 3298 </li>
Chris@49 3299 <br>
Chris@49 3300 <li>
Chris@49 3301 Data for cubes is stored in a slice-by-slice (matrix-by-matrix) order
Chris@49 3302 </li>
Chris@49 3303 <br>
Chris@49 3304 <li>
Chris@49 3305 Examples:
Chris@49 3306 <ul>
Chris@49 3307 <pre>
Chris@49 3308 mat A = randu&lt;mat&gt;(5,5);
Chris@49 3309 const mat B = randu&lt;mat&gt;(5,5);
Chris@49 3310
Chris@49 3311 double* A_mem = A.memptr();
Chris@49 3312 const double* B_mem = B.memptr();
Chris@49 3313 </pre>
Chris@49 3314 </ul>
Chris@49 3315 </li>
Chris@49 3316 <br>
Chris@49 3317 <li>
Chris@49 3318 See also:
Chris@49 3319 <ul>
Chris@49 3320 <li><a href="#colptr">.colptr()</a></li>
Chris@49 3321 <li><a href="#element_access">element_access</a></li>
Chris@49 3322 <li><a href="#iterators_mat">iterators (matrices)</a></li>
Chris@49 3323 <li><a href="#iterators_cube">iterators (cubes)</a></li>
Chris@49 3324 <li><a href="#adv_constructors_mat">advanced constructors (matrices)</a></li>
Chris@49 3325 <li><a href="#adv_constructors_cube">advanced constructors (cubes)</a></li>
Chris@49 3326 </ul>
Chris@49 3327 </li>
Chris@49 3328 <br>
Chris@49 3329 </ul>
Chris@49 3330 <hr class="greyline"><br>
Chris@49 3331
Chris@49 3332 <a name="min_and_max_member"></a>
Chris@49 3333 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 3334 <tbody>
Chris@49 3335 <tr>
Chris@49 3336 <td style="vertical-align: top;"><b>.min()</b></td>
Chris@49 3337 <td style="vertical-align: top;"><br>
Chris@49 3338 </td>
Chris@49 3339 <td style="vertical-align: top;">(member functions of <i>Mat</i>, <i>Col</i>, <i>Row</i>, <i>Cube</i>)
Chris@49 3340 </td>
Chris@49 3341 </tr>
Chris@49 3342 <tr>
Chris@49 3343 <td style="vertical-align: top;"><b>.max()</b></td>
Chris@49 3344 <td style="vertical-align: top;"><br>
Chris@49 3345 </td>
Chris@49 3346 <td style="vertical-align: top;">&nbsp;
Chris@49 3347 </td>
Chris@49 3348 </tr>
Chris@49 3349 <tr>
Chris@49 3350 <td style="vertical-align: top;">&nbsp;</td>
Chris@49 3351 <td style="vertical-align: top;"><br>
Chris@49 3352 </td>
Chris@49 3353 <td style="vertical-align: top;">&nbsp;
Chris@49 3354 </td>
Chris@49 3355 </tr>
Chris@49 3356 <tr>
Chris@49 3357 <td style="vertical-align: top;"><b>.min(</b>&nbsp;index_of_min_val&nbsp;<b>)</b></td>
Chris@49 3358 <td style="vertical-align: top;"><br>
Chris@49 3359 </td>
Chris@49 3360 <td style="vertical-align: top;">(member functions of <i>Mat</i>, <i>Col</i>, <i>Row</i>, <i>Cube</i>)
Chris@49 3361 </td>
Chris@49 3362 </tr>
Chris@49 3363 <tr>
Chris@49 3364 <td style="vertical-align: top;"><b>.max(</b>&nbsp;index_of_max_val&nbsp;<b>)</b></td>
Chris@49 3365 <td style="vertical-align: top;"><br>
Chris@49 3366 </td>
Chris@49 3367 <td style="vertical-align: top;">&nbsp;
Chris@49 3368 </td>
Chris@49 3369 </tr>
Chris@49 3370 <tr>
Chris@49 3371 <td style="vertical-align: top;">&nbsp;</td>
Chris@49 3372 <td style="vertical-align: top;"><br>
Chris@49 3373 </td>
Chris@49 3374 <td style="vertical-align: top;">&nbsp;
Chris@49 3375 </td>
Chris@49 3376 </tr>
Chris@49 3377 <tr>
Chris@49 3378 <td style="vertical-align: top;"><b>.min(</b>&nbsp;row_of_min_val<b>,</b> col_of_min_val&nbsp;<b>)</b></td>
Chris@49 3379 <td style="vertical-align: top;"><br>
Chris@49 3380 </td>
Chris@49 3381 <td style="vertical-align: top;">(member functions of <i>Mat</i>)
Chris@49 3382 </td>
Chris@49 3383 </tr>
Chris@49 3384 <tr>
Chris@49 3385 <td style="vertical-align: top;"><b>.max(</b>&nbsp;row_of_max_val<b>,</b> col_of_max_val&nbsp;<b>)</b></td>
Chris@49 3386 <td style="vertical-align: top;"><br>
Chris@49 3387 </td>
Chris@49 3388 <td style="vertical-align: top;">&nbsp;
Chris@49 3389 </td>
Chris@49 3390 </tr>
Chris@49 3391 <tr>
Chris@49 3392 <td style="vertical-align: top;">&nbsp;</td>
Chris@49 3393 <td style="vertical-align: top;"><br>
Chris@49 3394 </td>
Chris@49 3395 <td style="vertical-align: top;">&nbsp;
Chris@49 3396 </td>
Chris@49 3397 </tr>
Chris@49 3398 <tr>
Chris@49 3399 <td style="vertical-align: top;"><b>.min(</b>&nbsp;row_of_min_val<b>,</b> col_of_min_val<b>,</b> slice_of_min_val&nbsp;<b>)</b></td>
Chris@49 3400 <td style="vertical-align: top;"><br>
Chris@49 3401 </td>
Chris@49 3402 <td style="vertical-align: top;">(member functions of <i>Cube</i>)
Chris@49 3403 </td>
Chris@49 3404 </tr>
Chris@49 3405 <tr>
Chris@49 3406 <td style="vertical-align: top;"><b>.max(</b>&nbsp;row_of_max_val<b>,</b> col_of_max_val<b>,</b> slice_of_max_val&nbsp;<b>)</b></td>
Chris@49 3407 <td style="vertical-align: top;"><br>
Chris@49 3408 </td>
Chris@49 3409 <td style="vertical-align: top;">&nbsp;
Chris@49 3410 </td>
Chris@49 3411 </tr>
Chris@49 3412 </tbody>
Chris@49 3413 </table>
Chris@49 3414 <ul>
Chris@49 3415 <br>
Chris@49 3416 <li>
Chris@49 3417 Without arguments: return the extremum value of an object
Chris@49 3418 </li>
Chris@49 3419 <br>
Chris@49 3420 <li>
Chris@49 3421 With one or more arguments: return the extremum value of an object and store the location of the extremum value in the provided variable(s)
Chris@49 3422 </li>
Chris@49 3423 <br>
Chris@49 3424 <li>
Chris@49 3425 The provided variables must be of type <a href="#uword">uword</a>.
Chris@49 3426 </li>
Chris@49 3427 <br>
Chris@49 3428 <li>
Chris@49 3429 Examples:
Chris@49 3430 <ul>
Chris@49 3431 <pre>
Chris@49 3432 vec v = randu&lt;vec&gt;(10);
Chris@49 3433
Chris@49 3434 cout &lt;&lt; "min value is " &lt;&lt; v.min() &lt;&lt; endl;
Chris@49 3435
Chris@49 3436
Chris@49 3437 uword index;
Chris@49 3438 double min_val = v.min(index);
Chris@49 3439
Chris@49 3440 cout &lt;&lt; "index of min value is " &lt;&lt; index &lt;&lt; endl;
Chris@49 3441
Chris@49 3442
Chris@49 3443 mat A = randu&lt;mat&gt;(5,5);
Chris@49 3444
Chris@49 3445 uword row;
Chris@49 3446 uword col;
Chris@49 3447 double min_val2 = A.max(row,col);
Chris@49 3448
Chris@49 3449 cout &lt;&lt; "max value is at " &lt;&lt; row &lt;&lt; ',' &lt;&lt; col &lt;&lt; endl;
Chris@49 3450 </pre>
Chris@49 3451 </ul>
Chris@49 3452 </li>
Chris@49 3453 <br>
Chris@49 3454 <li>
Chris@49 3455 See also:
Chris@49 3456 <ul>
Chris@49 3457 <li><a href="#min_and_max">min() &amp; max()</a> (standalone functions)</li>
Chris@49 3458 <li><a href="#running_stat">running_stat</a></li>
Chris@49 3459 <li><a href="#running_stat_vec">running_stat_vec</a></li>
Chris@49 3460 </ul>
Chris@49 3461 </li>
Chris@49 3462 <br>
Chris@49 3463 </ul>
Chris@49 3464 <hr class="greyline"><br>
Chris@49 3465
Chris@49 3466 <a name="ones_member"></a>
Chris@49 3467 <b>.ones()</b>
Chris@49 3468 <br><b>.ones(n_elem)</b>
Chris@49 3469 <br><b>.ones(n_rows, n_cols)</b>
Chris@49 3470 <br><b>.ones(n_rows, n_cols, n_slices)</b>
Chris@49 3471 <ul>
Chris@49 3472 <li>
Chris@49 3473 Set the elements of an object to one, optionally first resizing to specified dimensions
Chris@49 3474 </li>
Chris@49 3475 <br>
Chris@49 3476 <li>
Chris@49 3477 <i>.ones()</i> and <i>.ones(n_elem)</i> are member functions of <i>Col</i> and <i>Row</i>
Chris@49 3478 </li>
Chris@49 3479 <br>
Chris@49 3480 <li>
Chris@49 3481 <i>.ones()</i> and <i>.ones(n_rows, n_cols)</i> are member functions of <i>Mat</i>
Chris@49 3482 </li>
Chris@49 3483 <br>
Chris@49 3484 <li>
Chris@49 3485 <i>.ones()</i> and <i>.ones(n_rows, n_cols, n_slices)</i> are member functions of <i>Cube</i>
Chris@49 3486 </li>
Chris@49 3487 <br>
Chris@49 3488 <li>
Chris@49 3489 Examples:
Chris@49 3490 <ul>
Chris@49 3491 <pre>
Chris@49 3492 mat A = randu&lt;mat&gt;(5,10);
Chris@49 3493 A.ones(); // sets all elements to one
Chris@49 3494 A.ones(10,20); // sets the size to 10 rows and 20 columns
Chris@49 3495 // followed by setting all elements to one
Chris@49 3496 </pre>
Chris@49 3497 </ul>
Chris@49 3498 </li>
Chris@49 3499 <br>
Chris@49 3500 <li>
Chris@49 3501 See also:
Chris@49 3502 <ul>
Chris@49 3503 <li><a href="#ones_standalone">ones()</a> (standalone function)</li>
Chris@49 3504 <li><a href="#eye_member">.eye()</a></li>
Chris@49 3505 <li><a href="#zeros_member">.zeros()</a></li>
Chris@49 3506 <li><a href="#fill">.fill()</a></li>
Chris@49 3507 <li><a href="#imbue">.imbue()</a></li>
Chris@49 3508 <li><a href="#randu_randn_member">.randu()</a></li>
Chris@49 3509 </ul>
Chris@49 3510 </li>
Chris@49 3511 <br>
Chris@49 3512 </ul>
Chris@49 3513 <hr class="greyline"><br>
Chris@49 3514
Chris@49 3515 <a name="operators"></a>
Chris@49 3516 <b>operators: &nbsp; + &nbsp; - &nbsp; * &nbsp; / &nbsp; % &nbsp; == &nbsp; != &nbsp; &lt;= &nbsp; &gt;= &nbsp; &lt; &nbsp; &gt;</b>
Chris@49 3517 <ul>
Chris@49 3518 <li>
Chris@49 3519 Overloaded operators for <i>mat</i>, <i>vec</i>, <i>rowvec</i> and <i>cube</i> classes
Chris@49 3520 </li>
Chris@49 3521 <br>
Chris@49 3522 <li>
Chris@49 3523 Meanings:
Chris@49 3524 <br>
Chris@49 3525 <br>
Chris@49 3526 <ul>
Chris@49 3527 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 3528 <tbody>
Chris@49 3529 <tr>
Chris@49 3530 <td style="vertical-align: top;"><b>+</b></td>
Chris@49 3531 <td style="vertical-align: top;">&nbsp;&nbsp;&nbsp;<br>
Chris@49 3532 </td>
Chris@49 3533 <td style="vertical-align: top;">Addition of two objects</td>
Chris@49 3534 </tr>
Chris@49 3535 <tr>
Chris@49 3536 <td style="vertical-align: top;"><b>-</b></td>
Chris@49 3537 <td style="vertical-align: top;"><br>
Chris@49 3538 </td>
Chris@49 3539 <td style="vertical-align: top;">Subtraction of one object from another or negation of an object</td>
Chris@49 3540 </tr>
Chris@49 3541 <tr>
Chris@49 3542 <td style="vertical-align: top;"><b>/</b></td>
Chris@49 3543 <td style="vertical-align: top;"><br>
Chris@49 3544 </td>
Chris@49 3545 <td style="vertical-align: top;">Element-wise division of an object by another object or a scalar</td>
Chris@49 3546 </tr>
Chris@49 3547 <tr>
Chris@49 3548 <td style="vertical-align: top;"><b>*</b></td>
Chris@49 3549 <td style="vertical-align: top;"><br>
Chris@49 3550 </td>
Chris@49 3551 <td style="vertical-align: top;">Matrix multiplication of two objects; not applicable to the <i>cube</i> class unless multiplying a cube by a scalar</td>
Chris@49 3552 </tr>
Chris@49 3553 <tr>
Chris@49 3554 <td style="vertical-align: top;"><b>%</b></td>
Chris@49 3555 <td style="vertical-align: top;"><br>
Chris@49 3556 </td>
Chris@49 3557 <td style="vertical-align: top;"><a name="schur_product"></a>Schur product: element-wise multiplication of two objects</td>
Chris@49 3558 </tr>
Chris@49 3559 <tr>
Chris@49 3560 <td style="vertical-align: top;"><b>==</b></td>
Chris@49 3561 <td style="vertical-align: top;"><br>
Chris@49 3562 </td>
Chris@49 3563 <td style="vertical-align: top;">Element-wise equality evaluation of two objects; generates a matrix of type <i>umat</i> with entries that indicate whether at a given position the two elements from the two objects are equal (1) or not equal (0)</td>
Chris@49 3564 </tr>
Chris@49 3565 <tr>
Chris@49 3566 <td style="vertical-align: top;"><b>!=</b></td>
Chris@49 3567 <td style="vertical-align: top;"><br>
Chris@49 3568 </td>
Chris@49 3569 <td style="vertical-align: top;">Element-wise non-equality evaluation of two objects</td>
Chris@49 3570 </tr>
Chris@49 3571 <tr>
Chris@49 3572 <td style="vertical-align: top;"><b>&gt;=</b></td>
Chris@49 3573 <td style="vertical-align: top;"><br>
Chris@49 3574 </td>
Chris@49 3575 <td style="vertical-align: top;">As for ==, but the check is for "greater than or equal to"</td>
Chris@49 3576 </tr>
Chris@49 3577 <tr>
Chris@49 3578 <td style="vertical-align: top;"><b>&lt;=</b></td>
Chris@49 3579 <td style="vertical-align: top;"><br>
Chris@49 3580 </td>
Chris@49 3581 <td style="vertical-align: top;">As for ==, but the check is for "less than or equal to"</td>
Chris@49 3582 </tr>
Chris@49 3583 <tr>
Chris@49 3584 <td style="vertical-align: top;"><b>&gt;</b></td>
Chris@49 3585 <td style="vertical-align: top;"><br>
Chris@49 3586 </td>
Chris@49 3587 <td style="vertical-align: top;">As for ==, but the check is for "greater than"</td>
Chris@49 3588 </tr>
Chris@49 3589 <tr>
Chris@49 3590 <td style="vertical-align: top;"><b>&lt;</b></td>
Chris@49 3591 <td style="vertical-align: top;"><br>
Chris@49 3592 </td>
Chris@49 3593 <td style="vertical-align: top;">As for ==, but the check is for "less than"</td>
Chris@49 3594 </tr>
Chris@49 3595 </tbody>
Chris@49 3596 </table>
Chris@49 3597 </ul>
Chris@49 3598 </li>
Chris@49 3599 <br>
Chris@49 3600 <li>
Chris@49 3601 A <i>std::logic_error</i> exception is thrown if incompatible object sizes are used
Chris@49 3602 </li>
Chris@49 3603 <br>
Chris@49 3604 <li>
Chris@49 3605 If the +, - and % operators are chained, Armadillo will try to avoid the generation of temporaries;
Chris@49 3606 no temporaries are generated if all given objects are of the same type and size
Chris@49 3607 </li>
Chris@49 3608 <br>
Chris@49 3609 <li>
Chris@49 3610 If the * operator is chained, Armadillo will try to find an efficient ordering of the matrix multiplications
Chris@49 3611 </li>
Chris@49 3612 <br>
Chris@49 3613 <li>
Chris@49 3614 <b>Caveat:</b> operators involving an equality comparison (ie., ==, !=, &gt;=, &lt;=)
Chris@49 3615 may not work as expected for floating point element types (ie., <i>float</i>, <i>double</i>)
Chris@49 3616 due to the necessarily limited precision of these types;
Chris@49 3617 in other words, these operators are (in general) not recommended for matrices of type <i>mat</i> or <i>fmat</i>
Chris@49 3618 </li>
Chris@49 3619 <br>
Chris@49 3620 <br>
Chris@49 3621 <li>
Chris@49 3622 Examples:
Chris@49 3623 <ul>
Chris@49 3624 <pre>
Chris@49 3625 mat A = randu&lt;mat&gt;(5,10);
Chris@49 3626 mat B = randu&lt;mat&gt;(5,10);
Chris@49 3627 mat C = randu&lt;mat&gt;(10,5);
Chris@49 3628
Chris@49 3629 mat P = A + B;
Chris@49 3630 mat Q = A - B;
Chris@49 3631 mat R = -B;
Chris@49 3632 mat S = A / 123.0;
Chris@49 3633 mat T = A % B;
Chris@49 3634 mat U = A * C;
Chris@49 3635
Chris@49 3636 // V is constructed without temporaries
Chris@49 3637 mat V = A + B + A + B;
Chris@49 3638
Chris@49 3639 imat AA = "1 2 3; 4 5 6; 7 8 9;";
Chris@49 3640 imat BB = "3 2 1; 6 5 4; 9 8 7;";
Chris@49 3641
Chris@49 3642 // compare elements
Chris@49 3643 umat ZZ = (AA >= BB);
Chris@49 3644 </pre>
Chris@49 3645 </ul>
Chris@49 3646 </li>
Chris@49 3647 <br>
Chris@49 3648 <li>
Chris@49 3649 See also:
Chris@49 3650 <ul>
Chris@49 3651 <li><a href="#accu">accu()</a></li>
Chris@49 3652 <li><a href="#as_scalar">as_scalar()</a></li>
Chris@49 3653 <li><a href="#find">find()</a></li>
Chris@49 3654 <li><a href="#transform">.transform()</a></li>
Chris@49 3655 </ul>
Chris@49 3656 </li>
Chris@49 3657 <br>
Chris@49 3658 </ul>
Chris@49 3659 <hr class="greyline"><br>
Chris@49 3660
Chris@49 3661 <a name="print"></a>
Chris@49 3662 <b>.print(header="")</b>
Chris@49 3663 <br><b>.print(stream, header="")</b>
Chris@49 3664 <ul>
Chris@49 3665 <li>
Chris@49 3666 Member function of <i>Mat</i>, <i>Col</i>, <i>Row</i>, <i>Cube</i> and <i>field</i>
Chris@49 3667 </li>
Chris@49 3668 <br>
Chris@49 3669 <li>
Chris@49 3670 The first form prints the contents of an object to the <i>std::cout</i> stream, with an optional header line
Chris@49 3671 </li>
Chris@49 3672 <br>
Chris@49 3673 <li>
Chris@49 3674 The second form prints to a user specified stream
Chris@49 3675 </li>
Chris@49 3676 <br>
Chris@49 3677 <li>
Chris@49 3678 It's also possible to print objects using the &lt;&lt; stream operator
Chris@49 3679 </li>
Chris@49 3680 <br>
Chris@49 3681 <li>
Chris@49 3682 Elements of a field can only be printed if there is an associated <i>operator&lt;&lt;</i> function defined
Chris@49 3683 </li>
Chris@49 3684 <br>
Chris@49 3685 <li>
Chris@49 3686 Examples:
Chris@49 3687 <ul>
Chris@49 3688 <pre>
Chris@49 3689 mat A = randu&lt;mat&gt;(5,5);
Chris@49 3690 mat B = randu&lt;mat&gt;(6,6);
Chris@49 3691
Chris@49 3692 A.print();
Chris@49 3693
Chris@49 3694 // print a transposed version of A
Chris@49 3695 A.t().print();
Chris@49 3696
Chris@49 3697 // "B:" is the optional header line
Chris@49 3698 B.print("B:");
Chris@49 3699
Chris@49 3700 cout &lt;&lt; A &lt;&lt; endl;
Chris@49 3701 cout &lt;&lt; "B:" &lt;&lt; endl &lt;&lt; B &lt;&lt; endl;
Chris@49 3702 </pre>
Chris@49 3703 </ul>
Chris@49 3704 </li>
Chris@49 3705 <br>
Chris@49 3706 <li>
Chris@49 3707 See also:
Chris@49 3708 <ul>
Chris@49 3709 <li><a href="#raw_print">.raw_print()</a></li>
Chris@49 3710 <li><a href="#save_load_mat">saving &amp; loading matrices</a></li>
Chris@49 3711 <li><a href="#element_initialisation">initialising elements</a></li>
Chris@49 3712 <li><a href="#logging">logging of errors and warnings</a></li>
Chris@49 3713 </ul>
Chris@49 3714 </li>
Chris@49 3715 <br>
Chris@49 3716 </ul>
Chris@49 3717 <hr class="greyline"><br>
Chris@49 3718
Chris@49 3719 <a name="raw_print"></a>
Chris@49 3720 <b>.raw_print(header="")</b>
Chris@49 3721 <br><b>.raw_print(stream, header="")</b>
Chris@49 3722 <ul>
Chris@49 3723 <li>
Chris@49 3724 Member function of <i>Mat</i>, <i>Col</i>, <i>Row</i> and <i>Cube</i>
Chris@49 3725 </li>
Chris@49 3726 <br>
Chris@49 3727 <li>
Chris@49 3728 Similar to the <a href="#print">.print()</a> member function,
Chris@49 3729 with the difference being that no formatting of the output is done -- ie. the user can set the stream's parameters such as precision, cell width, etc.
Chris@49 3730 </li>
Chris@49 3731 <br>
Chris@49 3732 <li>
Chris@49 3733 If the cell width is set to zero, a space is printed between the elements
Chris@49 3734 </li>
Chris@49 3735 <br>
Chris@49 3736 <li>
Chris@49 3737 Examples:
Chris@49 3738 <ul>
Chris@49 3739 <pre>
Chris@49 3740 mat A = randu&lt;mat&gt;(5,5);
Chris@49 3741
Chris@49 3742 cout.precision(11);
Chris@49 3743 cout.setf(ios::fixed);
Chris@49 3744
Chris@49 3745 A.raw_print(cout, "A =");
Chris@49 3746 </pre>
Chris@49 3747 </ul>
Chris@49 3748 </li>
Chris@49 3749 </ul>
Chris@49 3750 <br>
Chris@49 3751 <hr class="greyline"><br>
Chris@49 3752
Chris@49 3753 <a name="randu_randn_member"></a>
Chris@49 3754 <b>.randu()</b>
Chris@49 3755 <br><b>.randu(n_elem)</b>
Chris@49 3756 <br><b>.randu(n_rows, n_cols)</b>
Chris@49 3757 <br><b>.randu(n_rows, n_cols, n_slices)</b>
Chris@49 3758 <br>
Chris@49 3759 <br>
Chris@49 3760 <b>.randn()</b>
Chris@49 3761 <br><b>.randn(n_elem)</b>
Chris@49 3762 <br><b>.randn(n_rows, n_cols)</b>
Chris@49 3763 <br><b>.randn(n_rows, n_cols, n_slices)</b>
Chris@49 3764 <ul>
Chris@49 3765 <li>
Chris@49 3766 Fill an object with random values, optionally first resizing to specified dimensions
Chris@49 3767 </li>
Chris@49 3768 <br>
Chris@49 3769 <li><i>.randu()</i> uses a uniform distribution in the [0,1] interval
Chris@49 3770 </li>
Chris@49 3771 <br>
Chris@49 3772 <li><i>.randn()</i> uses a normal/Gaussian distribution with zero mean and unit variance
Chris@49 3773 </li>
Chris@49 3774 <br>
Chris@49 3775 <li>
Chris@49 3776 To change the seed, use the <a href="http://cplusplus.com/reference/clibrary/cstdlib/srand/">std::srand()</a> function
Chris@49 3777 </li>
Chris@49 3778 <br>
Chris@49 3779 <li>
Chris@49 3780 Examples:
Chris@49 3781 <ul>
Chris@49 3782 <pre>
Chris@49 3783 mat A(4,5);
Chris@49 3784 A.randu();
Chris@49 3785
Chris@49 3786 mat B;
Chris@49 3787 B.randu(6,7);
Chris@49 3788 </pre>
Chris@49 3789 </ul>
Chris@49 3790 </li>
Chris@49 3791 <br>
Chris@49 3792 <li>
Chris@49 3793 See also:
Chris@49 3794 <ul>
Chris@49 3795 <li><a href="#randu_randn_standalone">randu() &amp; randn()</a> (standalone functions)</li>
Chris@49 3796 <li><a href="#fill">.fill()</a></li>
Chris@49 3797 <li><a href="#imbue">.imbue()</a></li>
Chris@49 3798 <li><a href="#ones_member">.ones()</a></li>
Chris@49 3799 <li><a href="#zeros_member">.zeros()</a></li>
Chris@49 3800 <li><a href="http://cplusplus.com/reference/clibrary/cstdlib/srand/">std::srand()</a></li>
Chris@49 3801 </ul>
Chris@49 3802 </li>
Chris@49 3803 <br>
Chris@49 3804 </ul>
Chris@49 3805 <hr class="greyline"><br>
Chris@49 3806
Chris@49 3807 <a name="reset"></a>
Chris@49 3808 <b>
Chris@49 3809 .reset()
Chris@49 3810 </b>
Chris@49 3811 <ul>
Chris@49 3812 <li>
Chris@49 3813 Member function of <i>Mat</i>, <i>Col</i>, <i>Row</i>, <i>Cube</i> and <i>field</i>
Chris@49 3814 </li>
Chris@49 3815 <br>
Chris@49 3816 <li>
Chris@49 3817 Causes an object to have no elements
Chris@49 3818 </li>
Chris@49 3819 <br>
Chris@49 3820 <li>
Chris@49 3821 Examples:
Chris@49 3822 <ul>
Chris@49 3823 <pre>
Chris@49 3824 mat A = randu&lt;mat&gt;(5, 5);
Chris@49 3825 A.reset();
Chris@49 3826 </pre>
Chris@49 3827 </ul>
Chris@49 3828 </li>
Chris@49 3829 <br>
Chris@49 3830 <li>See also:
Chris@49 3831 <ul>
Chris@49 3832 <li><a href="#set_size">.set_size()</a></li>
Chris@49 3833 <li><a href="#is_empty">.is_empty()</a></li>
Chris@49 3834 <li><a href="#zeros_member">.zeros()</a></li>
Chris@49 3835 </ul>
Chris@49 3836 </li>
Chris@49 3837 </ul>
Chris@49 3838 <br>
Chris@49 3839 <hr class="greyline"><br>
Chris@49 3840
Chris@49 3841 <a name="reshape_member"></a>
Chris@49 3842 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 3843 <tbody>
Chris@49 3844 <tr>
Chris@49 3845 <td style="vertical-align: top;"><b>.reshape(n_rows, n_cols, dim=0)</b></td>
Chris@49 3846 <td style="vertical-align: top;"><br>
Chris@49 3847 </td>
Chris@49 3848 <td style="vertical-align: top;">(member function of <i>Mat</i>, <i>Col</i>, <i>Row</i>)
Chris@49 3849 </td>
Chris@49 3850 </tr>
Chris@49 3851 <tr>
Chris@49 3852 <td style="vertical-align: top;"><b>.reshape(n_rows, n_cols, n_slices, dim=0)</b></td>
Chris@49 3853 <td style="vertical-align: top;"><br>
Chris@49 3854 </td>
Chris@49 3855 <td style="vertical-align: top;">(member function of <i>Cube</i>)
Chris@49 3856 </td>
Chris@49 3857 </tr>
Chris@49 3858 </tbody>
Chris@49 3859 </table>
Chris@49 3860 <br>
Chris@49 3861 <ul>
Chris@49 3862 <li>
Chris@49 3863 Recreate the object according to given size specifications,
Chris@49 3864 with the elements taken from the previous version of the object,
Chris@49 3865 either column-wise (dim=0) or row-wise (dim=1);
Chris@49 3866 the elements in the generated object are placed column-wise (ie. the first column is filled up before filling the second column)
Chris@49 3867 </li>
Chris@49 3868 <br>
Chris@49 3869 <li>
Chris@49 3870 The layout of the elements in the recreated object will be different to the layout in the previous version of the object
Chris@49 3871 </li>
Chris@49 3872 <br>
Chris@49 3873 <li>
Chris@49 3874 This function can be used to vectorise a matrix (ie. concatenate all the columns or rows)
Chris@49 3875 </li>
Chris@49 3876 <br>
Chris@49 3877 <li>
Chris@49 3878 The new total number of elements (according to the specified size) doesn't have to be the same as the previous total number of elements in the object
Chris@49 3879 </li>
Chris@49 3880 <br>
Chris@49 3881 <li>
Chris@49 3882 If the total number of elements in the previous version of the object is less than the specified size,
Chris@49 3883 the extra elements in the recreated object are set to zero
Chris@49 3884 </li>
Chris@49 3885 <br>
Chris@49 3886 <li>
Chris@49 3887 If the total number of elements in the previous version of the object is greater than the specified size,
Chris@49 3888 only a subset of the elements is taken
Chris@49 3889 </li>
Chris@49 3890 <br>
Chris@49 3891 <li>
Chris@49 3892 <b>Caveat:</b>
Chris@49 3893 .reshape() is slower than <a href="#set_size">.set_size()</a>, which doesn't preserve data
Chris@49 3894 </li>
Chris@49 3895 <br>
Chris@49 3896 <li>
Chris@49 3897 <b>Caveat:</b>
Chris@49 3898 if you wish to grow/shrink the object while preserving the elements <b>as well as</b> the layout of the elements,
Chris@49 3899 use <a href="#resize_member">.resize()</a> instead
Chris@49 3900 </li>
Chris@49 3901 <br>
Chris@49 3902 <li>
Chris@49 3903 Examples:
Chris@49 3904 <ul>
Chris@49 3905 <pre>
Chris@49 3906 mat A = randu&lt;mat&gt;(4,5);
Chris@49 3907 A.reshape(5,4);
Chris@49 3908
Chris@49 3909 // vectorise A into a column vector:
Chris@49 3910 A.reshape(A.n_elem, 1);
Chris@49 3911 </pre>
Chris@49 3912 </ul>
Chris@49 3913 </li>
Chris@49 3914 <br>
Chris@49 3915 <li>See also:
Chris@49 3916 <ul>
Chris@49 3917 <li><a href="#resize_member">.resize()</a></li>
Chris@49 3918 <li><a href="#set_size">.set_size()</a></li>
Chris@49 3919 <li><a href="#copy_size">.copy_size()</a></li>
Chris@49 3920 <li><a href="#zeros_member">.zeros()</a></li>
Chris@49 3921 <li><a href="#reset">.reset()</a></li>
Chris@49 3922 <li><a href="#reshape">reshape()</a> (standalone function)</li>
Chris@49 3923 </ul>
Chris@49 3924 </li>
Chris@49 3925 </ul>
Chris@49 3926 <br>
Chris@49 3927 <hr class="greyline"><br>
Chris@49 3928
Chris@49 3929 <a name="resize_member"></a>
Chris@49 3930 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 3931 <tbody>
Chris@49 3932 <tr>
Chris@49 3933 <td style="vertical-align: top;"><b>.resize(n_elem)</b></td>
Chris@49 3934 <td style="vertical-align: top;"><br>
Chris@49 3935 </td>
Chris@49 3936 <td style="vertical-align: top;">(member function of <i>Col</i>, <i>Row</i>)
Chris@49 3937 </td>
Chris@49 3938 </tr>
Chris@49 3939 <tr>
Chris@49 3940 <td style="vertical-align: top;"><b>.resize(n_rows, n_cols)</b></td>
Chris@49 3941 <td style="vertical-align: top;"><br>
Chris@49 3942 </td>
Chris@49 3943 <td style="vertical-align: top;">(member function of <i>Mat</i>)
Chris@49 3944 </td>
Chris@49 3945 </tr>
Chris@49 3946 <tr>
Chris@49 3947 <td style="vertical-align: top;"><b>.resize(n_rows, n_cols, n_slices)</b></td>
Chris@49 3948 <td style="vertical-align: top;"><br>
Chris@49 3949 </td>
Chris@49 3950 <td style="vertical-align: top;">(member function of <i>Cube</i>)
Chris@49 3951 </td>
Chris@49 3952 </tr>
Chris@49 3953 </tbody>
Chris@49 3954 </table>
Chris@49 3955 <br>
Chris@49 3956 <ul>
Chris@49 3957 <li>
Chris@49 3958 Recreate the object according to given size specifications, while preserving the elements as well as the layout of the elements
Chris@49 3959 </li>
Chris@49 3960 <br>
Chris@49 3961 <li>
Chris@49 3962 Can be used for growing or shrinking an object (ie. adding/removing rows, and/or columns, and/or slices)
Chris@49 3963 </li>
Chris@49 3964 <br>
Chris@49 3965 <li>
Chris@49 3966 <b>Caveat:</b>
Chris@49 3967 .resize() is slower than <a href="#set_size">.set_size()</a>, which doesn't preserve data
Chris@49 3968 </li>
Chris@49 3969 <br>
Chris@49 3970 <li>
Chris@49 3971 Examples:
Chris@49 3972 <ul>
Chris@49 3973 <pre>
Chris@49 3974 mat A = randu&lt;mat&gt;(4,5);
Chris@49 3975 A.resize(7,6);
Chris@49 3976 </pre>
Chris@49 3977 </ul>
Chris@49 3978 </li>
Chris@49 3979 <br>
Chris@49 3980 <li>
Chris@49 3981 This function was added in version 2.4
Chris@49 3982 </li>
Chris@49 3983 <br>
Chris@49 3984 <li>See also:
Chris@49 3985 <ul>
Chris@49 3986 <li><a href="#reshape_member">.reshape()</a></li>
Chris@49 3987 <li><a href="#set_size">.set_size()</a></li>
Chris@49 3988 <li><a href="#copy_size">.copy_size()</a></li>
Chris@49 3989 <li><a href="#zeros_member">.zeros()</a></li>
Chris@49 3990 <li><a href="#reset">.reset()</a></li>
Chris@49 3991 <li><a href="#insert">insert rows/cols/slices</a></li>
Chris@49 3992 <li><a href="#shed">shed rows/cols/slices</a></li>
Chris@49 3993 <li><a href="#resize">resize()</a> (standalone function)</li>
Chris@49 3994 </ul>
Chris@49 3995 </li>
Chris@49 3996 </ul>
Chris@49 3997 <br>
Chris@49 3998 <hr class="greyline"><br>
Chris@49 3999
Chris@49 4000 <a name="save_load_mat"></a>
Chris@49 4001 <b>
Chris@49 4002 .save(name, file_type = arma_binary)
Chris@49 4003 <br>
Chris@49 4004 .save(stream, file_type = arma_binary)
Chris@49 4005 <br>
Chris@49 4006 <br>
Chris@49 4007 .load(name, file_type = auto_detect)
Chris@49 4008 <br>
Chris@49 4009 .load(stream, file_type = auto_detect)
Chris@49 4010 <br>
Chris@49 4011 <br>
Chris@49 4012 .quiet_save(name, file_type = arma_binary)
Chris@49 4013 <br>
Chris@49 4014 .quiet_save(stream, file_type = arma_binary)
Chris@49 4015 <br>
Chris@49 4016 <br>
Chris@49 4017 .quiet_load(name, file_type = auto_detect)
Chris@49 4018 <br>
Chris@49 4019 .quiet_load(stream, file_type = auto_detect)
Chris@49 4020 </b>
Chris@49 4021 <ul>
Chris@49 4022 <li>Member functions of <i>Mat</i>, <i>Col</i>, <i>Row</i> and <i>Cube</i> classes</li>
Chris@49 4023 <br>
Chris@49 4024 <li>Store/retrieve data in files or streams</li>
Chris@49 4025 <br>
Chris@49 4026 <li>On success, <i>save()</i>, <i>load()</i>, <i>quiet_save()</i>, and <i>quite_load()</i> will return a <i>bool</i> set to <i>true</i></li>
Chris@49 4027 <br>
Chris@49 4028 <li><i>save()</i> and <i>quiet_save()</i> will return a <i>bool</i> set to <i>false</i> if the saving process fails</li>
Chris@49 4029 <br>
Chris@49 4030 <li>
Chris@49 4031 <i>load()</i> and <i>quiet_load()</i> will return a <i>bool</i> set to <i>false</i> if the loading process fails;
Chris@49 4032 additionally, the object will be reset so it has no elements
Chris@49 4033 </li>
Chris@49 4034 <br>
Chris@49 4035 <li><i>load()</i> and <i>save()</i> will print warning messages if any problems are encountered</li>
Chris@49 4036 <br>
Chris@49 4037 <li><i>quiet_load()</i> and <i>quiet_save()</i> do not print any error messages</li>
Chris@49 4038 <br>
Chris@49 4039 <li>
Chris@49 4040 The following file formats are supported:
Chris@49 4041 <br>
Chris@49 4042 <br>
Chris@49 4043 <ul>
Chris@49 4044 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 4045 <tbody>
Chris@49 4046 <tr>
Chris@49 4047 <td style="vertical-align: top;"><b>auto_detect</b></td>
Chris@49 4048 <td style="vertical-align: top;"><br>
Chris@49 4049 </td>
Chris@49 4050 <td style="vertical-align: top;">
Chris@49 4051 for <i>load()</i> and <i>quiet_load()</i>:
Chris@49 4052 try to automatically detect the file type as one of the formats described below.
Chris@49 4053 This is the default operation.
Chris@49 4054 <br>
Chris@49 4055 <br>
Chris@49 4056 </td>
Chris@49 4057 </tr>
Chris@49 4058 <tr>
Chris@49 4059 <td style="vertical-align: top;"><b>raw_ascii</b></td>
Chris@49 4060 <td style="vertical-align: top;"><br>
Chris@49 4061 </td>
Chris@49 4062 <td style="vertical-align: top;">
Chris@49 4063 Numerical data stored in raw ASCII format, without a header.
Chris@49 4064 The numbers are separated by whitespace.
Chris@49 4065 The number of columns must be the same in each row.
Chris@49 4066 Cubes are loaded as one slice.
Chris@49 4067 Data which was saved in Matlab/Octave using the <i>-ascii</i> option can be read in Armadillo, except for complex numbers.
Chris@49 4068 Complex numbers are stored in standard C++ notation, which is a tuple surrounded by brackets: eg. (1.23,4.56) indicates 1.24&nbsp;+&nbsp;4.56i.
Chris@49 4069 <br>
Chris@49 4070 <br>
Chris@49 4071 </td>
Chris@49 4072 </tr>
Chris@49 4073 <tr>
Chris@49 4074 <td style="vertical-align: top;"><b>raw_binary</b></td>
Chris@49 4075 <td style="vertical-align: top;"><br>
Chris@49 4076 </td>
Chris@49 4077 <td style="vertical-align: top;">
Chris@49 4078 Numerical data stored in machine dependent raw binary format, without a header.
Chris@49 4079 Matrices are loaded to have one column,
Chris@49 4080 while cubes are loaded to have one slice with one column.
Chris@49 4081 The <a href="#reshape_member">.reshape()</a> function can be used to alter the size of the loaded matrix/cube without losing data.
Chris@49 4082 <br>
Chris@49 4083 <br>
Chris@49 4084 </td>
Chris@49 4085 </tr>
Chris@49 4086 <tr>
Chris@49 4087 <td style="vertical-align: top;"><b>arma_ascii</b></td>
Chris@49 4088 <td style="vertical-align: top;"><br>
Chris@49 4089 </td>
Chris@49 4090 <td style="vertical-align: top;">
Chris@49 4091 Numerical data stored in human readable text format, with a simple header to speed up loading.
Chris@49 4092 The header indicates the type of matrix as well as the number of rows and columns.
Chris@49 4093 For cubes, the header additionally specifies the number of slices.
Chris@49 4094 <br>
Chris@49 4095 <br>
Chris@49 4096 </td>
Chris@49 4097 </tr>
Chris@49 4098 <tr>
Chris@49 4099 <td style="vertical-align: top;"><b>arma_binary</b></td>
Chris@49 4100 <td style="vertical-align: top;"><br>
Chris@49 4101 </td>
Chris@49 4102 <td style="vertical-align: top;">
Chris@49 4103 Numerical data stored in machine dependent binary format, with a simple header to speed up loading.
Chris@49 4104 The header indicates the type of matrix as well as the number of rows and columns.
Chris@49 4105 For cubes, the header additionally specifies the number of slices.
Chris@49 4106 <br>
Chris@49 4107 <br>
Chris@49 4108 </td>
Chris@49 4109 </tr>
Chris@49 4110 <tr>
Chris@49 4111 <td style="vertical-align: top;"><b>csv_ascii</b></td>
Chris@49 4112 <td style="vertical-align: top;"><br>
Chris@49 4113 </td>
Chris@49 4114 <td style="vertical-align: top;">
Chris@49 4115 Numerical data stored in comma separated value (CSV) text format, without a header.
Chris@49 4116 Applicable to <i>Mat</i> only.
Chris@49 4117 <br>
Chris@49 4118 <br>
Chris@49 4119 </td>
Chris@49 4120 </tr>
Chris@49 4121 <tr>
Chris@49 4122 <td style="vertical-align: top;"><b>hdf5_binary</b></td>
Chris@49 4123 <td style="vertical-align: top;"><br>
Chris@49 4124 </td>
Chris@49 4125 <td style="vertical-align: top;">
Chris@49 4126 Numerical data stored in portable HDF5 binary format.
Chris@49 4127 <br>
Chris@49 4128 <b>Caveat</b>:
Chris@49 4129 support for HDF5 must be enabled within Armadillo's <a href="#config_hpp">configuration</a>;
Chris@49 4130 the <i>hdf5.h</i> header file must be available on your system and you will need to link with the hdf5 library (eg. -lhdf5).
Chris@49 4131 Support for saving &amp; loading of <i>Cube</i> objects was added in version 3.830.
Chris@49 4132 <br>
Chris@49 4133 <br>
Chris@49 4134 </td>
Chris@49 4135 </tr>
Chris@49 4136 <tr>
Chris@49 4137 <td style="vertical-align: top;"><b>pgm_binary</b></td>
Chris@49 4138 <td style="vertical-align: top;"><br>
Chris@49 4139 </td>
Chris@49 4140 <td style="vertical-align: top;">
Chris@49 4141 Image data stored in Portable Gray Map (PGM) format.
Chris@49 4142 Applicable to <i>Mat</i> only.
Chris@49 4143 Saving <i>int</i>, <i>float</i> or <i>double</i> matrices is a lossy operation, as each element is copied and converted to an 8 bit representation.
Chris@49 4144 As such the matrix should have values in the [0,255] interval, otherwise the resulting image may not display correctly.
Chris@49 4145 <br>
Chris@49 4146 <br>
Chris@49 4147 </td>
Chris@49 4148 </tr>
Chris@49 4149 <tr>
Chris@49 4150 <td style="vertical-align: top;"><b>ppm_binary</b></td>
Chris@49 4151 <td style="vertical-align: top;"><br>
Chris@49 4152 </td>
Chris@49 4153 <td style="vertical-align: top;">
Chris@49 4154 Image data stored in Portable Pixel Map (PPM) format.
Chris@49 4155 Applicable to <i>Cube</i> only.
Chris@49 4156 Saving <i>int</i>, <i>float</i> or <i>double</i> matrices is a lossy operation, as each element is copied and converted to an 8 bit representation.
Chris@49 4157 As such the cube/field should have values in the [0,255] interval, otherwise the resulting image may not display correctly.
Chris@49 4158 </td>
Chris@49 4159 </tr>
Chris@49 4160 </tbody>
Chris@49 4161 </table>
Chris@49 4162 </ul>
Chris@49 4163 </li>
Chris@49 4164 <br>
Chris@49 4165 <br>
Chris@49 4166 <li>
Chris@49 4167 Examples:
Chris@49 4168 <ul>
Chris@49 4169 <pre>
Chris@49 4170 mat A = randu&lt;mat&gt;(5,5);
Chris@49 4171
Chris@49 4172 A.save("A1.mat"); // default save format is arma_binary
Chris@49 4173 A.save("A2.mat", arma_ascii);
Chris@49 4174
Chris@49 4175 mat B;
Chris@49 4176 // automatically detect format type
Chris@49 4177 B.load("A1.mat");
Chris@49 4178
Chris@49 4179 mat C;
Chris@49 4180 // force loading in the arma_ascii format
Chris@49 4181 C.load("A2.mat", arma_ascii);
Chris@49 4182
Chris@49 4183
Chris@49 4184 // example of saving/loading using a stream
Chris@49 4185 std::stringstream s;
Chris@49 4186 A.save(s);
Chris@49 4187
Chris@49 4188 mat D;
Chris@49 4189 D.load(s);
Chris@49 4190
Chris@49 4191
Chris@49 4192 // example of testing for success
Chris@49 4193 mat E;
Chris@49 4194 bool status = E.load("A2.mat");
Chris@49 4195
Chris@49 4196 if(status == true)
Chris@49 4197 {
Chris@49 4198 cout &lt;&lt; "loaded okay" &lt;&lt; endl;
Chris@49 4199 }
Chris@49 4200 else
Chris@49 4201 {
Chris@49 4202 cout &lt;&lt; "problem with loading" &lt;&lt; endl;
Chris@49 4203 }
Chris@49 4204 </pre>
Chris@49 4205 </ul>
Chris@49 4206 </li>
Chris@49 4207 <br>
Chris@49 4208 <li>See also:
Chris@49 4209 <ul>
Chris@49 4210 <li><a href="#save_load_field">saving/loading fields</a></li>
Chris@49 4211 </ul>
Chris@49 4212 </li>
Chris@49 4213 <br>
Chris@49 4214 </ul>
Chris@49 4215 <hr class="greyline"><br>
Chris@49 4216
Chris@49 4217 <a name="save_load_field"></a>
Chris@49 4218 <b>
Chris@49 4219 .save(name, file_type = arma_binary)
Chris@49 4220 <br>
Chris@49 4221 .save(stream, file_type = arma_binary)
Chris@49 4222 <br>
Chris@49 4223 <br>
Chris@49 4224 .load(name, file_type = auto_detect)
Chris@49 4225 <br>
Chris@49 4226 .load(stream, file_type = auto_detect)
Chris@49 4227 <br>
Chris@49 4228 <br>
Chris@49 4229 .quiet_save(name, file_type = arma_binary)
Chris@49 4230 <br>
Chris@49 4231 .quiet_save(stream, file_type = arma_binary)
Chris@49 4232 <br>
Chris@49 4233 <br>
Chris@49 4234 .quiet_load(name, file_type = auto_detect)
Chris@49 4235 <br>
Chris@49 4236 .quiet_load(stream, file_type = auto_detect)
Chris@49 4237 </b>
Chris@49 4238 <ul>
Chris@49 4239 <li>Member functions of the <i>field</i> class</li>
Chris@49 4240 <br>
Chris@49 4241 <li>Store/retrieve fields in files or stream</li>
Chris@49 4242 <br>
Chris@49 4243 <li>On success, save(), load(), quiet_save(), and quite_load() will return a <i>bool</i> set to <i>true</i></li>
Chris@49 4244 <br>
Chris@49 4245 <li>save() and quiet_save() will return a <i>bool</i> set to <i>false</i> if the saving process fails</li>
Chris@49 4246 <br>
Chris@49 4247 <li>
Chris@49 4248 load() and quiet_load() will return a <i>bool</i> set to <i>false</i> if the loading process fails;
Chris@49 4249 additionally, the field will be reset so it has no elements
Chris@49 4250 </li>
Chris@49 4251 <br>
Chris@49 4252 <li>load() and save() will print warning messages if any problems are encountered</li>
Chris@49 4253 <br>
Chris@49 4254 <li>quiet_load() and quiet_save() do not print any error messages</li>
Chris@49 4255 <br>
Chris@49 4256 <li>
Chris@49 4257 Fields with objects of type <i>std::string</i> are saved and loaded as raw text files.
Chris@49 4258 The text files do not have a header.
Chris@49 4259 Each string is separated by a whitespace.
Chris@49 4260 load() and quiet_load() will only accept text files that have the same number of strings on each line.
Chris@49 4261 The strings can have variable lengths.
Chris@49 4262 </li>
Chris@49 4263 <br>
Chris@49 4264 <li>
Chris@49 4265 Other than storing string fields as text files, the following file formats are supported:
Chris@49 4266 <br>
Chris@49 4267 <br>
Chris@49 4268 <ul>
Chris@49 4269 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 4270 <tbody>
Chris@49 4271 <tr>
Chris@49 4272 <td style="vertical-align: top;"><b>auto_detect</b></td>
Chris@49 4273 <td style="vertical-align: top;"><br>
Chris@49 4274 </td>
Chris@49 4275 <td style="vertical-align: top;">
Chris@49 4276 <br>
Chris@49 4277 <li>
Chris@49 4278 load(): try to automatically detect the field format type as one of the formats described below.
Chris@49 4279 This is the default operation.
Chris@49 4280 </li>
Chris@49 4281 <br>
Chris@49 4282 </td>
Chris@49 4283 </tr>
Chris@49 4284 <tr>
Chris@49 4285 <td style="vertical-align: top;"><b>arma_binary</b></td>
Chris@49 4286 <td style="vertical-align: top;"><br>
Chris@49 4287 </td>
Chris@49 4288 <td style="vertical-align: top;">
Chris@49 4289 <br>
Chris@49 4290 <li>
Chris@49 4291 Objects are stored in machine dependent binary format.
Chris@49 4292 <li>
Chris@49 4293 Default type for fields of type <i>Mat</i>, <i>Col</i> or <i>Row</i>.
Chris@49 4294 </li>
Chris@49 4295 <li>
Chris@49 4296 Only applicable to fields of type <i>Mat</i>, <i>Col</i> or <i>Row</i>.
Chris@49 4297 </li>
Chris@49 4298 <br>
Chris@49 4299 </td>
Chris@49 4300 </tr>
Chris@49 4301 <tr>
Chris@49 4302 <td style="vertical-align: top;"><b>ppm_binary</b></td>
Chris@49 4303 <td style="vertical-align: top;"><br>
Chris@49 4304 </td>
Chris@49 4305 <td style="vertical-align: top;">
Chris@49 4306 <br>
Chris@49 4307 <li>
Chris@49 4308 Image data stored in Portable Pixmap Map (PPM) format.
Chris@49 4309 </li>
Chris@49 4310 <li>
Chris@49 4311 Only applicable to fields of type <i>Mat</i>, <i>Col</i> or <i>Row</i>.
Chris@49 4312 </li>
Chris@49 4313 <li>
Chris@49 4314 .load(): Loads the specified image and stores the red, green and blue components as three separate matrices.
Chris@49 4315 The resulting field is comprised of the three matrices,
Chris@49 4316 with the red, green and blue components in the first, second and third matrix, respectively.
Chris@49 4317 </li>
Chris@49 4318 <li>
Chris@49 4319 .save(): Saves a field with exactly three matrices of equal size as an image.
Chris@49 4320 It is assumed that the red, green and blue components are stored in the first, second and third matrix, respectively.
Chris@49 4321 Saving <i>int</i>, <i>float</i> or <i>double</i> matrices is a lossy operation,
Chris@49 4322 as each matrix element is copied and converted to an 8 bit representation.
Chris@49 4323 </li>
Chris@49 4324
Chris@49 4325 </td>
Chris@49 4326 </tr>
Chris@49 4327 </tbody>
Chris@49 4328 </table>
Chris@49 4329 </ul>
Chris@49 4330 </li>
Chris@49 4331 <br>
Chris@49 4332 <li>See also:
Chris@49 4333 <ul>
Chris@49 4334 <li><a href="#save_load_mat">saving/loading matrices and cubes</a></li>
Chris@49 4335 </ul>
Chris@49 4336 </li>
Chris@49 4337 <br>
Chris@49 4338 </ul>
Chris@49 4339 <hr class="greyline"><br>
Chris@49 4340
Chris@49 4341 <a name="set_imag"></a>
Chris@49 4342 <b>.set_imag(X)</b>
Chris@49 4343 <br>
Chris@49 4344 <b>.set_real(X)</b>
Chris@49 4345 <br>
Chris@49 4346 <ul>
Chris@49 4347 <li>Member functions of Mat, Col, Row and Cube</li>
Chris@49 4348 <br>
Chris@49 4349 <li>
Chris@49 4350 Set the imaginary/real part of an object
Chris@49 4351 </li>
Chris@49 4352 <br>
Chris@49 4353 <li>
Chris@49 4354 <i>X</i> must have the same size as the recipient object
Chris@49 4355 </li>
Chris@49 4356 <br>
Chris@49 4357 <li>
Chris@49 4358 Examples:
Chris@49 4359 <ul>
Chris@49 4360 <pre>
Chris@49 4361 mat A = randu&lt;mat&gt;(4,5);
Chris@49 4362 mat B = randu&lt;mat&gt;(4,5);
Chris@49 4363
Chris@49 4364 cx_mat C = zeros&lt;cx_mat&gt;(4,5);
Chris@49 4365
Chris@49 4366 C.set_real(A);
Chris@49 4367 C.set_imag(B);
Chris@49 4368 </pre>
Chris@49 4369 </ul>
Chris@49 4370 </li>
Chris@49 4371 <br>
Chris@49 4372 <li>
Chris@49 4373 <b>Caveat:</b>
Chris@49 4374 if you want to directly construct a complex matrix out of two real matrices,
Chris@49 4375 the following code is faster:
Chris@49 4376 <ul>
Chris@49 4377 <pre>
Chris@49 4378 mat A = randu&lt;mat&gt;(4,5);
Chris@49 4379 mat B = randu&lt;mat&gt;(4,5);
Chris@49 4380
Chris@49 4381 cx_mat C = cx_mat(A,B);
Chris@49 4382 </pre>
Chris@49 4383 </ul>
Chris@49 4384 </li>
Chris@49 4385 <br>
Chris@49 4386 <li>See also:
Chris@49 4387 <ul>
Chris@49 4388 <li><a href="#constructors_mat">matrix constructors</a></li>
Chris@49 4389 <li><a href="#constructors_cube">cube constructors</a></li>
Chris@49 4390 <li><a href="#imag_real">imag()&nbsp;/&nbsp;real()</a></li>
Chris@49 4391 </ul>
Chris@49 4392 </li>
Chris@49 4393 <br>
Chris@49 4394 </ul>
Chris@49 4395 <hr class="greyline"><br>
Chris@49 4396
Chris@49 4397 <a name="set_size"></a>
Chris@49 4398 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 4399 <tbody>
Chris@49 4400 <tr>
Chris@49 4401 <td style="vertical-align: top;"><b>.set_size(n_elem)</b></td>
Chris@49 4402 <td style="vertical-align: top;"><br>
Chris@49 4403 </td>
Chris@49 4404 <td style="vertical-align: top;">(member function of <i>Col</i>, <i>Row</i>, and <i>field</i>)
Chris@49 4405 </td>
Chris@49 4406 </tr>
Chris@49 4407 <tr>
Chris@49 4408 <td style="vertical-align: top;"><b>.set_size(n_rows, n_cols)</b></td>
Chris@49 4409 <td style="vertical-align: top;"><br>
Chris@49 4410 </td>
Chris@49 4411 <td style="vertical-align: top;">(member function of <i>Mat</i> and <i>field</i>)
Chris@49 4412 </td>
Chris@49 4413 </tr>
Chris@49 4414 <tr>
Chris@49 4415 <td style="vertical-align: top;"><b>.set_size(n_rows, n_cols, n_slices)</b></td>
Chris@49 4416 <td style="vertical-align: top;"><br>
Chris@49 4417 </td>
Chris@49 4418 <td style="vertical-align: top;">(member function of <i>Cube</i>)
Chris@49 4419 </td>
Chris@49 4420 </tr>
Chris@49 4421 </tbody>
Chris@49 4422 </table>
Chris@49 4423 <br>
Chris@49 4424 <ul>
Chris@49 4425 <li>Changes the size of an object</li>
Chris@49 4426 <br>
Chris@49 4427 <li>
Chris@49 4428 If the requested number of elements is equal to the old number of elements, existing memory is reused
Chris@49 4429 </li>
Chris@49 4430 <br>
Chris@49 4431 <li>
Chris@49 4432 If the requested number of elements is not equal to the old number of elements, new memory is used;
Chris@49 4433 the memory is uninitilised
Chris@49 4434 </li>
Chris@49 4435 <br>
Chris@49 4436 <li>
Chris@49 4437 If you need to initialise the memory, use <a href="#zeros_member">.zeros()</a> instead
Chris@49 4438 </li>
Chris@49 4439 <br>
Chris@49 4440 <li>
Chris@49 4441 If you need to explicitly preserve data, use <a href="#reshape_member">.reshape()</a> or <a href="#resize_member">.resize()</a>
Chris@49 4442 </li>
Chris@49 4443 <br>
Chris@49 4444 <li>
Chris@49 4445 Examples:
Chris@49 4446 <ul>
Chris@49 4447 <pre>
Chris@49 4448 mat A;
Chris@49 4449 A.set_size(5,10);
Chris@49 4450
Chris@49 4451 vec q;
Chris@49 4452 q.set_size(100);
Chris@49 4453 </pre>
Chris@49 4454 </ul>
Chris@49 4455 </li>
Chris@49 4456 <br>
Chris@49 4457 <li>See also:
Chris@49 4458 <ul>
Chris@49 4459 <li><a href="#reset">.reset()</a></li>
Chris@49 4460 <li><a href="#copy_size">.copy_size()</a></li>
Chris@49 4461 <li><a href="#reshape_member">.reshape()</a></li>
Chris@49 4462 <li><a href="#resize_member">.resize()</a></li>
Chris@49 4463 <li><a href="#zeros_member">.zeros()</a></li>
Chris@49 4464 </ul>
Chris@49 4465 </li>
Chris@49 4466 </ul>
Chris@49 4467 <br>
Chris@49 4468 <hr class="greyline"><br>
Chris@49 4469
Chris@49 4470 <a name="shed"></a>
Chris@49 4471 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 4472 <tbody>
Chris@49 4473 <tr>
Chris@49 4474 <td style="vertical-align: top;">
Chris@49 4475 <b>.shed_row(&nbsp;</b>row_number<b>&nbsp;)</b>
Chris@49 4476 <br>
Chris@49 4477 <b>.shed_rows(&nbsp;</b>first_row, last_row<b>&nbsp;)</b>
Chris@49 4478 </td>
Chris@49 4479 <td style="vertical-align: top;"><br></td>
Chris@49 4480 <td style="vertical-align: top;">(member functions of <i>Mat</i> and <i>Col</i>)
Chris@49 4481 </td>
Chris@49 4482 </tr>
Chris@49 4483 <tr>
Chris@49 4484 <td>&nbsp;</td>
Chris@49 4485 </tr>
Chris@49 4486 <tr>
Chris@49 4487 <td style="vertical-align: top;">
Chris@49 4488 <b>.shed_col(&nbsp;</b>column_number<b>&nbsp;)</b>
Chris@49 4489 <br>
Chris@49 4490 <b>.shed_cols(&nbsp;</b>first_column, last_column<b>&nbsp;)</b>
Chris@49 4491 </td>
Chris@49 4492 <td style="vertical-align: top;"><br></td>
Chris@49 4493 <td style="vertical-align: top;">(member functions of <i>Mat</i> and <i>Row</i>)
Chris@49 4494 </td>
Chris@49 4495 </tr>
Chris@49 4496 <tr>
Chris@49 4497 <td>&nbsp;</td>
Chris@49 4498 </tr>
Chris@49 4499 <tr>
Chris@49 4500 <td style="vertical-align: top;">
Chris@49 4501 <b>.shed_slice(&nbsp;</b>slice_number<b>&nbsp;)</b>
Chris@49 4502 <br>
Chris@49 4503 <b>.shed_slices(&nbsp;</b>first_slice, last_slice<b>&nbsp;)</b>
Chris@49 4504 </td>
Chris@49 4505 <td style="vertical-align: top;"><br></td>
Chris@49 4506 <td style="vertical-align: top;">(member functions of <i>Cube</i>)
Chris@49 4507 </td>
Chris@49 4508 </tr>
Chris@49 4509 </tbody>
Chris@49 4510 </table>
Chris@49 4511 <br>
Chris@49 4512 <ul>
Chris@49 4513 <li>
Chris@49 4514 Single argument functions:
Chris@49 4515 remove the specified row/column/slice
Chris@49 4516 </li>
Chris@49 4517 <br>
Chris@49 4518 <li>
Chris@49 4519 Two argument functions:
Chris@49 4520 remove the specified range of rows/columns/slices
Chris@49 4521 </li>
Chris@49 4522 <br>
Chris@49 4523 <li>
Chris@49 4524 Examples:
Chris@49 4525 <ul>
Chris@49 4526 <pre>
Chris@49 4527 mat A = randu&lt;mat&gt;(5,10);
Chris@49 4528
Chris@49 4529 A.shed_row(2);
Chris@49 4530 A.shed_cols(2,4);
Chris@49 4531 </pre>
Chris@49 4532 </ul>
Chris@49 4533 </li>
Chris@49 4534 <br>
Chris@49 4535 <li>
Chris@49 4536 See also:
Chris@49 4537 <ul>
Chris@49 4538 <li><a href="#insert">insert rows/columns/slices</a></li>
Chris@49 4539 <li><a href="#join">join rows/columns/slices</a></li>
Chris@49 4540 <li><a href="#resize_member">.resize()</a></li>
Chris@49 4541 <li><a href="#submat">submatrix views</a></li>
Chris@49 4542 <li><a href="#subcube">subcube views</a></li>
Chris@49 4543 <li><a href="http://thesaurus.com/browse/shed"><i>shed</i> in thesaurus.com</a></li>
Chris@49 4544 </ul>
Chris@49 4545 </li>
Chris@49 4546 <br>
Chris@49 4547 </ul>
Chris@49 4548 <hr class="greyline"><br>
Chris@49 4549
Chris@49 4550 <a name="stl_container_fns"></a>
Chris@49 4551 <b>STL container functions</b>
Chris@49 4552 <ul>
Chris@49 4553 <li><i>Mat</i>, <i>Col</i> and <i>Row</i> classes provide the following member functions that mimic the containers in the C++ Standard Template Library:<br>
Chris@49 4554 <br>
Chris@49 4555
Chris@49 4556 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 4557 <tbody>
Chris@49 4558 <tr>
Chris@49 4559 <td style="vertical-align: top;">
Chris@49 4560 <b>.clear()</b>
Chris@49 4561 </td>
Chris@49 4562 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 4563 </td>
Chris@49 4564 <td style="vertical-align: top;">
Chris@49 4565 causes an object to have no elements
Chris@49 4566 </td>
Chris@49 4567 </tr>
Chris@49 4568 <tr>
Chris@49 4569 <td style="vertical-align: top;">
Chris@49 4570 &nbsp;
Chris@49 4571 </td>
Chris@49 4572 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 4573 </td>
Chris@49 4574 <td style="vertical-align: top;">
Chris@49 4575 &nbsp;
Chris@49 4576 </td>
Chris@49 4577 </tr>
Chris@49 4578 <tr>
Chris@49 4579 <td style="vertical-align: top;">
Chris@49 4580 <b>.empty()</b>
Chris@49 4581 </td>
Chris@49 4582 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 4583 </td>
Chris@49 4584 <td style="vertical-align: top;">
Chris@49 4585 returns true if the object has no elements; returns false if the object has one or more elements
Chris@49 4586 </td>
Chris@49 4587 </tr>
Chris@49 4588 <tr>
Chris@49 4589 <td style="vertical-align: top;">
Chris@49 4590 &nbsp;
Chris@49 4591 </td>
Chris@49 4592 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 4593 </td>
Chris@49 4594 <td style="vertical-align: top;">
Chris@49 4595 &nbsp;
Chris@49 4596 </td>
Chris@49 4597 </tr>
Chris@49 4598 <tr>
Chris@49 4599 <td style="vertical-align: top;">
Chris@49 4600 <b>.size()</b>
Chris@49 4601 </td>
Chris@49 4602 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 4603 </td>
Chris@49 4604 <td style="vertical-align: top;">
Chris@49 4605 returns the total number of elements
Chris@49 4606 </td>
Chris@49 4607 </tr>
Chris@49 4608 </tbody>
Chris@49 4609 </table>
Chris@49 4610 </li>
Chris@49 4611 <br>
Chris@49 4612 <li>
Chris@49 4613 Examples:
Chris@49 4614 <ul>
Chris@49 4615 <pre>
Chris@49 4616 mat A = randu&lt;mat&gt;(5,5);
Chris@49 4617 cout &lt;&lt; A.size() &lt;&lt; endl;
Chris@49 4618
Chris@49 4619 A.clear();
Chris@49 4620 cout &lt;&lt; A.empty() &lt;&lt; endl;
Chris@49 4621 </pre>
Chris@49 4622 </ul>
Chris@49 4623 </li>
Chris@49 4624 <br>
Chris@49 4625 <li>
Chris@49 4626 See also:
Chris@49 4627 <ul>
Chris@49 4628 <li><a href="#iterators_mat">iterators (matrices)</a></li>
Chris@49 4629 <li><a href="#attributes">matrix and vector attributes</a></li>
Chris@49 4630 <li><a href="#is_empty">.is_empty()</a></li>
Chris@49 4631 <li><a href="#reset">.reset()</a></li>
Chris@49 4632 </ul>
Chris@49 4633 </li>
Chris@49 4634 <br>
Chris@49 4635 </ul>
Chris@49 4636 <hr class="greyline"><br>
Chris@49 4637
Chris@49 4638 <a name="submat"></a>
Chris@49 4639 <b>submatrix views</b>
Chris@49 4640 <ul>
Chris@49 4641 <li>A collection of member functions of <i>Mat</i>, <i>Col</i> and <i>Row</i> classes that provide read/write access to submatrix views<br>
Chris@49 4642 <br>
Chris@49 4643 <li>For a matrix or vector <i>X</i>, the subviews are accessed as:</li>
Chris@49 4644 <br>
Chris@49 4645 <ul>
Chris@49 4646 <li>contiguous views:
Chris@49 4647 <ul>
Chris@49 4648 <br>
Chris@49 4649 X.<b>col(&nbsp;</b>col_number<b>&nbsp;)</b><br>
Chris@49 4650 X.<b>row(&nbsp;</b>row_number<b>&nbsp;)</b><br>
Chris@49 4651 <br>
Chris@49 4652 X.<b>cols(&nbsp;</b>first_col<b>,</b> last_col<b>&nbsp;)</b><br>
Chris@49 4653 X.<b>rows(&nbsp;</b>first_row<b>,</b> last_row<b>&nbsp;)</b><br>
Chris@49 4654 <br>
Chris@49 4655 X<b>(</b>&nbsp;<b>span::all,</b> col_number&nbsp;<b>)</b><br>
Chris@49 4656 X<b>(</b>&nbsp;<b>span(</b>first_row<b>,</b> last_row<b>),</b> col_number&nbsp;<b>)</b><br>
Chris@49 4657 <br>
Chris@49 4658 X<b>(</b>&nbsp;row_number<b>,</b> <b>span::all</b>&nbsp;<b>)</b><br>
Chris@49 4659 X<b>(</b>&nbsp;row_number<b>,</b> <b>span(</b>first_col<b>,</b> last_col<b>)&nbsp;)</b><br>
Chris@49 4660 <br>
Chris@49 4661 X.<b>submat(&nbsp;</b>first_row<b>,</b> first_col<b>,</b> last_row<b>,</b> last_col<b>&nbsp;)</b><br>
Chris@49 4662 X.<b>submat(&nbsp;span(</b>first_row<b>,</b> last_row<b>), span(</b>first_col<b>,</b> last_col<b>)&nbsp;)</b><br>
Chris@49 4663 <br>
Chris@49 4664 X<b>(&nbsp;span(</b>first_row<b>,</b> last_row<b>), span(</b>first_col<b>,</b> last_col<b>)&nbsp;)</b><br>
Chris@49 4665 <br>
Chris@49 4666 X.<b>unsafe_col(&nbsp;</b>col_number<b>&nbsp;)</b><br>
Chris@49 4667 <br>
Chris@49 4668 V.<b>subvec(&nbsp;</b>first_index<b>,</b> last_index<b>&nbsp;)</b> &nbsp;&nbsp;&nbsp; <i>(for vectors only)</i><br>
Chris@49 4669 V<b>(&nbsp;span(</b>first_index<b>,</b> last_index<b>)&nbsp;)</b> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <i>(for vectors only)</i><br>
Chris@49 4670 </ul>
Chris@49 4671 </li>
Chris@49 4672 <br>
Chris@49 4673 <li>non-contiguous views (added in version 3.0):
Chris@49 4674 <ul>
Chris@49 4675 <br>
Chris@49 4676 X.<b>elem(</b>&nbsp;vector_of_indices&nbsp;<b>)</b><br>
Chris@49 4677 X<b>(</b>&nbsp;vector_of_indices&nbsp;<b>)</b> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <i>(added in version 3.810)</i><br>
Chris@49 4678 <br>
Chris@49 4679 X.<b>cols(&nbsp;</b>vector_of_column_indices<b>&nbsp;)</b><br>
Chris@49 4680 X.<b>rows(&nbsp;</b>vector_of_row_indices<b>&nbsp;)</b><br>
Chris@49 4681 <br>
Chris@49 4682 X<b>(</b>&nbsp;vector_of_row_indices<b>,</b>&nbsp;vector_of_column_indices&nbsp;<b>)</b><br>
Chris@49 4683 X.<b>submat(</b>&nbsp;vector_of_row_indices<b>,</b>&nbsp;vector_of_column_indices&nbsp;<b>)</b><br>
Chris@49 4684 <!--X.<b>elem(</b>&nbsp;vector_of_row_indices<b>,</b>&nbsp;vector_of_column_indices&nbsp;<b>)</b><br>-->
Chris@49 4685 </ul>
Chris@49 4686 </li>
Chris@49 4687 </ul>
Chris@49 4688 <br>
Chris@49 4689 <li>
Chris@49 4690 Instances of <i>span::all</i>, to indicate an entire range, can be replaced by <i>span()</i>, where no number is specified
Chris@49 4691 </li>
Chris@49 4692 <br>
Chris@49 4693 <li>
Chris@49 4694 For functions requiring one or more vector of indices,
Chris@49 4695 eg. <i>X.submat(vector_of_row_indices,vector_of_column_indices)</i>,
Chris@49 4696 each vector of indices must be of type <i><a href="#Col">uvec</a></i>.
Chris@49 4697 </li>
Chris@49 4698 <br>
Chris@49 4699 <li>
Chris@49 4700 In the function <i>X.elem(vector_of_indices)</i>,
Chris@49 4701 elements specified in <i>vector_of_indices</i> are accessed.
Chris@49 4702 <i>X</i> is interpreted as one long vector,
Chris@49 4703 with column-by-column ordering of the elements of <i>X</i>.
Chris@49 4704 The <i>vector_of_indices</i> must evaluate to be a vector of type <i><a href="#Col">uvec</a></i>
Chris@49 4705 (eg., generated by <i><a href="#find">find()</a></i>).
Chris@49 4706 The aggregate set of the specified elements is treated as a column vector
Chris@49 4707 (eg., the output of <i>X.elem()</i> is always a column vector).
Chris@49 4708 </li>
Chris@49 4709 <br>
Chris@49 4710 <li>
Chris@49 4711 The function <i>.unsafe_col()</i> is provided for speed reasons and should be used only if you know what you're doing.
Chris@49 4712 The function creates a seemingly independent <i>Col</i> vector object (eg. <i>vec</i>),
Chris@49 4713 but the vector actually uses memory from the existing matrix object.
Chris@49 4714 As such, the created <i>Col</i> vector is currently not alias safe
Chris@49 4715 and does not take into account that the parent matrix object could be deleted.
Chris@49 4716 If deleted memory is accessed through the created <i>Col</i> vector,
Chris@49 4717 it will cause memory corruption and/or a crash.
Chris@49 4718 </li>
Chris@49 4719 <br>
Chris@49 4720 <li>
Chris@49 4721 Examples:
Chris@49 4722 <ul>
Chris@49 4723 <pre>
Chris@49 4724 mat A = zeros&lt;mat&gt;(5,10);
Chris@49 4725
Chris@49 4726 A.submat(0,1,2,3) = randu&lt;mat&gt;(3,3);
Chris@49 4727
Chris@49 4728 // the following three statements
Chris@49 4729 // access the same part of A
Chris@49 4730 mat B = A.submat(0,1,2,3);
Chris@49 4731 mat C = A.submat( span(0,2), span(1,3) );
Chris@49 4732 mat D = A( span(0,2), span(1,3) );
Chris@49 4733
Chris@49 4734 // the following two statements
Chris@49 4735 // access the same part of A
Chris@49 4736 A.col(1) = randu&lt;mat&gt;(5,1);
Chris@49 4737 A(span::all, 1) = randu&lt;mat&gt;(5,1);
Chris@49 4738
Chris@49 4739 mat X = randu&lt;mat&gt;(5,5);
Chris@49 4740
Chris@49 4741 // get all elements of X that are greater than 0.5
Chris@49 4742 vec q = X.elem( find(X > 0.5) );
Chris@49 4743
Chris@49 4744 // set four specific elements of X to 1
Chris@49 4745 uvec indices;
Chris@49 4746 indices &lt;&lt; 2 &lt;&lt; 3 &lt;&lt; 6 &lt;&lt; 8;
Chris@49 4747
Chris@49 4748 X.elem(indices) = ones&lt;vec&gt;(4);
Chris@49 4749 </pre>
Chris@49 4750 </ul>
Chris@49 4751 </li>
Chris@49 4752 <br>
Chris@49 4753 <li>
Chris@49 4754 See also:
Chris@49 4755 <ul>
Chris@49 4756 <li><a href="#diag">diagonal views</a> &nbsp;&nbsp; (read/write access to diagonals)</li>
Chris@49 4757 <li><a href="#each_colrow">.each_col() &amp; .each_row()</a> &nbsp;&nbsp; (vector operations repeated on each column or row)</li>
Chris@49 4758 <li><a href="#colptr">.colptr()</a></li>
Chris@49 4759 <li><a href="#in_range">.in_range()</a></li>
Chris@49 4760 <li><a href="#find">find()</a></li>
Chris@49 4761 <li><a href="#join">join rows/columns/slices</a></li>
Chris@49 4762 <li><a href="#shed">shed rows/columns/slices</a></li>
Chris@49 4763 <li><a href="#insert">insert rows/columns/slices</a></li>
Chris@49 4764 <li><a href="#subcube">subcube views</a></li>
Chris@49 4765 </ul>
Chris@49 4766 </li>
Chris@49 4767 <br>
Chris@49 4768 </ul>
Chris@49 4769 <hr class="greyline"><br>
Chris@49 4770
Chris@49 4771 <a name="subcube"></a>
Chris@49 4772 <b>subcube views and slices</b>
Chris@49 4773 <ul>
Chris@49 4774 <li>A collection of member functions of the <i>Cube</i> class that provide subcube views<br>
Chris@49 4775 <br>
Chris@49 4776 <li>For a cube <i>Q</i>, the subviews are accessed as:</li>
Chris@49 4777 <br>
Chris@49 4778 <ul>
Chris@49 4779 Q.<b>slice(&nbsp;</b>slice_number&nbsp;<b>)</b><br>
Chris@49 4780 Q.<b>slices(&nbsp;</b>first_slice<b>,</b> last_slice&nbsp;<b>)</b><br>
Chris@49 4781 <br>
Chris@49 4782 Q.<b>subcube(&nbsp;</b>first_row<b>,</b> first_col<b>,</b> first_slice<b>, </b>last_row<b>,</b> last_col<b>, </b>last_slice&nbsp;<b>)</b><br>
Chris@49 4783 Q.<b>subcube(&nbsp;span(</b>first_row<b>,</b> last_row<b>), span(</b>first_col<b>,</b> last_col<b>), span(</b>first_slice<b>,</b> last_slice<b>)&nbsp;)</b><br>
Chris@49 4784 <br>
Chris@49 4785 Q<b>(&nbsp;span(</b>first_row<b>,</b> last_row<b>), span(</b>first_col<b>,</b> last_col<b>), span(</b>first_slice<b>,</b> last_slice<b>)&nbsp;)</b><br>
Chris@49 4786 </ul>
Chris@49 4787 </li>
Chris@49 4788 <br>
Chris@49 4789 <li>
Chris@49 4790 Instances of <i>span(a,b)</i> can be replaced by:
Chris@49 4791 <ul>
Chris@49 4792 <li><i>span()</i> or <i>span::all</i>, to indicate the entire range</li>
Chris@49 4793 <li><i>span(a)</i>, to indicate a particular row, column or slice</li>
Chris@49 4794 </ul>
Chris@49 4795 </li>
Chris@49 4796 <br>
Chris@49 4797 <li>
Chris@49 4798 An individual slice, accessed via <i>.slice()</i>, is an instance of the <i>Mat</i> class
Chris@49 4799 (a reference to a matrix is provided)
Chris@49 4800 </li>
Chris@49 4801 <br>
Chris@49 4802 <li>
Chris@49 4803 Examples:
Chris@49 4804 <ul>
Chris@49 4805 <pre>
Chris@49 4806 cube A = randu&lt;cube&gt;(2,3,4);
Chris@49 4807 mat B = A.slice(1);
Chris@49 4808
Chris@49 4809 A.slice(0) = randu&lt;mat&gt;(2,3);
Chris@49 4810 A.slice(0)(1,2) = 99.0;
Chris@49 4811
Chris@49 4812 A.subcube(0,0,1, 1,1,2) = randu&lt;cube&gt;(2,2,2);
Chris@49 4813 A( span(0,1), span(0,1), span(1,2) ) = randu&lt;cube&gt;(2,2,2);
Chris@49 4814
Chris@49 4815 </pre>
Chris@49 4816 </ul>
Chris@49 4817 </li>
Chris@49 4818 <br>
Chris@49 4819 <li>
Chris@49 4820 See also:
Chris@49 4821 <ul>
Chris@49 4822 <li><a href="#in_range">.in_range()</a></li>
Chris@49 4823 <li><a href="#join">join slices</a></li>
Chris@49 4824 <li><a href="#shed">shed slices</a></li>
Chris@49 4825 <li><a href="#insert">insert slices</a></li>
Chris@49 4826 <li><a href="#submat">submatrix views</a></li>
Chris@49 4827 </ul>
Chris@49 4828 </li>
Chris@49 4829 <br>
Chris@49 4830 </ul>
Chris@49 4831 <hr class="greyline"><br>
Chris@49 4832
Chris@49 4833 <a name="subfield"></a>
Chris@49 4834 <b>subfield views</b>
Chris@49 4835 <ul>
Chris@49 4836 <li>A collection of member functions of the <i>field</i> class that provide subfield views<br>
Chris@49 4837 <br>
Chris@49 4838 <li>For a field <i>F</i>, the subfields are accessed as:</li>
Chris@49 4839 <br>
Chris@49 4840 <ul>
Chris@49 4841 F.<b>row(&nbsp;</b>row_number&nbsp;<b>)</b><br>
Chris@49 4842 F.<b>col(&nbsp;</b>col_number&nbsp;<b>)</b><br>
Chris@49 4843 <br>
Chris@49 4844 F.<b>rows(&nbsp;</b>first_row<b>,</b> last_row&nbsp;<b>)</b><br>
Chris@49 4845 F.<b>cols(&nbsp;</b>first_col<b>,</b> last_col&nbsp;<b>)</b><br>
Chris@49 4846 <br>
Chris@49 4847 F.<b>subfield(&nbsp;</b>first_row<b>,</b>&nbsp;first_col<b>,</b> last_row<b>,</b>&nbsp;last_col <b>)</b><br>
Chris@49 4848 F.<b>subfield(&nbsp;span(</b>first_row<b>,</b>&nbsp;last_row<b>), span(</b>first_col<b>,</b>&nbsp;last_col<b>) )</b><br>
Chris@49 4849 <br>
Chris@49 4850 F<b>(&nbsp;span(</b>first_row<b>,</b> last_row<b>), span(</b>first_col<b>,</b>&nbsp;last_col<b>) )</b><br>
Chris@49 4851 </ul>
Chris@49 4852 </li>
Chris@49 4853 <br>
Chris@49 4854 <li>
Chris@49 4855 Instances of <i>span(a,b)</i> can be replaced by:
Chris@49 4856 <ul>
Chris@49 4857 <li><i>span()</i> or <i>span::all</i>, to indicate the entire range</li>
Chris@49 4858 <li><i>span(a)</i>, to indicate a particular row or column</li>
Chris@49 4859 </ul>
Chris@49 4860 </li>
Chris@49 4861 <br>
Chris@49 4862 <li>
Chris@49 4863 See also:
Chris@49 4864 <ul>
Chris@49 4865 <li><a href="#in_range">.in_range()</a></li>
Chris@49 4866 <li><a href="#submat">submatrix views</a></li>
Chris@49 4867 <li><a href="#subcube">subcube views</a></li>
Chris@49 4868 </ul>
Chris@49 4869 </li>
Chris@49 4870 <br>
Chris@49 4871 </ul>
Chris@49 4872 <hr class="greyline"><br>
Chris@49 4873
Chris@49 4874 <a name="swap"></a>
Chris@49 4875 <b>.swap(</b>X<b>)</b>
Chris@49 4876 <ul>
Chris@49 4877 <li>
Chris@49 4878 Swap contents with matrix <i>X</i>
Chris@49 4879 </li>
Chris@49 4880 <br>
Chris@49 4881 <li>
Chris@49 4882 This function was added in version 3.800
Chris@49 4883 </li>
Chris@49 4884 <br>
Chris@49 4885 <li>
Chris@49 4886 Examples:
Chris@49 4887 <ul>
Chris@49 4888 <pre>
Chris@49 4889 mat A = zeros&lt;mat&gt;(4,5);
Chris@49 4890 mat B = ones&lt;mat&gt;(6,7);
Chris@49 4891
Chris@49 4892 A.swap(B);
Chris@49 4893 </pre>
Chris@49 4894 </ul>
Chris@49 4895 </li>
Chris@49 4896 <br>
Chris@49 4897 <li>
Chris@49 4898 See also:
Chris@49 4899 <ul>
Chris@49 4900 <li><a href="#swap_rows">.swap_rows() &amp; .swap_cols()</a></li>
Chris@49 4901 </ul>
Chris@49 4902 </li>
Chris@49 4903 <br>
Chris@49 4904 </ul>
Chris@49 4905 <hr class="greyline"><br>
Chris@49 4906
Chris@49 4907 <a name="swap_rows"></a>
Chris@49 4908 <b>
Chris@49 4909 .swap_rows(row1, row2)
Chris@49 4910 <br>.swap_cols(col1, col2)
Chris@49 4911 </b>
Chris@49 4912 <ul>
Chris@49 4913 <li>
Chris@49 4914 Member functions of <i>Mat</i>, <i>Col</i> and <i>Row</i> classes
Chris@49 4915 </li>
Chris@49 4916 <br>
Chris@49 4917 <li>
Chris@49 4918 Swap the contents of specified rows or columns
Chris@49 4919 </li>
Chris@49 4920 <br>
Chris@49 4921 <li>
Chris@49 4922 Examples:
Chris@49 4923 <ul>
Chris@49 4924 <pre>
Chris@49 4925 mat X = randu&lt;mat&gt;(5,5);
Chris@49 4926 X.swap_rows(0,4);
Chris@49 4927 </pre>
Chris@49 4928 </ul>
Chris@49 4929 </li>
Chris@49 4930 <br>
Chris@49 4931 <li>
Chris@49 4932 See also:
Chris@49 4933 <ul>
Chris@49 4934 <li><a href="#flip">fliplr() &amp; flipud()</a></li>
Chris@49 4935 <li><a href="#swap">.swap()</a></li>
Chris@49 4936 </ul>
Chris@49 4937 </li>
Chris@49 4938 <br>
Chris@49 4939 </ul>
Chris@49 4940 <hr class="greyline"><br>
Chris@49 4941
Chris@49 4942 <a name="t_st_members"></a>
Chris@49 4943 <b>
Chris@49 4944 .t()
Chris@49 4945 <br>.st()
Chris@49 4946 </b>
Chris@49 4947 <ul>
Chris@49 4948 <li>
Chris@49 4949 Member functions of any matrix or vector expression
Chris@49 4950 </li>
Chris@49 4951 <br>
Chris@49 4952 <li>
Chris@49 4953 <i>.t()</i> provides a transposed copy of the object; if a given object has complex elements, a Hermitian transpose is done (ie. the conjugate of the elements is taken during the transpose operation)
Chris@49 4954 </li>
Chris@49 4955 <br>
Chris@49 4956 <li>
Chris@49 4957 <i>.st()</i> provides a transposed copy of the object, without taking the conjugate of the elements (complex matrices)
Chris@49 4958 </li>
Chris@49 4959 <br>
Chris@49 4960 <li>
Chris@49 4961 For non-complex objects, the <i>.t()</i> and <i>.st()</i> functions are equivalent
Chris@49 4962 </li>
Chris@49 4963 <br>
Chris@49 4964 <li>
Chris@49 4965 Examples:
Chris@49 4966 <ul>
Chris@49 4967 <pre>
Chris@49 4968 mat A = randu&lt;mat&gt;(4,5);
Chris@49 4969 mat B = A.t();
Chris@49 4970 </pre>
Chris@49 4971 </ul>
Chris@49 4972 </li>
Chris@49 4973 <br>
Chris@49 4974 <li>
Chris@49 4975 The <i>.t()</i> and <i>.st()</i> functions were added in version 2.4
Chris@49 4976 </li>
Chris@49 4977 <br>
Chris@49 4978 <li>
Chris@49 4979 See also:
Chris@49 4980 <ul>
Chris@49 4981 <li><a href="#trans">trans()</a></li>
Chris@49 4982 <li><a href="#strans">strans()</a></li>
Chris@49 4983 </ul>
Chris@49 4984 </li>
Chris@49 4985 <br>
Chris@49 4986 </ul>
Chris@49 4987 <hr class="greyline"><br>
Chris@49 4988
Chris@49 4989 <a name="transform"></a>
Chris@49 4990 <b>.transform(&nbsp;</b>functor<b>&nbsp;)</b>
Chris@49 4991 <br>
Chris@49 4992 <b>.transform(&nbsp;</b>lambda function<b>&nbsp;)</b>&nbsp;&nbsp;&nbsp;<i>(C++11 only)</i>
Chris@49 4993 <br>
Chris@49 4994 <ul>
Chris@49 4995 <li>
Chris@49 4996 Transform each element using a functor or lambda function
Chris@49 4997 </li>
Chris@49 4998 <br>
Chris@49 4999 <li>
Chris@49 5000 For matrices, transformation is done column-by-column (ie. column 0 is transformed, then column 1, ...)
Chris@49 5001 </li>
Chris@49 5002 <br>
Chris@49 5003 <li>
Chris@49 5004 For cubes, transformation is done slice-by-slice; each slice is transformed column-by-column
Chris@49 5005 </li>
Chris@49 5006 <br>
Chris@49 5007 <li>
Chris@49 5008 This function was added in version 3.800
Chris@49 5009 </li>
Chris@49 5010 <br>
Chris@49 5011 <li>
Chris@49 5012 Examples:
Chris@49 5013 <ul>
Chris@49 5014 <pre>
Chris@49 5015 // C++11 only example
Chris@49 5016
Chris@49 5017 mat A = ones&lt;mat&gt;(4,5);
Chris@49 5018
Chris@49 5019 // add 123 to every element
Chris@49 5020 A.transform( [](double val) { return (val + 123.0); } );
Chris@49 5021 </pre>
Chris@49 5022 </ul>
Chris@49 5023 </li>
Chris@49 5024 <br>
Chris@49 5025 <li>
Chris@49 5026 See also:
Chris@49 5027 <ul>
Chris@49 5028 <li><a href="#operators">overloaded operators</a></li>
Chris@49 5029 <li><a href="#imbue">.imbue()</a></li>
Chris@49 5030 <li><a href="#fill">.fill()</a></li>
Chris@49 5031 <li><a href="http://en.wikipedia.org/wiki/Function_object">function object</a> at Wikipedia</li>
Chris@49 5032 <li><a href="http://en.wikipedia.org/wiki/C%2B%2B11#Lambda_functions_and_expressions">C++11 lambda functions</a> at Wikipedia</li>
Chris@49 5033 <li><a href="http://www.cprogramming.com/c++11/c++11-lambda-closures.html">lambda function</a> at cprogramming.com</li>
Chris@49 5034 </ul>
Chris@49 5035 </li>
Chris@49 5036 <br>
Chris@49 5037 </ul>
Chris@49 5038 <hr class="greyline"><br>
Chris@49 5039
Chris@49 5040 <a name="zeros_member"></a>
Chris@49 5041 <b>.zeros()</b>
Chris@49 5042 <br><b>.zeros(n_elem)</b>
Chris@49 5043 <br><b>.zeros(n_rows, n_cols)</b>
Chris@49 5044 <br><b>.zeros(n_rows, n_cols, n_slices)</b>
Chris@49 5045 <ul>
Chris@49 5046 <li>
Chris@49 5047 Set the elements of an object to zero, optionally first resizing to specified dimensions
Chris@49 5048 </li>
Chris@49 5049 <br>
Chris@49 5050 <li>
Chris@49 5051 <i>.zeros()</i> and <i>.zeros(n_elem)</i> are member function of <i>Col</i> and <i>Row</i>
Chris@49 5052 </li>
Chris@49 5053 <br>
Chris@49 5054 <li>
Chris@49 5055 <i>.zeros()</i> and <i>.zeros(n_rows, n_cols)</i> are member functions of <i>Mat</i>
Chris@49 5056 </li>
Chris@49 5057 <br>
Chris@49 5058 <li>
Chris@49 5059 <i>.zeros()</i> and <i>.zeros(n_rows, n_cols, n_slices)</i> are member functions of <i>Cube</i>
Chris@49 5060 </li>
Chris@49 5061 <br>
Chris@49 5062 <li>
Chris@49 5063 Examples:
Chris@49 5064 <ul>
Chris@49 5065 <pre>
Chris@49 5066 mat A = randu&lt;mat&gt;(5,10);
Chris@49 5067 A.zeros(); // sets all elements to zero
Chris@49 5068 A.zeros(10,20); // sets the size to 10 rows and 20 columns
Chris@49 5069 // followed by setting all elements to zero
Chris@49 5070 </pre>
Chris@49 5071 </ul>
Chris@49 5072 </li>
Chris@49 5073 <br>
Chris@49 5074 <li>
Chris@49 5075 See also:
Chris@49 5076 <ul>
Chris@49 5077 <li><a href="#zeros_standalone">zeros()</a> (standalone function)</li>
Chris@49 5078 <li><a href="#ones_member">.ones()</a></li>
Chris@49 5079 <li><a href="#randu_randn_member">.randu()</a></li>
Chris@49 5080 <li><a href="#fill">.fill()</a></li>
Chris@49 5081 <li><a href="#imbue">.imbue()</a></li>
Chris@49 5082 <li><a href="#reset">.reset()</a></li>
Chris@49 5083 <li><a href="#set_size">.set_size()</a></li>
Chris@49 5084 </ul>
Chris@49 5085 </li>
Chris@49 5086 <br>
Chris@49 5087 </ul>
Chris@49 5088 <hr class="greyline">
Chris@49 5089
Chris@49 5090
Chris@49 5091 <hr class="greyline">
Chris@49 5092 <br>
Chris@49 5093 <br>
Chris@49 5094 <font size=+1><b>Other Classes</b></font>
Chris@49 5095 <br>
Chris@49 5096 <br>
Chris@49 5097 <hr class="greyline">
Chris@49 5098 <br>
Chris@49 5099
Chris@49 5100 <a name="running_stat"></a>
Chris@49 5101 <b>running_stat&lt;</b><i>type</i><b>&gt;</b>
Chris@49 5102 <ul>
Chris@49 5103 <li>
Chris@49 5104 Class for keeping statistics of a continuously sampled one dimensional process/signal.
Chris@49 5105 Useful if the storage of individual samples (scalars) is not necessary or desired.
Chris@49 5106 Also useful if the number of samples is not known beforehand or exceeds available memory.
Chris@49 5107 </li>
Chris@49 5108 <br>
Chris@49 5109 <li>
Chris@49 5110 <i>type</i> should be one of: <i>float</i>, <i>double</i>, <i><a href="#cx_float_double">cx_float</a></i>, <i><a href="#cx_float_double">cx_double</a></i>
Chris@49 5111 </li>
Chris@49 5112 <br>
Chris@49 5113 <li>
Chris@49 5114 Member functions:
Chris@49 5115 <ul>
Chris@49 5116 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 5117 <tbody>
Chris@49 5118 <tr>
Chris@49 5119 <td style="vertical-align: top;">
Chris@49 5120 <b>.operator()(</b>scalar<b>)</b>
Chris@49 5121 </td>
Chris@49 5122 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5123 </td>
Chris@49 5124 <td style="vertical-align: top;">
Chris@49 5125 update the statistics so far using the given scalar
Chris@49 5126 </td>
Chris@49 5127 </tr>
Chris@49 5128 <tr>
Chris@49 5129 <td style="vertical-align: top;">
Chris@49 5130 <b>.mean()</b>
Chris@49 5131 </td>
Chris@49 5132 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5133 </td>
Chris@49 5134 <td style="vertical-align: top;">
Chris@49 5135 get the mean or average value so far
Chris@49 5136 </td>
Chris@49 5137 </tr>
Chris@49 5138 <tr>
Chris@49 5139 <td style="vertical-align: top;">
Chris@49 5140 <b>.var(</b>norm_type=0<b>)</b>
Chris@49 5141 </td>
Chris@49 5142 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5143 </td>
Chris@49 5144 <td style="vertical-align: top;">
Chris@49 5145 get the variance so far
Chris@49 5146 </td>
Chris@49 5147 </tr>
Chris@49 5148 <tr>
Chris@49 5149 <td style="vertical-align: top;">
Chris@49 5150 <b>.stddev(</b>norm_type=0<b>)</b>
Chris@49 5151 </td>
Chris@49 5152 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5153 </td>
Chris@49 5154 <td style="vertical-align: top;">
Chris@49 5155 get the standard deviation so far
Chris@49 5156 </td>
Chris@49 5157 </tr>
Chris@49 5158 <tr>
Chris@49 5159 <td style="vertical-align: top;">
Chris@49 5160 <b>.min()</b>
Chris@49 5161 </td>
Chris@49 5162 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5163 </td>
Chris@49 5164 <td style="vertical-align: top;">
Chris@49 5165 get the minimum value so far
Chris@49 5166 </td>
Chris@49 5167 </tr>
Chris@49 5168 <tr>
Chris@49 5169 <td style="vertical-align: top;">
Chris@49 5170 <b>.max()</b>
Chris@49 5171 </td>
Chris@49 5172 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5173 </td>
Chris@49 5174 <td style="vertical-align: top;">
Chris@49 5175 get the maximum value so far
Chris@49 5176 </td>
Chris@49 5177 </tr>
Chris@49 5178 <tr>
Chris@49 5179 <td style="vertical-align: top;">
Chris@49 5180 <b>.reset()</b>
Chris@49 5181 </td>
Chris@49 5182 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5183 </td>
Chris@49 5184 <td style="vertical-align: top;">
Chris@49 5185 reset all statistics and set the number of samples to zero
Chris@49 5186 </td>
Chris@49 5187 </tr>
Chris@49 5188 <tr>
Chris@49 5189 <td style="vertical-align: top;">
Chris@49 5190 <b>.count()</b>
Chris@49 5191 </td>
Chris@49 5192 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5193 </td>
Chris@49 5194 <td style="vertical-align: top;">
Chris@49 5195 get the number of samples so far
Chris@49 5196 </td>
Chris@49 5197 </tr>
Chris@49 5198 </tbody>
Chris@49 5199 </table>
Chris@49 5200 </ul>
Chris@49 5201 </li>
Chris@49 5202 <br>
Chris@49 5203 <li>
Chris@49 5204 For the .var() and .stddev() functions, the default <i>norm_type=0</i> performs normalisation using <i>N-1</i>
Chris@49 5205 (where <i>N</i> is the number of samples so far),
Chris@49 5206 providing the best unbiased estimator.
Chris@49 5207 Using <i>norm_type=1</i> causes normalisation to be done using <i>N</i>, which provides the second moment around the mean.
Chris@49 5208 </li>
Chris@49 5209 <br>
Chris@49 5210 <li>
Chris@49 5211 The return type of .count() depends on the underlying form of <i>type</i>: it is either <i>float</i> or <i>double</i>.
Chris@49 5212 </li>
Chris@49 5213 <br>
Chris@49 5214 <li>
Chris@49 5215 Examples:
Chris@49 5216 <ul>
Chris@49 5217 <pre>
Chris@49 5218 running_stat&lt;double&gt; stats;
Chris@49 5219
Chris@49 5220 for(uword i=0; i&lt;10000; ++i)
Chris@49 5221 {
Chris@49 5222 double sample = double(rand())/RAND_MAX;
Chris@49 5223 stats(sample);
Chris@49 5224 }
Chris@49 5225
Chris@49 5226 cout &lt;&lt; "mean = " &lt;&lt; stats.mean() &lt;&lt; endl;
Chris@49 5227 cout &lt;&lt; "var = " &lt;&lt; stats.var() &lt;&lt; endl;
Chris@49 5228 cout &lt;&lt; "min = " &lt;&lt; stats.min() &lt;&lt; endl;
Chris@49 5229 cout &lt;&lt; "max = " &lt;&lt; stats.max() &lt;&lt; endl;
Chris@49 5230 </pre>
Chris@49 5231 </ul>
Chris@49 5232 </li>
Chris@49 5233 <br>
Chris@49 5234 <li>See also:
Chris@49 5235 <ul>
Chris@49 5236 <li><a href="#stats_fns">statistics functions</a></li>
Chris@49 5237 <li><a href="#running_stat_vec">running_stat_vec</a></li>
Chris@49 5238 </ul>
Chris@49 5239 </li>
Chris@49 5240 </ul>
Chris@49 5241 <br>
Chris@49 5242 <hr class="greyline"><br>
Chris@49 5243
Chris@49 5244 <a name="running_stat_vec"></a>
Chris@49 5245 <b>running_stat_vec&lt;</b><i>type</i><b>&gt;(calc_cov = false)</b>
Chris@49 5246 <ul>
Chris@49 5247 <li>
Chris@49 5248 Class for keeping statistics of a continuously sampled multi-dimensional process/signal.
Chris@49 5249 Useful if the storage of individual samples is not necessary or desired.
Chris@49 5250 Also useful if the number of samples is not known beforehand or exceeds available memory.
Chris@49 5251 </li>
Chris@49 5252 <br>
Chris@49 5253 <li>
Chris@49 5254 This class is similar to <i>running_stat</i>, with the difference being that vectors are processed instead of single values.
Chris@49 5255 </li>
Chris@49 5256 <br>
Chris@49 5257 <li>
Chris@49 5258 <i>type</i> must match the element type used by the sample vectors
Chris@49 5259 (ie. it must be one of <i>float</i>, <i>double</i>, <i><a href="#cx_float_double">cx_float</a></i>, <i><a href="#cx_float_double">cx_double</a></i>)
Chris@49 5260 </li>
Chris@49 5261 <br>
Chris@49 5262 <li>
Chris@49 5263 <i>type</i> can be inferred via the use of the <i>elem_type</i> member typedef of a vector class.
Chris@49 5264 For example, <i>fvec::elem_type</i> will be interpreted as <i>float</i>,
Chris@49 5265 while <i>cx_vec::elem_type</i> will be interpreted as <i><a href="#cx_float_double">cx_double</a></i>.
Chris@49 5266 </li>
Chris@49 5267 <br>
Chris@49 5268 <li>
Chris@49 5269 Member functions:
Chris@49 5270 <ul>
Chris@49 5271 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 5272 <tbody>
Chris@49 5273 <tr>
Chris@49 5274 <td style="vertical-align: top;">
Chris@49 5275 <b>.operator()(</b>vector<b>)</b>
Chris@49 5276 </td>
Chris@49 5277 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5278 </td>
Chris@49 5279 <td style="vertical-align: top;">
Chris@49 5280 update the statistics so far using the given vector
Chris@49 5281 </td>
Chris@49 5282 </tr>
Chris@49 5283 <tr>
Chris@49 5284 <td style="vertical-align: top;">
Chris@49 5285 <b>.mean()</b>
Chris@49 5286 </td>
Chris@49 5287 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5288 </td>
Chris@49 5289 <td style="vertical-align: top;">
Chris@49 5290 get the mean vector so far
Chris@49 5291 </td>
Chris@49 5292 </tr>
Chris@49 5293 <tr>
Chris@49 5294 <td style="vertical-align: top;">
Chris@49 5295 <b>.var(</b>norm_type=0<b>)</b>
Chris@49 5296 </td>
Chris@49 5297 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5298 </td>
Chris@49 5299 <td style="vertical-align: top;">
Chris@49 5300 get the vector of variances so far
Chris@49 5301 </td>
Chris@49 5302 </tr>
Chris@49 5303 <tr>
Chris@49 5304 <td style="vertical-align: top;">
Chris@49 5305 <b>.stddev(</b>norm_type=0<b>)</b>
Chris@49 5306 </td>
Chris@49 5307 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5308 </td>
Chris@49 5309 <td style="vertical-align: top;">
Chris@49 5310 get the vector of standard deviations so far
Chris@49 5311 </td>
Chris@49 5312 </tr>
Chris@49 5313 <tr>
Chris@49 5314 <td style="vertical-align: top;">
Chris@49 5315 <b>.min()</b>
Chris@49 5316 </td>
Chris@49 5317 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5318 </td>
Chris@49 5319 <td style="vertical-align: top;">
Chris@49 5320 get the vector of minimum values so far
Chris@49 5321 </td>
Chris@49 5322 </tr>
Chris@49 5323 <tr>
Chris@49 5324 <td style="vertical-align: top;">
Chris@49 5325 <b>.max()</b>
Chris@49 5326 </td>
Chris@49 5327 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5328 </td>
Chris@49 5329 <td style="vertical-align: top;">
Chris@49 5330 get the vector of maximum values so far
Chris@49 5331 </td>
Chris@49 5332 </tr>
Chris@49 5333 <tr>
Chris@49 5334 <td style="vertical-align: top;">
Chris@49 5335 <b>.cov(</b>norm_type=0<b>)</b>
Chris@49 5336 </td>
Chris@49 5337 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5338 </td>
Chris@49 5339 <td style="vertical-align: top;">
Chris@49 5340 get the covariance matrix so far
Chris@49 5341 <br>NOTE: this only works if <i>calc_cov</i> is set to <i>true</i> during the construction of the class
Chris@49 5342 </td>
Chris@49 5343 </tr>
Chris@49 5344 <tr>
Chris@49 5345 <td style="vertical-align: top;">
Chris@49 5346 <b>.reset()</b>
Chris@49 5347 </td>
Chris@49 5348 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5349 </td>
Chris@49 5350 <td style="vertical-align: top;">
Chris@49 5351 reset all statistics and set the number of samples to zero
Chris@49 5352 </td>
Chris@49 5353 </tr>
Chris@49 5354 <tr>
Chris@49 5355 <td style="vertical-align: top;">
Chris@49 5356 <b>.count()</b>
Chris@49 5357 </td>
Chris@49 5358 <td style="vertical-align: top;">&nbsp;<br>
Chris@49 5359 </td>
Chris@49 5360 <td style="vertical-align: top;">
Chris@49 5361 get the number of samples so far
Chris@49 5362 </td>
Chris@49 5363 </tr>
Chris@49 5364 </tbody>
Chris@49 5365 </table>
Chris@49 5366 </ul>
Chris@49 5367 </li>
Chris@49 5368 <br>
Chris@49 5369 <li>
Chris@49 5370 For the .var() and .stddev() functions, the default <i>norm_type=0</i> performs normalisation using <i>N-1</i>
Chris@49 5371 (where <i>N</i> is the number of samples so far),
Chris@49 5372 providing the best unbiased estimator.
Chris@49 5373 Using <i>norm_type=1</i> causes normalisation to be done using <i>N</i>, which provides the second moment around the mean.
Chris@49 5374 </li>
Chris@49 5375 <br>
Chris@49 5376 <li>
Chris@49 5377 The return type of .count() depends on the underlying form of <i>type</i>: it is either <i>float</i> or <i>double</i>.
Chris@49 5378 </li>
Chris@49 5379 <br>
Chris@49 5380 <li>
Chris@49 5381 Examples:
Chris@49 5382 <ul>
Chris@49 5383 <pre>
Chris@49 5384 running_stat_vec&lt;rowvec::elem_type&gt; stats;
Chris@49 5385
Chris@49 5386 rowvec sample;
Chris@49 5387
Chris@49 5388 for(uword i=0; i&lt;10000; ++i)
Chris@49 5389 {
Chris@49 5390 sample = randu&lt;rowvec&gt;(5);
Chris@49 5391 stats(sample);
Chris@49 5392 }
Chris@49 5393
Chris@49 5394 cout &lt;&lt; "mean = " &lt;&lt; stats.mean() &lt;&lt; endl;
Chris@49 5395 cout &lt;&lt; "var = " &lt;&lt; stats.var() &lt;&lt; endl;
Chris@49 5396 cout &lt;&lt; "min = " &lt;&lt; stats.min() &lt;&lt; endl;
Chris@49 5397 cout &lt;&lt; "max = " &lt;&lt; stats.max() &lt;&lt; endl;
Chris@49 5398
Chris@49 5399 //
Chris@49 5400 //
Chris@49 5401
Chris@49 5402 running_stat_vec&lt;rowvec::elem_type&gt; more_stats(true);
Chris@49 5403
Chris@49 5404 for(uword i=0; i&lt;20; ++i)
Chris@49 5405 {
Chris@49 5406 sample = randu&lt;rowvec&gt;(3);
Chris@49 5407
Chris@49 5408 sample(1) -= sample(0);
Chris@49 5409 sample(2) += sample(1);
Chris@49 5410
Chris@49 5411 more_stats(sample);
Chris@49 5412 }
Chris@49 5413
Chris@49 5414 cout &lt;&lt; "covariance matrix = " &lt;&lt; endl;
Chris@49 5415 cout &lt;&lt; more_stats.cov() &lt;&lt; endl;
Chris@49 5416
Chris@49 5417 rowvec sd = more_stats.stddev();
Chris@49 5418
Chris@49 5419 cout &lt;&lt; "correlations = " &lt;&lt; endl;
Chris@49 5420 cout &lt;&lt; more_stats.cov() / (sd.t() * sd);
Chris@49 5421 </pre>
Chris@49 5422 </ul>
Chris@49 5423 </li>
Chris@49 5424 <br>
Chris@49 5425 <li>See also:
Chris@49 5426 <ul>
Chris@49 5427 <li><a href="#cov">cov()</a></li>
Chris@49 5428 <li><a href="#cor">cor()</a></li>
Chris@49 5429 <li><a href="#running_stat">running_stat</a></li>
Chris@49 5430 <li><a href="#stats_fns">statistics functions</a></li>
Chris@49 5431 </ul>
Chris@49 5432 </li>
Chris@49 5433 </ul>
Chris@49 5434 <br>
Chris@49 5435 <hr class="greyline"><br>
Chris@49 5436
Chris@49 5437 <a name="wall_clock"></a>
Chris@49 5438 <b>wall_clock</b>
Chris@49 5439 <ul>
Chris@49 5440 <li>
Chris@49 5441 Simple wall clock timer class, for measuring the number of elapsed seconds between two intervals
Chris@49 5442 </li>
Chris@49 5443 <br>
Chris@49 5444 <li>
Chris@49 5445 Examples:
Chris@49 5446 <ul>
Chris@49 5447 <pre>
Chris@49 5448 wall_clock timer;
Chris@49 5449
Chris@49 5450 mat A = randu&lt;mat&gt;(4,4);
Chris@49 5451 mat B = randu&lt;mat&gt;(4,4);
Chris@49 5452 mat C;
Chris@49 5453
Chris@49 5454 timer.tic();
Chris@49 5455 for(uword i=0; i&lt;100000; ++i)
Chris@49 5456 C = A + B + A + B;
Chris@49 5457
Chris@49 5458 double n_secs = timer.toc();
Chris@49 5459 cout &lt;&lt; "took " &lt;&lt; n_secs &lt;&lt; " seconds" &lt;&lt; endl;
Chris@49 5460 </pre>
Chris@49 5461 </ul>
Chris@49 5462 </li>
Chris@49 5463 </ul>
Chris@49 5464 <br>
Chris@49 5465 <hr class="greyline">
Chris@49 5466
Chris@49 5467 <hr class="greyline">
Chris@49 5468 <br>
Chris@49 5469 <br>
Chris@49 5470 <font size=+1><b>Generated Vectors/Matrices</b></font>
Chris@49 5471 <br>
Chris@49 5472 <br>
Chris@49 5473 <hr class="greyline">
Chris@49 5474 <br>
Chris@49 5475
Chris@49 5476 <a name="eye_standalone"></a>
Chris@49 5477 <b>eye(n_rows, n_cols)</b>
Chris@49 5478 <ul>
Chris@49 5479 <li>
Chris@49 5480 Generate a matrix with the elements along the main diagonal set to one
Chris@49 5481 and off-diagonal elements set to zero
Chris@49 5482 </li>
Chris@49 5483 <br>
Chris@49 5484 <li>
Chris@49 5485 An identity matrix is generated when <i>n_rows</i> = <i>n_cols</i>
Chris@49 5486 </li>
Chris@49 5487 <br>
Chris@49 5488 <li>
Chris@49 5489 Usage:
Chris@49 5490 <ul>
Chris@49 5491 <li>
Chris@49 5492 <i>matrix_type</i> X = eye&lt;<i>matrix_type</i>&gt;(n_rows, n_cols)
Chris@49 5493 </li>
Chris@49 5494 </ul>
Chris@49 5495 </li>
Chris@49 5496 <br>
Chris@49 5497 <li>
Chris@49 5498 Examples:
Chris@49 5499 <ul>
Chris@49 5500 <pre>
Chris@49 5501 mat A = eye&lt;mat&gt;(5,5);
Chris@49 5502 mat B = 123.0 * eye&lt;mat&gt;(5,5);
Chris@49 5503 </pre>
Chris@49 5504 </ul>
Chris@49 5505 </li>
Chris@49 5506 <br>
Chris@49 5507 <li>See also:
Chris@49 5508 <ul>
Chris@49 5509 <li><a href="#eye_member">.eye()</a> (member function of Mat)</li>
Chris@49 5510 <li><a href="#diag">.diag()</a></li>
Chris@49 5511 <li><a href="#ones_standalone">ones()</a></li>
Chris@49 5512 <li><a href="#diagmat">diagmat()</a></li>
Chris@49 5513 <li><a href="#diagvec">diagvec()</a></li>
Chris@49 5514 </ul>
Chris@49 5515 </li>
Chris@49 5516 <br>
Chris@49 5517 </ul>
Chris@49 5518 <hr class="greyline"><br>
Chris@49 5519
Chris@49 5520 <a name="linspace"></a>
Chris@49 5521 <b>linspace(start, end, N=100)</b>
Chris@49 5522 <ul>
Chris@49 5523 <li>
Chris@49 5524 Generate a vector with <i>N</i> elements;
Chris@49 5525 the values of the elements linearly increase from <i>start</i> upto (and including) <i>end</i>
Chris@49 5526 <br>
Chris@49 5527 </li>
Chris@49 5528 <br>
Chris@49 5529 <li>
Chris@49 5530 Usage:
Chris@49 5531 <ul>
Chris@49 5532 <li><i>vector_type</i> v = linspace&lt;<i>vector_type</i>&gt;(start, end, N)</li>
Chris@49 5533 <li><i>matrix_type</i> X = linspace&lt;<i>matrix_type</i>&gt;(start, end, N)</li>
Chris@49 5534 </ul>
Chris@49 5535 </li>
Chris@49 5536 <br>
Chris@49 5537 <li>
Chris@49 5538 If a <i>matrix_type</i> is specified, the resultant matrix will have one column
Chris@49 5539 </li>
Chris@49 5540 <br>
Chris@49 5541 <li>
Chris@49 5542 Examples:
Chris@49 5543 <ul>
Chris@49 5544 <pre>
Chris@49 5545 vec v = linspace&lt;vec&gt;(10, 20, 5);
Chris@49 5546 mat X = linspace&lt;mat&gt;(10, 20, 5);
Chris@49 5547 </pre>
Chris@49 5548 </ul>
Chris@49 5549 </li>
Chris@49 5550 <br>
Chris@49 5551 <li>
Chris@49 5552 See also:
Chris@49 5553 <ul>
Chris@49 5554 <li><a href="#ones_standalone">ones()</a></li>
Chris@49 5555 </ul>
Chris@49 5556 </li>
Chris@49 5557 </ul>
Chris@49 5558 <br>
Chris@49 5559 <hr class="greyline"><br>
Chris@49 5560
Chris@49 5561
Chris@49 5562
Chris@49 5563 <a name="ones_standalone"></a>
Chris@49 5564 <b>
Chris@49 5565 ones(n_elem)
Chris@49 5566 <br>ones(n_rows, n_cols)
Chris@49 5567 <br>ones(n_rows, n_cols, n_slices)
Chris@49 5568 </b>
Chris@49 5569 <ul>
Chris@49 5570 <li>
Chris@49 5571 Generate a vector, matrix or cube with all elements set to one
Chris@49 5572 </li>
Chris@49 5573 <br>
Chris@49 5574 <li>
Chris@49 5575 Usage:
Chris@49 5576 <ul>
Chris@49 5577 <li><i>vector_type</i> v = ones&lt;<i>vector_type</i>&gt;(n_elem)</li>
Chris@49 5578 <li><i>matrix_type</i> X = ones&lt;<i>matrix_type</i>&gt;(n_rows, n_cols)</li>
Chris@49 5579 <li><i>cube_type</i> Q = ones&lt;<i>cube_type</i>&gt;(n_rows, n_cols, n_slices)</li>
Chris@49 5580 </ul>
Chris@49 5581 </li>
Chris@49 5582 <br>
Chris@49 5583 <li>
Chris@49 5584 Examples:
Chris@49 5585 <ul>
Chris@49 5586 <pre>
Chris@49 5587 vec v = ones&lt;vec&gt;(10);
Chris@49 5588 uvec u = ones&lt;uvec&gt;(11);
Chris@49 5589 mat A = ones&lt;mat&gt;(5,6);
Chris@49 5590 cube Q = ones&lt;cube&gt;(5,6,7);
Chris@49 5591
Chris@49 5592 mat B = 123.0 * ones&lt;mat&gt;(5,6);
Chris@49 5593 </pre>
Chris@49 5594 </ul>
Chris@49 5595 </li>
Chris@49 5596 <br>
Chris@49 5597 <li>
Chris@49 5598 See also:
Chris@49 5599 <ul>
Chris@49 5600 <li><a href="#ones_member">.ones()</a> (member function of <i>Mat</i>, <i>Col</i>, <i>Row</i> and <i>Cube</i>)</li>
Chris@49 5601 <li><a href="#eye_standalone">eye()</a></li>
Chris@49 5602 <li><a href="#linspace">linspace()</a></li>
Chris@49 5603 <li><a href="#zeros_standalone">zeros()</a></li>
Chris@49 5604 </ul>
Chris@49 5605 </li>
Chris@49 5606 </ul>
Chris@49 5607 <br>
Chris@49 5608 <hr class="greyline"><br>
Chris@49 5609
Chris@49 5610 <a name="randu_randn_standalone"></a>
Chris@49 5611 <b>randu(n_elem)</b>
Chris@49 5612 <br><b>randu(n_rows, n_cols)</b>
Chris@49 5613 <br><b>randu(n_rows, n_cols, n_slices)</b>
Chris@49 5614 <br>
Chris@49 5615 <br><b>randn(n_elem)</b>
Chris@49 5616 <br><b>randn(n_rows, n_cols)</b>
Chris@49 5617 <br><b>randn(n_rows, n_cols, n_slices)</b>
Chris@49 5618 <ul>
Chris@49 5619 <li>
Chris@49 5620 Generate a vector, matrix or cube with the elements set to random values
Chris@49 5621 </li>
Chris@49 5622 <br>
Chris@49 5623 <li><i>randu()</i> uses a uniform distribution in the [0,1] interval
Chris@49 5624 </li>
Chris@49 5625 <br>
Chris@49 5626 <li><i>randn()</i> uses a normal/Gaussian distribution with zero mean and unit variance
Chris@49 5627 </li>
Chris@49 5628 <br>
Chris@49 5629 <li>
Chris@49 5630 Usage:
Chris@49 5631 <ul>
Chris@49 5632 <li><i>vector_type</i> v = randu&lt;<i>vector_type</i>&gt;(n_elem)</li>
Chris@49 5633 <li><i>matrix_type</i> X = randu&lt;<i>matrix_type</i>&gt;(n_rows, n_cols)</li>
Chris@49 5634 <li><i>cube_type</i> Q = randu&lt;<i>cube_type</i>&gt;(n_rows, n_cols, n_slices)</li>
Chris@49 5635 </ul>
Chris@49 5636 </li>
Chris@49 5637 <br>
Chris@49 5638 <li>
Chris@49 5639 To change the seed, use the <a href="http://cplusplus.com/reference/clibrary/cstdlib/srand/">std::srand()</a> function.
Chris@49 5640 </li>
Chris@49 5641 <br>
Chris@49 5642 <li>
Chris@49 5643 Examples:
Chris@49 5644 <ul>
Chris@49 5645 <pre>
Chris@49 5646 vec v = randu&lt;vec&gt;(5);
Chris@49 5647 mat A = randu&lt;mat&gt;(5,6);
Chris@49 5648 cube Q = randu&lt;cube&gt;(5,6,7);
Chris@49 5649 </pre>
Chris@49 5650 </ul>
Chris@49 5651 </li>
Chris@49 5652 <li>See also:
Chris@49 5653 <ul>
Chris@49 5654 <li><a href="#randu_randn_member">.randu() &amp; .randn()</a> (member functions)</li>
Chris@49 5655 <li><a href="#imbue">.imbue()</a></li>
Chris@49 5656 <li><a href="#ones_standalone">ones()</a></li>
Chris@49 5657 <li><a href="#zeros_standalone">zeros()</a></li>
Chris@49 5658 <li><a href="#shuffle">shuffle()</a></li>
Chris@49 5659 <li><a href="http://cplusplus.com/reference/clibrary/cstdlib/srand/">std::srand()</a></li>
Chris@49 5660 </ul>
Chris@49 5661 </li>
Chris@49 5662 <br>
Chris@49 5663 </ul>
Chris@49 5664 <hr class="greyline"><br>
Chris@49 5665
Chris@49 5666 <a name="repmat"></a>
Chris@49 5667 <b>repmat(A, num_copies_per_row, num_copies_per_col)</b>
Chris@49 5668 <ul>
Chris@49 5669 <li>Generate a matrix by replicating matrix A in a block-like fashion</li>
Chris@49 5670 <br>
Chris@49 5671 <li>The generated matrix has the following size:
Chris@49 5672 <ul>
Chris@49 5673 rows = num_copies_per_row * A.n_rows
Chris@49 5674 <br>
Chris@49 5675 cols = num_copies_per_col * A.n_cols
Chris@49 5676 </ul>
Chris@49 5677 </li>
Chris@49 5678 <br>
Chris@49 5679 <li>
Chris@49 5680 Examples:
Chris@49 5681 <ul>
Chris@49 5682 <pre>
Chris@49 5683 mat A = randu&lt;mat&gt;(2, 3);
Chris@49 5684
Chris@49 5685 mat B = repmat(A, 4, 5);
Chris@49 5686 </pre>
Chris@49 5687 </ul>
Chris@49 5688 </li>
Chris@49 5689 <br>
Chris@49 5690 </ul>
Chris@49 5691 <hr class="greyline">
Chris@49 5692 <br>
Chris@49 5693
Chris@49 5694 <a name="speye"></a>
Chris@49 5695 <b>speye(n_rows, n_cols)</b>
Chris@49 5696 <ul>
Chris@49 5697 <li>
Chris@49 5698 Generate a sparse matrix with the elements along the main diagonal set to one
Chris@49 5699 and off-diagonal elements set to zero
Chris@49 5700 </li>
Chris@49 5701 <br>
Chris@49 5702 <li>
Chris@49 5703 An identity matrix is generated when <i>n_rows</i> = <i>n_cols</i>
Chris@49 5704 </li>
Chris@49 5705 <br>
Chris@49 5706 <li>
Chris@49 5707 Usage:
Chris@49 5708 <ul>
Chris@49 5709 <li>
Chris@49 5710 <i>sparse_matrix_type</i> X = speye&lt;<i>sparse_matrix_type</i>&gt;(n_rows, n_cols)
Chris@49 5711 </li>
Chris@49 5712 </ul>
Chris@49 5713 </li>
Chris@49 5714 <br>
Chris@49 5715 <li>
Chris@49 5716 Examples:
Chris@49 5717 <ul>
Chris@49 5718 <pre>
Chris@49 5719 sp_mat A = speye&lt;sp_mat&gt;(5,5);
Chris@49 5720 </pre>
Chris@49 5721 </ul>
Chris@49 5722 </li>
Chris@49 5723 <br>
Chris@49 5724 <li>See also:
Chris@49 5725 <ul>
Chris@49 5726 <li><a href="#sprandu_sprandn">sprandu()/sprandn()</a></li>
Chris@49 5727 </ul>
Chris@49 5728 </li>
Chris@49 5729 <br>
Chris@49 5730 </ul>
Chris@49 5731 <hr class="greyline"><br>
Chris@49 5732
Chris@49 5733 <a name="sprandu_sprandn"></a>
Chris@49 5734 <b>sprandu(n_rows, n_cols, density)</b>
Chris@49 5735 <br><b>sprandn(n_rows, n_cols, density)</b>
Chris@49 5736 <ul>
Chris@49 5737 <li>
Chris@49 5738 Generate a sparse matrix with the non-zero elements set to random values
Chris@49 5739 </li>
Chris@49 5740 <br>
Chris@49 5741 <li>
Chris@49 5742 The <i>density</i> argument specifies the percentage of non-zero elements; it must be in the [0,1] interval
Chris@49 5743 </li>
Chris@49 5744 <br>
Chris@49 5745 <li><i>sprandu()</i> uses a uniform distribution in the [0,1] interval
Chris@49 5746 </li>
Chris@49 5747 <br>
Chris@49 5748 <li><i>sprandn()</i> uses a normal/Gaussian distribution with zero mean and unit variance
Chris@49 5749 </li>
Chris@49 5750 <br>
Chris@49 5751 <li>
Chris@49 5752 Usage:
Chris@49 5753 <ul>
Chris@49 5754 <li><i>sparse_matrix_type</i> X = sprandu&lt;<i>sparse_matrix_type</i>&gt;(n_rows, n_cols, density)</li>
Chris@49 5755 </ul>
Chris@49 5756 </li>
Chris@49 5757 <br>
Chris@49 5758 <li>
Chris@49 5759 To change the seed, use the <a href="http://cplusplus.com/reference/clibrary/cstdlib/srand/">std::srand()</a> function.
Chris@49 5760 </li>
Chris@49 5761 <br>
Chris@49 5762 <li>
Chris@49 5763 Examples:
Chris@49 5764 <ul>
Chris@49 5765 <pre>
Chris@49 5766 sp_mat A = sprandu&lt;sp_mat&gt;(100, 200, 0.1);
Chris@49 5767 </pre>
Chris@49 5768 </ul>
Chris@49 5769 </li>
Chris@49 5770 <li>See also:
Chris@49 5771 <ul>
Chris@49 5772 <li><a href="#speye">speye()</a></li>
Chris@49 5773 <li><a href="http://cplusplus.com/reference/clibrary/cstdlib/srand/">std::srand()</a></li>
Chris@49 5774 </ul>
Chris@49 5775 </li>
Chris@49 5776 <br>
Chris@49 5777 </ul>
Chris@49 5778 <hr class="greyline"><br>
Chris@49 5779
Chris@49 5780 <a name="toeplitz"></a>
Chris@49 5781 <b>toeplitz(A)</b>
Chris@49 5782 <br><b>toeplitz(A,B)</b>
Chris@49 5783 <br><b>circ_toeplitz(A)</b>
Chris@49 5784 <ul>
Chris@49 5785 <li>
Chris@49 5786 toeplitz(): generate a Toeplitz matrix, with the first column specified by <i>A</i>, and (optionally) the first row specified by <i>B</i>
Chris@49 5787 </li>
Chris@49 5788 <br>
Chris@49 5789 <li>
Chris@49 5790 circ_toeplitz(): generate a circulant Toeplitz matrix
Chris@49 5791 </li>
Chris@49 5792 <br>
Chris@49 5793 <li>
Chris@49 5794 A and B must be vectors
Chris@49 5795 </li>
Chris@49 5796 <br>
Chris@49 5797 <li>
Chris@49 5798 Examples:
Chris@49 5799 <ul>
Chris@49 5800 <pre>
Chris@49 5801 vec A = randu&lt;vec&gt;(5);
Chris@49 5802 mat X = toeplitz(A);
Chris@49 5803 mat Y = circ_toeplitz(A);
Chris@49 5804 </pre>
Chris@49 5805 </ul>
Chris@49 5806 </li>
Chris@49 5807 <br>
Chris@49 5808 <li>See also:
Chris@49 5809 <ul>
Chris@49 5810 <li><a href="http://mathworld.wolfram.com/ToeplitzMatrix.html">Toeplitz matrix in MathWorld</a></li>
Chris@49 5811 <li><a href="http://en.wikipedia.org/wiki/Toeplitz_matrix">Toeplitz matrix in Wikipedia</a></li>
Chris@49 5812 <li><a href="http://en.wikipedia.org/wiki/Circulant_matrix">Circulant matrix in Wikipedia</a></li>
Chris@49 5813 </ul>
Chris@49 5814 </li>
Chris@49 5815 <br>
Chris@49 5816 </ul>
Chris@49 5817 <hr class="greyline">
Chris@49 5818 <br>
Chris@49 5819
Chris@49 5820 <a name="zeros_standalone"></a>
Chris@49 5821 <b>zeros(n_elem)</b>
Chris@49 5822 <br><b>zeros(n_rows, n_cols)</b>
Chris@49 5823 <br><b>zeros(n_rows, n_cols, n_slices)</b>
Chris@49 5824 <ul>
Chris@49 5825 <li>
Chris@49 5826 Generate a vector, matrix or cube with the elements set to zero
Chris@49 5827 </li>
Chris@49 5828 <br>
Chris@49 5829 <li>
Chris@49 5830 Usage:
Chris@49 5831 <ul>
Chris@49 5832 <li><i>vector_type</i> v = zeros&lt;<i>vector_type</i>&gt;(n_elem)</li>
Chris@49 5833 <li><i>matrix_type</i> X = zeros&lt;<i>matrix_type</i>&gt;(n_rows, n_cols)</li>
Chris@49 5834 <li><i>cube_type</i> X = zeros&lt;<i>cube_type</i>&gt;(n_rows, n_cols, n_slices)</li>
Chris@49 5835 </ul>
Chris@49 5836 </li>
Chris@49 5837 <br>
Chris@49 5838 <li>
Chris@49 5839 Examples:
Chris@49 5840 <ul>
Chris@49 5841 <pre>
Chris@49 5842 vec v = zeros&lt;vec&gt;(10);
Chris@49 5843 uvec u = zeros&lt;uvec&gt;(11);
Chris@49 5844 mat A = zeros&lt;mat&gt;(5,6);
Chris@49 5845 cube Q = zeros&lt;cube&gt;(5,6,7);
Chris@49 5846 </pre>
Chris@49 5847 </ul>
Chris@49 5848 </li>
Chris@49 5849 <br>
Chris@49 5850 <li>
Chris@49 5851 See also:
Chris@49 5852 <ul>
Chris@49 5853 <li><a href="#zeros_member">.zeros()</a> (member function of <i>Mat</i>, <i>Col</i>, <i>Row</i> and <i>Cube</i>)</li>
Chris@49 5854 <li><a href="#ones_member">.ones()</a> (member function of <i>Mat</i>, <i>Col</i>, <i>Row</i> and <i>Cube</i>)</li>
Chris@49 5855 <li><a href="#ones_standalone">ones()</a></li>
Chris@49 5856 </ul>
Chris@49 5857 </li>
Chris@49 5858 </ul>
Chris@49 5859 <br>
Chris@49 5860 <hr class="greyline">
Chris@49 5861
Chris@49 5862 <hr class="greyline">
Chris@49 5863 <br>
Chris@49 5864 <br>
Chris@49 5865 <font size=+1><b>Functions Individually Applied to Each Element of a Matrix/Cube</b></font>
Chris@49 5866 <br>
Chris@49 5867 <br>
Chris@49 5868 <hr class="greyline">
Chris@49 5869 <br>
Chris@49 5870
Chris@49 5871 <a name="abs"></a>
Chris@49 5872 <b>abs(mat)</b>
Chris@49 5873 <br><b>abs(cube)</b>
Chris@49 5874 <br><b>abs(cx_mat)</b>
Chris@49 5875 <br><b>abs(cx_cube)</b>
Chris@49 5876 <ul>
Chris@49 5877 <li>
Chris@49 5878 Obtain the magnitude of each element
Chris@49 5879 </li>
Chris@49 5880 <br>
Chris@49 5881 <li>
Chris@49 5882 Usage for non-complex matrices:
Chris@49 5883 <ul>
Chris@49 5884 <li><i>matrix_type</i> Y = abs(X)</li>
Chris@49 5885 <li>X and Y must have the same <i>matrix_type</i></li>
Chris@49 5886 </ul>
Chris@49 5887 </li>
Chris@49 5888 <br>
Chris@49 5889 <li>
Chris@49 5890 Usage for non-complex cubes:
Chris@49 5891 <ul>
Chris@49 5892 <li><i>cube_type</i> Y = abs(X)</li>
Chris@49 5893 <li>X and Y must have the same <i>cube_type</i></li>
Chris@49 5894 </ul>
Chris@49 5895 </li>
Chris@49 5896 <br>
Chris@49 5897 <li>
Chris@49 5898 Usage for complex matrices:
Chris@49 5899 <ul>
Chris@49 5900 <li><i>non_complex_matrix_type</i> Y = abs(X)</li>
Chris@49 5901 <li>X must be a have complex matrix type, eg., <i>cx_mat</i> or <i>cx_fmat</i></li>
Chris@49 5902 <li>The type of Y must be related to the type of X,
Chris@49 5903 eg., if X has the type <i>cx_mat</i>, then the type of Y must be <i>mat</i>
Chris@49 5904 </ul>
Chris@49 5905 </li>
Chris@49 5906 <br>
Chris@49 5907 <li>
Chris@49 5908 Usage for complex cubes:
Chris@49 5909 <ul>
Chris@49 5910 <li><i>non_complex_cube_type</i> Y = abs(X)</li>
Chris@49 5911 <li>X must be a have complex cube type, eg., <i>cx_cube</i> or <i>cx_fcube</i></li>
Chris@49 5912 <li>The type of Y must be related to the type of X,
Chris@49 5913 eg., if X has the type <i>cx_cube</i>, then the type of Y must be <i>cube</i>
Chris@49 5914 </ul>
Chris@49 5915 </li>
Chris@49 5916 <br>
Chris@49 5917 <li>
Chris@49 5918 Examples:
Chris@49 5919 <ul>
Chris@49 5920 <pre>
Chris@49 5921 mat A = randu&lt;mat&gt;(5,5);
Chris@49 5922 mat B = abs(A);
Chris@49 5923
Chris@49 5924 cx_mat X = randu&lt;cx_mat&gt;(5,5);
Chris@49 5925 mat Y = abs(X);
Chris@49 5926 </pre>
Chris@49 5927 </ul>
Chris@49 5928 </li>
Chris@49 5929 </ul>
Chris@49 5930 <br>
Chris@49 5931 <hr class="greyline"><br>
Chris@49 5932
Chris@49 5933 <a name="eps"></a>
Chris@49 5934 <b>eps(X)</b>
Chris@49 5935 <ul>
Chris@49 5936 <li>
Chris@49 5937 Obtain the positive distance of the absolute value of each element of <i>X</i> to the next largest representable floating point number
Chris@49 5938 </li>
Chris@49 5939 <br>
Chris@49 5940 <li>
Chris@49 5941 <i>X</i> can be a scalar (eg. <i>double</i>), vector or matrix
Chris@49 5942 </li>
Chris@49 5943 <br>
Chris@49 5944 <li>
Chris@49 5945 Examples:
Chris@49 5946 <ul>
Chris@49 5947 <pre>
Chris@49 5948 mat A = randu&lt;mat&gt;(4,5);
Chris@49 5949 mat B = eps(A);
Chris@49 5950 </pre>
Chris@49 5951 </ul>
Chris@49 5952 </li>
Chris@49 5953 <br>
Chris@49 5954 <li>
Chris@49 5955 See also:
Chris@49 5956 <ul>
Chris@49 5957 <li><a href="#constants">datum::eps</a></li>
Chris@49 5958 <li><a href="http://mathworld.wolfram.com/Floating-PointArithmetic.html">Floating-Point Arithmetic in MathWorld</a></li>
Chris@49 5959 <li><a href="http://en.wikipedia.org/wiki/IEEE_754-2008">IEEE Standard for Floating-Point Arithmetic in Wikipedia</a></li>
Chris@49 5960
Chris@49 5961 </ul>
Chris@49 5962 </li>
Chris@49 5963 </ul>
Chris@49 5964 <br>
Chris@49 5965 <hr class="greyline"><br>
Chris@49 5966
Chris@49 5967 <a name="misc_fns"></a>
Chris@49 5968 <b>
Chris@49 5969 miscellaneous functions:
Chris@49 5970 <br>&nbsp; exp, exp2, exp10, trunc_exp,
Chris@49 5971 <br>&nbsp; log, log2, log10, trunc_log,
Chris@49 5972 <br>&nbsp; pow, sqrt, square
Chris@49 5973 <br>&nbsp; floor, ceil, round
Chris@49 5974 </b>
Chris@49 5975 <br>
Chris@49 5976 <ul>
Chris@49 5977 <li>
Chris@49 5978 Apply a function to each element
Chris@49 5979 </li>
Chris@49 5980 <br>
Chris@49 5981 <li>
Chris@49 5982 Usage:
Chris@49 5983 <ul>
Chris@49 5984 <li>
Chris@49 5985 <i>matrix_type</i> B = misc_fn(A)
Chris@49 5986 </li>
Chris@49 5987 <li>
Chris@49 5988 <i>cube_type</i> B = misc_fn(A)
Chris@49 5989 </li>
Chris@49 5990 <li>
Chris@49 5991 A and B must have the same <i>matrix_type/cube_type</i>
Chris@49 5992 </li>
Chris@49 5993 <li>
Chris@49 5994 misc_fn(A) is one of:
Chris@49 5995 <ul>
Chris@49 5996
Chris@49 5997 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 5998 <tbody>
Chris@49 5999 <tr>
Chris@49 6000 <td style="vertical-align: top;">
Chris@49 6001 exp(A)<sup>&nbsp;</sup>
Chris@49 6002 </td>
Chris@49 6003 <td style="vertical-align: top;">
Chris@49 6004 &nbsp;
Chris@49 6005 </td>
Chris@49 6006 <td style="vertical-align: top;">
Chris@49 6007 base-e exponential, <i>e<sup>x</sup></i>
Chris@49 6008 </td>
Chris@49 6009 </tr>
Chris@49 6010 <tr>
Chris@49 6011 <td style="vertical-align: top;">
Chris@49 6012 exp2(A)<sup>&nbsp;</sup>
Chris@49 6013 </td>
Chris@49 6014 <td style="vertical-align: top;">
Chris@49 6015 &nbsp;
Chris@49 6016 </td>
Chris@49 6017 <td style="vertical-align: top;">
Chris@49 6018 base-2 exponential, <i>2<sup>x</sup></i>
Chris@49 6019 </td>
Chris@49 6020 </tr>
Chris@49 6021 <tr>
Chris@49 6022 <td style="vertical-align: top;">
Chris@49 6023 exp10(A)<sup>&nbsp;</sup>
Chris@49 6024 </td>
Chris@49 6025 <td style="vertical-align: top;">
Chris@49 6026 &nbsp;
Chris@49 6027 </td>
Chris@49 6028 <td style="vertical-align: top;">
Chris@49 6029 base-10 exponential, <i>10<sup>x</sup></i>
Chris@49 6030 </td>
Chris@49 6031 </tr>
Chris@49 6032 <tr>
Chris@49 6033 <td style="vertical-align: top;">
Chris@49 6034 trunc_exp(A)
Chris@49 6035 </td>
Chris@49 6036 <td style="vertical-align: top;">
Chris@49 6037 &nbsp;
Chris@49 6038 </td>
Chris@49 6039 <td style="vertical-align: top;">
Chris@49 6040 base-e exponential,
Chris@49 6041 truncated to avoid infinity
Chris@49 6042 <br>
Chris@49 6043 <font size=-1>(only for elements with type <i>float</i> or <i>double</i>)</font>
Chris@49 6044 </td>
Chris@49 6045 </tr>
Chris@49 6046 <tr>
Chris@49 6047 <td style="vertical-align: top;">
Chris@49 6048 log(A)<sub>&nbsp;</sub>
Chris@49 6049 </td>
Chris@49 6050 <td style="vertical-align: top;">
Chris@49 6051 &nbsp;
Chris@49 6052 </td>
Chris@49 6053 <td style="vertical-align: top;">
Chris@49 6054 natural log, <i>log<sub>e</sub>&nbsp;x</i>
Chris@49 6055 </td>
Chris@49 6056 </tr>
Chris@49 6057 <tr>
Chris@49 6058 <td style="vertical-align: top;">
Chris@49 6059 log2(A)<sub>&nbsp;</sub>
Chris@49 6060 </td>
Chris@49 6061 <td style="vertical-align: top;">
Chris@49 6062 &nbsp;
Chris@49 6063 </td>
Chris@49 6064 <td style="vertical-align: top;">
Chris@49 6065 base-2 log, <i>log<sub>2</sub>&nbsp;x</i>
Chris@49 6066 </td>
Chris@49 6067 </tr>
Chris@49 6068 <tr>
Chris@49 6069 <td style="vertical-align: top;">
Chris@49 6070 log10(A)<sub>&nbsp;</sub>
Chris@49 6071 </td>
Chris@49 6072 <td style="vertical-align: top;">
Chris@49 6073 &nbsp;
Chris@49 6074 </td>
Chris@49 6075 <td style="vertical-align: top;">
Chris@49 6076 base-10 log, <i>log<sub>10</sub>&nbsp;x</i>
Chris@49 6077 </td>
Chris@49 6078 </tr>
Chris@49 6079 <tr>
Chris@49 6080 <td style="vertical-align: top;">
Chris@49 6081 trunc_log(A)
Chris@49 6082 </td>
Chris@49 6083 <td style="vertical-align: top;">
Chris@49 6084 &nbsp;
Chris@49 6085 </td>
Chris@49 6086 <td style="vertical-align: top;">
Chris@49 6087 natural log,
Chris@49 6088 truncated to avoid &plusmn;infinity
Chris@49 6089 <br>
Chris@49 6090 <font size=-1>(only for elements with type <i>float</i> or <i>double</i>)</font>
Chris@49 6091 </td>
Chris@49 6092 </tr>
Chris@49 6093 <tr>
Chris@49 6094 <td style="vertical-align: top;">
Chris@49 6095 pow(A, p)<sup>&nbsp;</sup>
Chris@49 6096 </td>
Chris@49 6097 <td style="vertical-align: top;">
Chris@49 6098 &nbsp;
Chris@49 6099 </td>
Chris@49 6100 <td style="vertical-align: top;">
Chris@49 6101 raise to the power of p, <i>x<sup>p</sup></i>
Chris@49 6102 </td>
Chris@49 6103 </tr>
Chris@49 6104 <tr>
Chris@49 6105 <td style="vertical-align: top;">
Chris@49 6106 sqrt(A)<sup>&nbsp;</sup>
Chris@49 6107 </td>
Chris@49 6108 <td style="vertical-align: top;">
Chris@49 6109 &nbsp;
Chris@49 6110 </td>
Chris@49 6111 <td style="vertical-align: top;">
Chris@49 6112 square root, <i>x<sup>&frac12;</sup></i>
Chris@49 6113 </td>
Chris@49 6114 </tr>
Chris@49 6115 <tr>
Chris@49 6116 <td style="vertical-align: top;">
Chris@49 6117 square(A)<sup>&nbsp;</sup>
Chris@49 6118 </td>
Chris@49 6119 <td style="vertical-align: top;">
Chris@49 6120 &nbsp;
Chris@49 6121 </td>
Chris@49 6122 <td style="vertical-align: top;">
Chris@49 6123 square, <i>x<sup>2</sup></i>
Chris@49 6124 </td>
Chris@49 6125 </tr>
Chris@49 6126 <tr>
Chris@49 6127 <td style="vertical-align: top;">
Chris@49 6128 floor(A)
Chris@49 6129 </td>
Chris@49 6130 <td style="vertical-align: top;">
Chris@49 6131 &nbsp;
Chris@49 6132 </td>
Chris@49 6133 <td style="vertical-align: top;">
Chris@49 6134 largest integral value that is not greater than the input value
Chris@49 6135 </td>
Chris@49 6136 </tr>
Chris@49 6137 <tr>
Chris@49 6138 <td style="vertical-align: top;">
Chris@49 6139 ceil(A)
Chris@49 6140 </td>
Chris@49 6141 <td style="vertical-align: top;">
Chris@49 6142 &nbsp;
Chris@49 6143 </td>
Chris@49 6144 <td style="vertical-align: top;">
Chris@49 6145 smallest integral value that is not less than the input value
Chris@49 6146 </td>
Chris@49 6147 </tr>
Chris@49 6148 <tr>
Chris@49 6149 <td style="vertical-align: top;">
Chris@49 6150 round(A)
Chris@49 6151 </td>
Chris@49 6152 <td style="vertical-align: top;">
Chris@49 6153 &nbsp;
Chris@49 6154 </td>
Chris@49 6155 <td style="vertical-align: top;">
Chris@49 6156 round to nearest integer, away from zero
Chris@49 6157 </td>
Chris@49 6158 </tr>
Chris@49 6159 </tbody>
Chris@49 6160 </table>
Chris@49 6161
Chris@49 6162
Chris@49 6163 </ul>
Chris@49 6164 </li>
Chris@49 6165
Chris@49 6166 </ul>
Chris@49 6167 </li>
Chris@49 6168 <br>
Chris@49 6169 <li>
Chris@49 6170 Examples:
Chris@49 6171 <ul>
Chris@49 6172 <pre>
Chris@49 6173 mat A = randu&lt;mat&gt;(5,5);
Chris@49 6174 mat B = exp(A);
Chris@49 6175 </pre>
Chris@49 6176 </ul>
Chris@49 6177 </li>
Chris@49 6178 </ul>
Chris@49 6179 <br>
Chris@49 6180 <hr class="greyline"><br>
Chris@49 6181
Chris@49 6182 <a name="trig_fns"></a>
Chris@49 6183 <b>trigonometric functions (cos, sin, tan, ...)</b>
Chris@49 6184 <ul>
Chris@49 6185 <li>
Chris@49 6186 Apply a trigonometric function to each element
Chris@49 6187 </li>
Chris@49 6188 <br>
Chris@49 6189 <li>
Chris@49 6190 Usage:
Chris@49 6191 <ul>
Chris@49 6192 <li>
Chris@49 6193 <i>matrix_type</i> Y = trig_fn(X)
Chris@49 6194 </li>
Chris@49 6195 <li>
Chris@49 6196 <i>cube_type</i> Y = trig_fn(X)
Chris@49 6197 </li>
Chris@49 6198 <li>
Chris@49 6199 X and Y must have the same <i>matrix_type/cube_type</i>
Chris@49 6200 </li>
Chris@49 6201 <li>
Chris@49 6202 trig_fn is one of:
Chris@49 6203 <ul>
Chris@49 6204 <li>
Chris@49 6205 cos family: <i>cos</i>, <i>acos</i>, <i>cosh</i>, <i>acosh</i>
Chris@49 6206 </li>
Chris@49 6207 <li>
Chris@49 6208 sin family: <i>sin</i>, <i>asin</i>, <i>sinh</i>, <i>asinh</i>
Chris@49 6209 </li>
Chris@49 6210 <li>
Chris@49 6211 tan family: <i>tan</i>, <i>atan</i>, <i>tanh</i>, <i>atanh</i>
Chris@49 6212 </li>
Chris@49 6213 </ul>
Chris@49 6214 </li>
Chris@49 6215
Chris@49 6216 </ul>
Chris@49 6217 </li>
Chris@49 6218 <br>
Chris@49 6219 <li>
Chris@49 6220 Examples:
Chris@49 6221 <ul>
Chris@49 6222 <pre>
Chris@49 6223 mat X = randu&lt;mat&gt;(5,5);
Chris@49 6224 mat Y = cos(X);
Chris@49 6225 </pre>
Chris@49 6226 </ul>
Chris@49 6227 </li>
Chris@49 6228 </ul>
Chris@49 6229 <br>
Chris@49 6230 <hr class="greyline">
Chris@49 6231
Chris@49 6232 <hr class="greyline">
Chris@49 6233 <br>
Chris@49 6234 <br>
Chris@49 6235 <font size=+1><b>Scalar Valued Functions of Vectors/Matrices/Cubes</b></font>
Chris@49 6236 <br>
Chris@49 6237 <br>
Chris@49 6238 <hr class="greyline">
Chris@49 6239 <br>
Chris@49 6240
Chris@49 6241 <a name="accu"></a>
Chris@49 6242 <b>accu(mat)</b>
Chris@49 6243 <br><b>accu(cube)</b>
Chris@49 6244 <ul>
Chris@49 6245 <li>
Chris@49 6246 Accumulate (sum) all elements
Chris@49 6247 </li>
Chris@49 6248 <br>
Chris@49 6249 <li>
Chris@49 6250 Examples:
Chris@49 6251 <ul>
Chris@49 6252 <pre>
Chris@49 6253 mat A = randu&lt;mat&gt;(5,5);
Chris@49 6254 double x = accu(A);
Chris@49 6255
Chris@49 6256 mat B = randu&lt;mat&gt;(5,5);
Chris@49 6257 double y = accu(A % B);
Chris@49 6258
Chris@49 6259 // operator % performs element-wise multiplication,
Chris@49 6260 // hence accu(A % B) is a "multiply-and-accumulate"
Chris@49 6261 // operation
Chris@49 6262 </pre>
Chris@49 6263 </ul>
Chris@49 6264 </li>
Chris@49 6265 <br>
Chris@49 6266 <li>
Chris@49 6267 See also:
Chris@49 6268 <ul>
Chris@49 6269 <li><a href="#sum">sum()</a></li>
Chris@49 6270 <li><a href="#cumsum">cumsum()</a></li>
Chris@49 6271 <li><a href="#as_scalar">as_scalar()</a></li>
Chris@49 6272 <li><a href="#trace">trace()</a></li>
Chris@49 6273 </ul>
Chris@49 6274 </li>
Chris@49 6275 <br>
Chris@49 6276 </ul>
Chris@49 6277 <hr class="greyline"><br>
Chris@49 6278
Chris@49 6279 <a name="as_scalar"></a>
Chris@49 6280 <b>as_scalar(expression)</b>
Chris@49 6281 <ul>
Chris@49 6282 <li>
Chris@49 6283 Evaluate an expression that results in a 1x1 matrix,
Chris@49 6284 followed by converting the 1x1 matrix to a pure scalar
Chris@49 6285 </li>
Chris@49 6286 <br>
Chris@49 6287 <li>
Chris@49 6288 If a binary or trinary expression is given (ie. 2 or 3 terms),
Chris@49 6289 the function will try to exploit the fact that the result is a 1x1 matrix
Chris@49 6290 by using optimised expression evaluations
Chris@49 6291 </li>
Chris@49 6292 <br>
Chris@49 6293 <li>
Chris@49 6294 Examples:
Chris@49 6295 <ul>
Chris@49 6296 <pre>
Chris@49 6297 rowvec r = randu&lt;rowvec&gt;(5);
Chris@49 6298 colvec q = randu&lt;colvec&gt;(5);
Chris@49 6299 mat X = randu&lt;mat&gt;(5,5);
Chris@49 6300
Chris@49 6301 // examples of some expressions
Chris@49 6302 // for which optimised implementations exist
Chris@49 6303
Chris@49 6304 double a = as_scalar(r*q);
Chris@49 6305 double b = as_scalar(r*X*q);
Chris@49 6306 double c = as_scalar(r*diagmat(X)*q);
Chris@49 6307 double d = as_scalar(r*inv(diagmat(X))*q);
Chris@49 6308 </pre>
Chris@49 6309 </ul>
Chris@49 6310 </li>
Chris@49 6311 <br>
Chris@49 6312 <li>
Chris@49 6313 See also:
Chris@49 6314 <ul>
Chris@49 6315 <li><a href="#accu">accu()</a></li>
Chris@49 6316 <li><a href="#conv_to">conv_to()</a></li>
Chris@49 6317 <li><a href="#dot">dot()</a></li>
Chris@49 6318 <li><a href="#norm">norm()</a></li>
Chris@49 6319 <li><a href="#reshape">reshape()</a></li>
Chris@49 6320 <li><a href="#resize">resize()</a></li>
Chris@49 6321 <li><a href="#trace">trace()</a></li>
Chris@49 6322 </ul>
Chris@49 6323 </li>
Chris@49 6324 <br>
Chris@49 6325 </ul>
Chris@49 6326 <hr class="greyline"><br>
Chris@49 6327
Chris@49 6328 <a name="det"></a>
Chris@49 6329 <b>det(A, </b><i>slow=false</i><b>)</b>
Chris@49 6330 <ul>
Chris@49 6331 <li>
Chris@49 6332 Determinant of square matrix <i>A</i>
Chris@49 6333 </li>
Chris@49 6334 <br>
Chris@49 6335 <li>
Chris@49 6336 If <i>A</i> is not square, a <i>std::logic_error</i> exception is thrown
Chris@49 6337 </li>
Chris@49 6338 <br>
Chris@49 6339 <li>
Chris@49 6340 <b>Caveat</b>: for large matrices you may want to use <a href="#log_det">log_det()</a> instead
Chris@49 6341 </li>
Chris@49 6342 <br>
Chris@49 6343 <li>
Chris@49 6344 For matrix sizes &le; 4x4, a fast algorithm is used by default.
Chris@49 6345 In rare instances, the fast algorithm might be less precise than the standard algorithm.
Chris@49 6346 To force the use of the standard algorithm, set the <i>slow</i> argument to <i>true</i>
Chris@49 6347 </li>
Chris@49 6348 <br>
Chris@49 6349 <li>
Chris@49 6350 Examples:
Chris@49 6351 <ul>
Chris@49 6352 <pre>
Chris@49 6353 mat A = randu&lt;mat&gt;(5,5);
Chris@49 6354 double x = det(A);
Chris@49 6355
Chris@49 6356 mat44 B = randu&lt;mat&gt;(4,4);
Chris@49 6357
Chris@49 6358 double y = det(B); // use fast algorithm by default
Chris@49 6359 double z = det(B, true); // use slow algorithm
Chris@49 6360 </pre>
Chris@49 6361 </ul>
Chris@49 6362 </li>
Chris@49 6363 <br>
Chris@49 6364 <li>
Chris@49 6365 See also:
Chris@49 6366 <ul>
Chris@49 6367 <li><a href="#log_det">log_det()</a></li>
Chris@49 6368 <li><a href="http://mathworld.wolfram.com/Determinant.html">determinant in MathWorld</a></li>
Chris@49 6369 <li><a href="http://en.wikipedia.org/wiki/Determinant">determinant in Wikipedia</a></li>
Chris@49 6370 </ul>
Chris@49 6371 </li>
Chris@49 6372 <br>
Chris@49 6373 </ul>
Chris@49 6374 <hr class="greyline"><br>
Chris@49 6375
Chris@49 6376 <a name="dot"></a>
Chris@49 6377 <b>dot(A, B)</b>
Chris@49 6378 <br><b>cdot(A, B)</b>
Chris@49 6379 <br><b>norm_dot(A, B)</b>
Chris@49 6380 <ul>
Chris@49 6381 <li>
Chris@49 6382 <i>dot(A,B)</i>: dot product of <i>A</i> and <i>B</i>, under the assumption that <i>A</i> and <i>B</i> are vectors with the same number of elements
Chris@49 6383 </li>
Chris@49 6384 <br>
Chris@49 6385 <li>
Chris@49 6386 <i>cdot(A,B)</i>: as per <i>dot(A,B)</i>, but the complex conjugate of <i>A</i> is used
Chris@49 6387 </li>
Chris@49 6388 <br>
Chris@49 6389 <li>
Chris@49 6390 <i>norm_dot(A,B)</i>: normalised version of <i>dot(A,B)</i>
Chris@49 6391 </li>
Chris@49 6392 <br>
Chris@49 6393 <li>
Chris@49 6394 Examples:
Chris@49 6395 <ul>
Chris@49 6396 <pre>
Chris@49 6397 vec a = randu&lt;vec&gt;(10);
Chris@49 6398 vec b = randu&lt;vec&gt;(10);
Chris@49 6399
Chris@49 6400 double x = dot(a,b);
Chris@49 6401 </pre>
Chris@49 6402 </ul>
Chris@49 6403 </li>
Chris@49 6404 <br>
Chris@49 6405 <li>See also:
Chris@49 6406 <ul>
Chris@49 6407 <li><a href="#as_scalar">as_scalar()</a></li>
Chris@49 6408 <li><a href="#cross">cross()</a></li>
Chris@49 6409 <li><a href="#conj">conj()</a></li>
Chris@49 6410 <li><a href="#norm">norm()</a></li>
Chris@49 6411 </ul>
Chris@49 6412 </li>
Chris@49 6413 <br>
Chris@49 6414 </ul>
Chris@49 6415 <hr class="greyline"><br>
Chris@49 6416
Chris@49 6417 <a name="log_det"></a>
Chris@49 6418 <b>log_det(val, sign, A)</b>
Chris@49 6419 <ul>
Chris@49 6420 <li>
Chris@49 6421 Log determinant of square matrix <i>A</i>, such that the determinant is equal to <i>exp(val)*sign</i>
Chris@49 6422 </li>
Chris@49 6423 <br>
Chris@49 6424 <li>
Chris@49 6425 If <i>A</i> is not square, a <i>std::logic_error</i> exception is thrown
Chris@49 6426 </li>
Chris@49 6427 <br>
Chris@49 6428 <li>
Chris@49 6429 Examples:
Chris@49 6430 <ul>
Chris@49 6431 <pre>
Chris@49 6432 mat A = randu&lt;mat&gt;(5,5);
Chris@49 6433
Chris@49 6434 double val;
Chris@49 6435 double sign;
Chris@49 6436
Chris@49 6437 log_det(val, sign, A);
Chris@49 6438 </pre>
Chris@49 6439 </ul>
Chris@49 6440 </li>
Chris@49 6441 <br>
Chris@49 6442 <li>
Chris@49 6443 See also:
Chris@49 6444 <ul>
Chris@49 6445 <li><a href="#det">det()</a></li>
Chris@49 6446 <li><a href="http://mathworld.wolfram.com/Determinant.html">determinant in MathWorld</a></li>
Chris@49 6447 <li><a href="http://en.wikipedia.org/wiki/Determinant">determinant in Wikipedia</a></li>
Chris@49 6448 </ul>
Chris@49 6449 </li>
Chris@49 6450 <br>
Chris@49 6451 </ul>
Chris@49 6452 <hr class="greyline"><br>
Chris@49 6453
Chris@49 6454 <a name="norm"></a>
Chris@49 6455 <b>
Chris@49 6456 norm(X, p)
Chris@49 6457 </b>
Chris@49 6458 <ul>
Chris@49 6459 <li>
Chris@49 6460 Compute the <i>p</i>-norm of <i>X</i>, where <i>X</i> can be a vector or a matrix
Chris@49 6461 </li>
Chris@49 6462 <br>
Chris@49 6463 <li>
Chris@49 6464 For vectors, <i>p</i> is an integer &ge;1, or one of: "-inf", "inf", "fro"
Chris@49 6465 </li>
Chris@49 6466 <br>
Chris@49 6467 <li>
Chris@49 6468 For matrices, <i>p</i> is one of: 1, 2, "inf", "fro"; the calculated norm is the <i>induced norm</i> (not entrywise norm)
Chris@49 6469 </li>
Chris@49 6470 <br>
Chris@49 6471 <li>
Chris@49 6472 "-inf" is the minimum norm, "inf" is the maximum norm, while "fro" is the Frobenius norm
Chris@49 6473 </li>
Chris@49 6474 <br>
Chris@49 6475 <li>
Chris@49 6476 To obtain the zero norm or Hamming norm (ie. the number of non-zero elements),
Chris@49 6477 you may want to use this expression: <a href="#accu">accu</a>(X&nbsp;!=&nbsp;0).
Chris@49 6478 </li>
Chris@49 6479 <br>
Chris@49 6480 <li>
Chris@49 6481 Examples:
Chris@49 6482 <ul>
Chris@49 6483 <pre>
Chris@49 6484 vec q = randu&lt;vec&gt;(5);
Chris@49 6485 double x = norm(q, 2);
Chris@49 6486 double y = norm(q, "inf");
Chris@49 6487 </pre>
Chris@49 6488 </ul>
Chris@49 6489 </li>
Chris@49 6490 <br>
Chris@49 6491 <li>
Chris@49 6492 See also:
Chris@49 6493 <ul>
Chris@49 6494 <li><a href="#dot">dot()</a></li>
Chris@49 6495 <li><a href="http://en.wikipedia.org/wiki/Norm_(mathematics)">Vector Norm in Wikipedia</a></li>
Chris@49 6496 <li><a href="http://mathworld.wolfram.com/VectorNorm.html">Vector Norm in MathWorld</a></li>
Chris@49 6497 <li><a href="http://en.wikipedia.org/wiki/Matrix_norm">Matrix Norm in Wikipedia</a></li>
Chris@49 6498 <li><a href="http://mathworld.wolfram.com/MatrixNorm.html">Matrix Norm in MathWorld</a></li>
Chris@49 6499 </ul>
Chris@49 6500 </li>
Chris@49 6501 <br>
Chris@49 6502 </ul>
Chris@49 6503 <hr class="greyline"><br>
Chris@49 6504
Chris@49 6505 <a name="rank"></a>
Chris@49 6506 <b>rank(X, tolerance = default)</b>
Chris@49 6507
Chris@49 6508 <ul>
Chris@49 6509 <li>Returns the rank of matrix <i>X</i></li><br>
Chris@49 6510 <li>Any singular values less than default tolerance are treated as zero</li><br>
Chris@49 6511 <li>The default tolerance is <i>max(X.n_rows, X.n_cols)*eps(sigma)</i>,
Chris@49 6512 where <i>sigma</i> is the largest singular value of <i>X</i>
Chris@49 6513 </li><br>
Chris@49 6514 <li>The computation is based on singular value decomposition;
Chris@49 6515 if the decomposition fails, a <i>std::runtime_error</i> exception is thrown</li><br>
Chris@49 6516 <li>
Chris@49 6517 Examples:
Chris@49 6518 <ul>
Chris@49 6519 <pre>
Chris@49 6520 mat A = randu&lt;mat&gt;(4,5);
Chris@49 6521 uword r = rank(A);
Chris@49 6522 </pre>
Chris@49 6523 </ul>
Chris@49 6524 </li>
Chris@49 6525 <br>
Chris@49 6526 <li>
Chris@49 6527 See also:
Chris@49 6528 <ul>
Chris@49 6529 <li><a href="#eps">eps()</a></li>
Chris@49 6530 <li><a href="http://mathworld.wolfram.com/MatrixRank.html">Rank in MathWorld</a></li>
Chris@49 6531 <li><a href="http://en.wikipedia.org/wiki/Rank_(linear_algebra)">Rank in Wikipedia</a></li>
Chris@49 6532 </ul>
Chris@49 6533 </li>
Chris@49 6534 </ul>
Chris@49 6535 <br>
Chris@49 6536 <hr class="greyline"><br>
Chris@49 6537
Chris@49 6538 <a name="trace"></a>
Chris@49 6539 <b>trace(X)</b>
Chris@49 6540 <ul>
Chris@49 6541 <li>
Chris@49 6542 Sum of the diagonal elements of square matrix <i>X</i>
Chris@49 6543 </li>
Chris@49 6544 <br>
Chris@49 6545 <li>
Chris@49 6546 If <i>X</i> is an expression,
Chris@49 6547 the function will try to use optimised expression evaluations to calculate only the diagonal elements
Chris@49 6548 </li>
Chris@49 6549 <br>
Chris@49 6550 <li>
Chris@49 6551 A <i>std::logic_error</i> exception is thrown if <i>X</i> does not evaluate to a square matrix
Chris@49 6552 </li>
Chris@49 6553 <br>
Chris@49 6554 <li>
Chris@49 6555 Examples:
Chris@49 6556 <ul>
Chris@49 6557 <pre>
Chris@49 6558 mat A = randu&lt;mat&gt;(5,5);
Chris@49 6559 double x = trace(A);
Chris@49 6560 </pre>
Chris@49 6561 </ul>
Chris@49 6562 </li>
Chris@49 6563 <br>
Chris@49 6564 <li>
Chris@49 6565 See also:
Chris@49 6566 <ul>
Chris@49 6567 <li><a href="#accu">accu()</a></li>
Chris@49 6568 <li><a href="#as_scalar">as_scalar()</a></li>
Chris@49 6569 <li><a href="#diag">.diag()</a></li>
Chris@49 6570 <li><a href="#diagvec">diagvec()</a></li>
Chris@49 6571 <li><a href="#sum">sum()</a></li>
Chris@49 6572 </ul>
Chris@49 6573 </li>
Chris@49 6574 <br>
Chris@49 6575 </ul>
Chris@49 6576 <hr class="greyline">
Chris@49 6577
Chris@49 6578 <hr class="greyline">
Chris@49 6579 <br>
Chris@49 6580 <br>
Chris@49 6581 <font size=+1><b>Scalar/Vector Valued Functions of Vectors/Matrices</b></font>
Chris@49 6582 <br>
Chris@49 6583 <br>
Chris@49 6584 <hr class="greyline">
Chris@49 6585 <br>
Chris@49 6586
Chris@49 6587 <a name="diagvec"></a>
Chris@49 6588 <b>diagvec(A, k=0)</b>
Chris@49 6589 <ul>
Chris@49 6590 <li>
Chris@49 6591 Extract the <i>k</i>-th diagonal from matrix <i>A</i>
Chris@49 6592 </li>
Chris@49 6593 <br>
Chris@49 6594 <li>
Chris@49 6595 The argument <i>k</i> is optional -- by default the main diagonal is extracted (<i>k=0</i>)
Chris@49 6596 </li>
Chris@49 6597 <br>
Chris@49 6598 <li>For <i>k &gt; 0</i>, the <i>k</i>-th super-diagonal is extracted (top-right corner)</li>
Chris@49 6599 <br>
Chris@49 6600 <li>For <i>k &lt; 0</i>, the <i>k</i>-th sub-diagonal is extracted (bottom-left corner)</li>
Chris@49 6601 <br>
Chris@49 6602 <li>
Chris@49 6603 An extracted a diagonal is interpreted as a column vector
Chris@49 6604 </li>
Chris@49 6605 <br>
Chris@49 6606 <li>
Chris@49 6607 Examples:
Chris@49 6608 <ul>
Chris@49 6609 <pre>
Chris@49 6610 mat A = randu&lt;mat&gt;(5,5);
Chris@49 6611 vec d = diagvec(A);
Chris@49 6612 </pre>
Chris@49 6613 </ul>
Chris@49 6614 </li>
Chris@49 6615 <br>
Chris@49 6616 <li>See also:
Chris@49 6617 <ul>
Chris@49 6618 <li><a href="#diag">.diag()</a></li>
Chris@49 6619 <li><a href="#diagmat">diagmat()</a></li>
Chris@49 6620 <li><a href="#trace">trace()</a></li>
Chris@49 6621 </ul>
Chris@49 6622 </li>
Chris@49 6623 <br>
Chris@49 6624 </ul>
Chris@49 6625 <hr class="greyline">
Chris@49 6626 <br>
Chris@49 6627
Chris@49 6628 <a name="min_and_max"></a>
Chris@49 6629 <b>min(mat, dim=0)</b>
Chris@49 6630 <br><b>min(rowvec)</b>
Chris@49 6631 <br><b>min(colvec)</b>
Chris@49 6632 <br>
Chris@49 6633 <br><b>max(mat, dim=0)</b>
Chris@49 6634 <br><b>max(rowvec)</b>
Chris@49 6635 <br><b>max(colvec)</b>
Chris@49 6636 <ul>
Chris@49 6637 <li>
Chris@49 6638 For a matrix argument, return the extremum value for each column (dim=0), or each row (dim=1)
Chris@49 6639 </li>
Chris@49 6640 <br>
Chris@49 6641 <li>
Chris@49 6642 For a vector argument, return the extremum value
Chris@49 6643 </li>
Chris@49 6644 <br>
Chris@49 6645 <li>
Chris@49 6646 Examples:
Chris@49 6647 <ul>
Chris@49 6648 <pre>
Chris@49 6649 colvec q = randu&lt;colvec&gt;(10,1);
Chris@49 6650 double x = max(q);
Chris@49 6651
Chris@49 6652 mat A = randu&lt;mat&gt;(10,10);
Chris@49 6653 rowvec b = max(A);
Chris@49 6654
Chris@49 6655 // same result as max(A)
Chris@49 6656 // the 0 explicitly indicates
Chris@49 6657 // "traverse across rows"
Chris@49 6658 rowvec c = max(A,0);
Chris@49 6659
Chris@49 6660 // the 1 explicitly indicates
Chris@49 6661 // "traverse across columns"
Chris@49 6662 colvec d = max(A,1);
Chris@49 6663
Chris@49 6664 // find the overall maximum value
Chris@49 6665 double y = max(max(A));
Chris@49 6666 </pre>
Chris@49 6667 </ul>
Chris@49 6668 </li>
Chris@49 6669 <br>
Chris@49 6670 <li>
Chris@49 6671 See also:
Chris@49 6672 <ul>
Chris@49 6673 <li><a href="#min_and_max_member">.min() &amp; .max()</a> (member functions of Mat and Cube)</li>
Chris@49 6674 <li><a href="#running_stat">running_stat</a></li>
Chris@49 6675 <li><a href="#running_stat_vec">running_stat_vec</a></li>
Chris@49 6676 </ul>
Chris@49 6677 </li>
Chris@49 6678 <br>
Chris@49 6679 </ul>
Chris@49 6680 <hr class="greyline"><br>
Chris@49 6681
Chris@49 6682 <a name="prod"></a>
Chris@49 6683 <b>prod(mat, dim=0)</b>
Chris@49 6684 <br><b>prod(rowvec)</b>
Chris@49 6685 <br><b>prod(colvec)</b>
Chris@49 6686 <ul>
Chris@49 6687 <li>
Chris@49 6688 For a matrix argument, return the product of elements in each column (dim=0), or each row (dim=1)
Chris@49 6689 </li>
Chris@49 6690 <br>
Chris@49 6691 <li>
Chris@49 6692 For a vector argument, return the product of all elements
Chris@49 6693 </li>
Chris@49 6694 <br>
Chris@49 6695 <li>
Chris@49 6696 Examples:
Chris@49 6697 <ul>
Chris@49 6698 <pre>
Chris@49 6699 colvec q = randu&lt;colvec&gt;(10,1);
Chris@49 6700 double x = prod(q);
Chris@49 6701
Chris@49 6702 mat A = randu&lt;mat&gt;(10,10);
Chris@49 6703 rowvec b = prod(A);
Chris@49 6704
Chris@49 6705 // same result as prod(A)
Chris@49 6706 // the 0 explicitly indicates
Chris@49 6707 // "traverse across rows"
Chris@49 6708 rowvec c = prod(A,0);
Chris@49 6709
Chris@49 6710 // the 1 explicitly indicates
Chris@49 6711 // "traverse across columns"
Chris@49 6712 colvec d = prod(A,1);
Chris@49 6713
Chris@49 6714 // find the overall product
Chris@49 6715 double y = prod(prod(A));
Chris@49 6716 </pre>
Chris@49 6717 </ul>
Chris@49 6718 </li>
Chris@49 6719 <br>
Chris@49 6720 <li>
Chris@49 6721 See also:
Chris@49 6722 <ul>
Chris@49 6723 <li><a href="#schur_product">Schur product</a></li>
Chris@49 6724 </ul>
Chris@49 6725 </li>
Chris@49 6726 </ul>
Chris@49 6727 <br>
Chris@49 6728 <hr class="greyline"><br>
Chris@49 6729
Chris@49 6730
Chris@49 6731 <a name="sum"></a>
Chris@49 6732 <b>sum(mat, dim=0)</b>
Chris@49 6733 <br><b>sum(rowvec)</b>
Chris@49 6734 <br><b>sum(colvec)</b>
Chris@49 6735 <ul>
Chris@49 6736 <li>
Chris@49 6737 For a matrix argument, return the sum of elements in each column (dim=0), or each row (dim=1)
Chris@49 6738 </li>
Chris@49 6739 <br>
Chris@49 6740 <li>
Chris@49 6741 For a vector argument, return the sum of all elements
Chris@49 6742 </li>
Chris@49 6743 <br>
Chris@49 6744 <li>
Chris@49 6745 To get a sum of all the elements regardless of the argument type (ie. matrix or vector),
Chris@49 6746 you may wish to use <a href="#accu">accu()</a> instead
Chris@49 6747 </li>
Chris@49 6748 <br>
Chris@49 6749 <li>
Chris@49 6750 Examples:
Chris@49 6751 <ul>
Chris@49 6752 <pre>
Chris@49 6753 colvec q = randu&lt;colvec&gt;(10,1);
Chris@49 6754 double x = sum(q);
Chris@49 6755
Chris@49 6756 mat A = randu&lt;mat&gt;(10,10);
Chris@49 6757 rowvec b = sum(A);
Chris@49 6758
Chris@49 6759 // same result as sum(A)
Chris@49 6760 // the 0 explicitly indicates
Chris@49 6761 // "traverse across rows"
Chris@49 6762 rowvec c = sum(A,0);
Chris@49 6763
Chris@49 6764 // the 1 explicitly indicates
Chris@49 6765 // "traverse across columns"
Chris@49 6766 colvec d = sum(A,1);
Chris@49 6767
Chris@49 6768 // find the overall sum
Chris@49 6769 double y = sum(sum(A));
Chris@49 6770 </pre>
Chris@49 6771 </ul>
Chris@49 6772 </li>
Chris@49 6773 <br>
Chris@49 6774 <li>
Chris@49 6775 See also:
Chris@49 6776 <ul>
Chris@49 6777 <li><a href="#accu">accu()</a></li>
Chris@49 6778 <li><a href="#cumsum">cumsum()</a></li>
Chris@49 6779 <li><a href="#trace">trace()</a></li>
Chris@49 6780 <li><a href="#as_scalar">as_scalar()</a></li>
Chris@49 6781 </ul>
Chris@49 6782 </li>
Chris@49 6783 <br>
Chris@49 6784 </ul>
Chris@49 6785 <hr class="greyline"><br>
Chris@49 6786
Chris@49 6787
Chris@49 6788 <a name="stats_fns"></a>
Chris@49 6789 <b>statistics: mean, median, stddev, var</b>
Chris@49 6790
Chris@49 6791 <ul>
Chris@49 6792 <table style="text-align: left;" border="0" cellpadding="2" cellspacing="2">
Chris@49 6793 <tbody>
Chris@49 6794 <tr>
Chris@49 6795 <td style="vertical-align: top;">
Chris@49 6796 <b>mean(mat, dim=0)</b>
Chris@49 6797 <br><b>mean(colvec)</b>
Chris@49 6798 <br><b>mean(rowvec)</b>
Chris@49 6799 <br>
Chris@49 6800 <br>
Chris@49 6801 </td>
Chris@49 6802 <td style="vertical-align: top;">
Chris@49 6803 &nbsp;
Chris@49 6804 </td>
Chris@49 6805 <td style="vertical-align: top;">
Chris@49 6806 mean (average value)
Chris@49 6807 </td>
Chris@49 6808 </tr>
Chris@49 6809 <tr>
Chris@49 6810 <td style="vertical-align: top;">
Chris@49 6811 <b>median(mat, dim=0)</b>
Chris@49 6812 <br><b>median(colvec)</b>
Chris@49 6813 <br><b>median(rowvec)</b>
Chris@49 6814 <br>
Chris@49 6815 <br>
Chris@49 6816 </td>
Chris@49 6817 <td style="vertical-align: top;">
Chris@49 6818 &nbsp;
Chris@49 6819 </td>
Chris@49 6820 <td style="vertical-align: top;">
Chris@49 6821 median
Chris@49 6822 </td>
Chris@49 6823 </tr>
Chris@49 6824 <tr>
Chris@49 6825 <td style="vertical-align: top;">
Chris@49 6826 <b>stddev(mat, norm_type=0, dim=0)</b>
Chris@49 6827 <br><b>stddev(colvec, norm_type=0)</b>
Chris@49 6828 <br><b>stddev(rowvec, norm_type=0)</b>
Chris@49 6829 <br>
Chris@49 6830 <br>
Chris@49 6831 </td>
Chris@49 6832 <td style="vertical-align: top;">
Chris@49 6833 &nbsp;
Chris@49 6834 </td>
Chris@49 6835 <td style="vertical-align: top;">
Chris@49 6836 standard deviation
Chris@49 6837 </td>
Chris@49 6838 </tr>
Chris@49 6839 <tr>
Chris@49 6840 <td style="vertical-align: top;">
Chris@49 6841 <b>var(mat, norm_type=0, dim=0)</b>
Chris@49 6842 <br><b>var(colvec, norm_type=0)</b>
Chris@49 6843 <br><b>var(rowvec, norm_type=0)</b>
Chris@49 6844 <br>
Chris@49 6845 <br>
Chris@49 6846 </td>
Chris@49 6847 <td style="vertical-align: top;">
Chris@49 6848 &nbsp;
Chris@49 6849 </td>
Chris@49 6850 <td style="vertical-align: top;">
Chris@49 6851 variance
Chris@49 6852 </td>
Chris@49 6853 </tr>
Chris@49 6854 </tbody>
Chris@49 6855 </table>
Chris@49 6856 <br>
Chris@49 6857 <li>
Chris@49 6858 For a matrix argument, find a particular statistic for each column (<i>dim=0</i>), or each row (<i>dim=1</i>)
Chris@49 6859 </li>
Chris@49 6860 <br>
Chris@49 6861 <li>
Chris@49 6862 For a vector argument, return a particular statistic calculated using all the elements of the vector
Chris@49 6863 </li>
Chris@49 6864 <br>
Chris@49 6865 <li>
Chris@49 6866 For the var() and stddev() functions, the default <i>norm_type=0</i> performs normalisation using <i>N-1</i> (where <i>N</i> is the number of samples),
Chris@49 6867 providing the best unbiased estimator.
Chris@49 6868 Using <i>norm_type=1</i> causes normalisation to be done using <i>N</i>, which provides the second moment around the mean
Chris@49 6869 </li>
Chris@49 6870 <br>
Chris@49 6871 <li>
Chris@49 6872 Examples:
Chris@49 6873 <ul>
Chris@49 6874 <pre>
Chris@49 6875 mat A = randu&lt;mat&gt;(5,5);
Chris@49 6876 mat B = mean(A);
Chris@49 6877 mat C = var(A);
Chris@49 6878 double m = mean(mean(A));
Chris@49 6879
Chris@49 6880 vec q = randu&lt;vec&gt;(5);
Chris@49 6881 double v = var(q);
Chris@49 6882 </pre>
Chris@49 6883 </ul>
Chris@49 6884 </li>
Chris@49 6885 <br>
Chris@49 6886 <li>
Chris@49 6887 See also:
Chris@49 6888 <ul>
Chris@49 6889 <li><a href="#cov">cov()</a></li>
Chris@49 6890 <li><a href="#cor">cor()</a></li>
Chris@49 6891 <li><a href="#running_stat">running_stat</a></li>
Chris@49 6892 <li><a href="#running_stat_vec">running_stat_vec</a></li>
Chris@49 6893 <li><a href="#hist">hist()</a></li>
Chris@49 6894 <li><a href="#histc">histc()</a></li>
Chris@49 6895 </ul>
Chris@49 6896 </li>
Chris@49 6897 </ul>
Chris@49 6898 <br>
Chris@49 6899 <hr class="greyline">
Chris@49 6900
Chris@49 6901 <hr class="greyline">
Chris@49 6902 <br>
Chris@49 6903 <br>
Chris@49 6904 <font size=+1><b>Vector/Matrix/Cube Valued Functions of Vectors/Matrices/Cubes</b></font>
Chris@49 6905 <br>
Chris@49 6906 <br>
Chris@49 6907 <hr class="greyline">
Chris@49 6908 <br>
Chris@49 6909
Chris@49 6910 <a name="conv"></a>
Chris@49 6911 <b>
Chris@49 6912 C = conv(A, B)
Chris@49 6913 </b>
Chris@49 6914 <ul>
Chris@49 6915 <li>
Chris@49 6916 Convolution of vectors <i>A</i> and <i>B</i>
Chris@49 6917 </li>
Chris@49 6918 <br>
Chris@49 6919 <li>
Chris@49 6920 If <i>A</i> and <i>B</i> are polynomial coefficient vectors, convolving them is equivalent to multiplying the two polynomials
Chris@49 6921 </li>
Chris@49 6922 <br>
Chris@49 6923 <li>
Chris@49 6924 The convolution operation is also equivalent to FIR filtering
Chris@49 6925 </li>
Chris@49 6926 <br>
Chris@49 6927 <li>
Chris@49 6928 The orientation of the result vector is the same as the orientation of <i>A</i> (ie. column or row vector)
Chris@49 6929 </li>
Chris@49 6930 <br>
Chris@49 6931 <li>
Chris@49 6932 Examples:
Chris@49 6933 <ul>
Chris@49 6934 <pre>
Chris@49 6935 vec A = randu&lt;vec&gt;(128) - 0.5;
Chris@49 6936 vec B = randu&lt;vec&gt;(128) - 0.5;
Chris@49 6937
Chris@49 6938 vec C = conv(A,B);
Chris@49 6939 </pre>
Chris@49 6940 </ul>
Chris@49 6941 </li>
Chris@49 6942 <br>
Chris@49 6943 <li>
Chris@49 6944 See also:
Chris@49 6945 <ul>
Chris@49 6946 <li><a href="#fft">fft()</a></li>
Chris@49 6947 <li><a href="#cor">cor()</a></li>
Chris@49 6948 <li><a href="http://mathworld.wolfram.com/Convolution.html">Convolution in MathWorld</a></li>
Chris@49 6949 <li><a href="http://en.wikipedia.org/wiki/Convolution">Convolution in Wikipedia</a></li>
Chris@49 6950 <li><a href="http://en.wikipedia.org/wiki/Finite_impulse_response">FIR filter in Wikipedia</a></li>
Chris@49 6951 </ul>
Chris@49 6952 </li>
Chris@49 6953 </ul>
Chris@49 6954 <br>
Chris@49 6955 <hr class="greyline"><br>
Chris@49 6956
Chris@49 6957 <a name="conv_to"></a>
Chris@49 6958 <b>
Chris@49 6959 conv_to&lt;<i>type</i>&gt;::from(X)
Chris@49 6960 </b>
Chris@49 6961 <ul>
Chris@49 6962 <li>
Chris@49 6963 A form of casting
Chris@49 6964 </li>
Chris@49 6965 <br>
Chris@49 6966 <li>
Chris@49 6967 Convert between matrix/vector types (eg. <i>mat</i> to <i>fmat</i>), as well as cube types (eg. <i>cube</i> to <i>fcube</i>)
Chris@49 6968 </li>
Chris@49 6969 <br>
Chris@49 6970 <li>
Chris@49 6971 Conversion between <i>std::vector</i> and Armadillo matrices/vectors is also possible
Chris@49 6972 </li>
Chris@49 6973 <br>
Chris@49 6974 <li>
Chris@49 6975 Conversion of a <i>mat</i> object into <i>colvec</i>, <i>rowvec</i> or <i>std::vector</i> is possible if the object can be interpreted as a vector
Chris@49 6976 </li>
Chris@49 6977 <br>
Chris@49 6978 <li>
Chris@49 6979 Examples:
Chris@49 6980 <ul>
Chris@49 6981 <pre>
Chris@49 6982 mat A = randu&lt;mat&gt;(5,5);
Chris@49 6983 fmat B = conv_to&lt;fmat&gt;::from(A);
Chris@49 6984
Chris@49 6985 typedef std::vector&lt;double&gt; stdvec;
Chris@49 6986
Chris@49 6987 stdvec x(3);
Chris@49 6988 x[0] = 0.0; x[1] = 1.0; x[2] = 2.0;
Chris@49 6989
Chris@49 6990 colvec y = conv_to&lt; colvec &gt;::from(x);
Chris@49 6991 stdvec z = conv_to&lt; stdvec &gt;::from(y);
Chris@49 6992 </pre>
Chris@49 6993 </ul>
Chris@49 6994 </li>
Chris@49 6995 <br>
Chris@49 6996 <li>
Chris@49 6997 See also:
Chris@49 6998 <ul>
Chris@49 6999 <li><a href="#as_scalar">as_scalar()</a></li>
Chris@49 7000 <li><a href="#reshape">reshape()</a></li>
Chris@49 7001 <li><a href="#resize">resize()</a></li>
Chris@49 7002 <li><a href="#adv_constructors_mat">advanced constructors (matrices)</a></li>
Chris@49 7003 <li><a href="#adv_constructors_cube">advanced constructors (cubes)</a></li>
Chris@49 7004 </ul>
Chris@49 7005 </li>
Chris@49 7006 <br>
Chris@49 7007 </ul>
Chris@49 7008 <hr class="greyline"><br>
Chris@49 7009
Chris@49 7010 <a name="conj"></a>
Chris@49 7011 <b>conj(cx_mat)</b>
Chris@49 7012 <br><b>conj(cx_cube)</b>
Chris@49 7013 <ul>
Chris@49 7014 <li>
Chris@49 7015 Obtain the complex conjugate of each element in a complex matrix/cube
Chris@49 7016 </li>
Chris@49 7017 <br>
Chris@49 7018 <li>
Chris@49 7019 Examples:
Chris@49 7020 <ul>
Chris@49 7021 <pre>
Chris@49 7022 cx_mat X = randu&lt;cx_mat&gt;(5,5);
Chris@49 7023 cx_mat Y = conj(X);
Chris@49 7024 </pre>
Chris@49 7025 </ul>
Chris@49 7026 </li>
Chris@49 7027 <br>
Chris@49 7028 <li>See also:
Chris@49 7029 <ul>
Chris@49 7030 <li><a href="#trans">trans()</a></li>
Chris@49 7031 </ul>
Chris@49 7032 </li>
Chris@49 7033 <br>
Chris@49 7034 </ul>
Chris@49 7035 <hr class="greyline"><br>
Chris@49 7036
Chris@49 7037 <a name="cor"></a>
Chris@49 7038 <b>cor(X, Y, norm_type=0)</b>
Chris@49 7039 <br><b>cor(X, norm_type=0)</b>
Chris@49 7040 <ul>
Chris@49 7041 <li>
Chris@49 7042 For two matrix arguments <i>X</i> and <i>Y</i>,
Chris@49 7043 if each row of <i>X</i> and <i>Y</i> is an observation and each column is a variable,
Chris@49 7044 the <i>(i,j)</i>-th entry of <i>cor(X,Y)</i> is the correlation coefficient between the <i>i</i>-th variable in <i>X</i> and the <i>j</i>-th variable in <i>Y</i>
Chris@49 7045 </li>
Chris@49 7046 <br>
Chris@49 7047 <li>
Chris@49 7048 For vector arguments, the type of vector is ignored and each element in the vector is treated as an observation
Chris@49 7049 </li>
Chris@49 7050 <br>
Chris@49 7051 <li>
Chris@49 7052 For matrices, <i>X</i> and <i>Y</i> must have the same dimensions
Chris@49 7053 </li>
Chris@49 7054 <br>
Chris@49 7055 <li>
Chris@49 7056 For vectors, <i>X</i> and <i>Y</i> must have the same number of elements
Chris@49 7057 </li>
Chris@49 7058 <br>
Chris@49 7059 <li>
Chris@49 7060 <i>cor(X)</i> is equivalent to <i>cor(X, X)</i>, also called autocorrelation
Chris@49 7061 </li>
Chris@49 7062 <br>
Chris@49 7063 <li>
Chris@49 7064 The default <i>norm_type=0</i> performs normalisation of the correlation matrix using <i>N-1</i> (where <i>N</i> is the number of observations).
Chris@49 7065 Using <i>norm_type=1</i> causes normalisation to be done using <i>N</i>
Chris@49 7066 </li>
Chris@49 7067 <br>
Chris@49 7068 <li>
Chris@49 7069 Examples:
Chris@49 7070 <ul>
Chris@49 7071 <pre>
Chris@49 7072 mat X = randu&lt;mat&gt;(4,5);
Chris@49 7073 mat Y = randu&lt;mat&gt;(4,5);
Chris@49 7074
Chris@49 7075 mat R = cor(X,Y);
Chris@49 7076 </pre>
Chris@49 7077 </ul>
Chris@49 7078 </li>
Chris@49 7079 <br>
Chris@49 7080 <li>
Chris@49 7081 See also:
Chris@49 7082 <ul>
Chris@49 7083 <li><a href="http://mathworld.wolfram.com/Correlation.html">Correlation in MathWorld</a></li>
Chris@49 7084 <li><a href="http://mathworld.wolfram.com/Autocorrelation.html">Autocorrelation in MathWorld</a></li>
Chris@49 7085 <li><a href="#cov">cov()</a></li>
Chris@49 7086 <li><a href="#conv">conv()</a></li>
Chris@49 7087 </ul>
Chris@49 7088 </li>
Chris@49 7089 </ul>
Chris@49 7090 <br>
Chris@49 7091 <hr class="greyline"><br>
Chris@49 7092
Chris@49 7093 <a name="cov"></a>
Chris@49 7094 <b>cov(X, Y, norm_type=0)</b>
Chris@49 7095 <br><b>cov(X, norm_type=0)</b>
Chris@49 7096 <ul>
Chris@49 7097 <li>
Chris@49 7098 For two matrix arguments <i>X</i> and <i>Y</i>,
Chris@49 7099 if each row of <i>X</i> and <i>Y</i> is an observation and each column is a variable,
Chris@49 7100 the <i>(i,j)</i>-th entry of <i>cov(X,Y)</i> is the covariance between the <i>i</i>-th variable in <i>X</i> and the <i>j</i>-th variable in <i>Y</i>
Chris@49 7101 </li>
Chris@49 7102 <br>
Chris@49 7103 <li>
Chris@49 7104 For vector arguments, the type of vector is ignored and each element in the vector is treated as an observation
Chris@49 7105 </li>
Chris@49 7106 <br>
Chris@49 7107 <li>
Chris@49 7108 For matrices, <i>X</i> and <i>Y</i> must have the same dimensions
Chris@49 7109 </li>
Chris@49 7110 <br>
Chris@49 7111 <li>
Chris@49 7112 For vectors, <i>X</i> and <i>Y</i> must have the same number of elements
Chris@49 7113 </li>
Chris@49 7114 <br>
Chris@49 7115 <li>
Chris@49 7116 <i>cov(X)</i> is equivalent to <i>cov(X, X)</i>
Chris@49 7117 </li>
Chris@49 7118 <br>
Chris@49 7119 <li>
Chris@49 7120 The default <i>norm_type=0</i> performs normalisation using <i>N-1</i> (where <i>N</i> is the number of observations),
Chris@49 7121 providing the best unbiased estimation of the covariance matrix (if the observations are from a normal distribution).
Chris@49 7122 Using <i>norm_type=1</i> causes normalisation to be done using <i>N</i>, which provides the second moment matrix of the observations about their mean
Chris@49 7123 </li>
Chris@49 7124 <br>
Chris@49 7125 <li>
Chris@49 7126 Examples:
Chris@49 7127 <ul>
Chris@49 7128 <pre>
Chris@49 7129 mat X = randu&lt;mat&gt;(4,5);
Chris@49 7130 mat Y = randu&lt;mat&gt;(4,5);
Chris@49 7131
Chris@49 7132 mat C = cov(X,Y);
Chris@49 7133 </pre>
Chris@49 7134 </ul>
Chris@49 7135 </li>
Chris@49 7136 <br>
Chris@49 7137 <li>
Chris@49 7138 See also:
Chris@49 7139 <ul>
Chris@49 7140 <li><a href="#running_stat_vec">running_stat_vec</a></li>
Chris@49 7141 <li><a href="#stats_fns">statistics functions</a></li>
Chris@49 7142 <li><a href="http://mathworld.wolfram.com/Covariance.html">Covariance in MathWorld</a></li>
Chris@49 7143 <li><a href="#cor">cor()</a></li>
Chris@49 7144 </ul>
Chris@49 7145 </li>
Chris@49 7146 </ul>
Chris@49 7147 <br>
Chris@49 7148 <hr class="greyline"><br>
Chris@49 7149
Chris@49 7150 <a name="cross"></a>
Chris@49 7151 <b>cross(A, B)</b>
Chris@49 7152 <ul>
Chris@49 7153 <li>
Chris@49 7154 Calculate the cross product between A and B, under the assumption that A and B are 3 dimensional vectors
Chris@49 7155 </li>
Chris@49 7156 <br>
Chris@49 7157 <li>
Chris@49 7158 Examples:
Chris@49 7159 <ul>
Chris@49 7160 <pre>
Chris@49 7161 vec a = randu&lt;vec&gt;(3);
Chris@49 7162 vec b = randu&lt;vec&gt;(3);
Chris@49 7163
Chris@49 7164 vec c = cross(a,b);
Chris@49 7165 </pre>
Chris@49 7166 </ul>
Chris@49 7167 </li>
Chris@49 7168 <br>
Chris@49 7169 <li>
Chris@49 7170 See also:
Chris@49 7171 <ul>
Chris@49 7172 <li><a href="#dot">dot()</a></li>
Chris@49 7173 <li><a href="http://en.wikipedia.org/wiki/Cross_product">Cross product in Wikipedia</a></li>
Chris@49 7174 <li><a href="http://mathworld.wolfram.com/CrossProduct.html">Cross product in MathWorld</a></li>
Chris@49 7175 </ul>
Chris@49 7176 </li>
Chris@49 7177 </ul>
Chris@49 7178 <br>
Chris@49 7179 <hr class="greyline"><br>
Chris@49 7180
Chris@49 7181 <a name="cumsum"></a>
Chris@49 7182 <b>cumsum(mat, dim=0)</b>
Chris@49 7183 <br><b>cumsum(rowvec)</b>
Chris@49 7184 <br><b>cumsum(colvec)</b>
Chris@49 7185 <ul>
Chris@49 7186 <li>
Chris@49 7187 For a matrix argument, return a matrix containing the cumulative sum of elements in each column (dim=0, the default), or each row (dim=1)
Chris@49 7188 </li>
Chris@49 7189 <br>
Chris@49 7190 <li>
Chris@49 7191 For a vector argument, return a vector of the same orientation, containing the cumulative sum of elements
Chris@49 7192 </li>
Chris@49 7193 <br>
Chris@49 7194 <li>
Chris@49 7195 Examples:
Chris@49 7196 <ul>
Chris@49 7197 <pre>
Chris@49 7198 mat A = randu&lt;mat&gt;(5,5);
Chris@49 7199 mat B = cumsum(A);
Chris@49 7200
Chris@49 7201 vec x = randu&lt;vec&gt;(10);
Chris@49 7202 vec y = cumsum(x);
Chris@49 7203 </pre>
Chris@49 7204 </ul>
Chris@49 7205 </li>
Chris@49 7206 <br>
Chris@49 7207 <li>
Chris@49 7208 See also:
Chris@49 7209 <ul>
Chris@49 7210 <li><a href="#accu">accu()</a></li>
Chris@49 7211 <li><a href="#sum">sum()</a></li>
Chris@49 7212 </ul>
Chris@49 7213 </li>
Chris@49 7214 <br>
Chris@49 7215 </ul>
Chris@49 7216 <hr class="greyline"><br>
Chris@49 7217
Chris@49 7218 <a name="diagmat"></a>
Chris@49 7219 <b>diagmat(X)</b>
Chris@49 7220 <ul>
Chris@49 7221 <li>
Chris@49 7222 Interpret a matrix or vector <i>X</i> as a diagonal matrix
Chris@49 7223 </li>
Chris@49 7224 <br>
Chris@49 7225 <li>
Chris@49 7226 If <i>X</i> is a matrix, the matrix must be square; the main diagonal is copied and all other elements in the generated matrix are set to zero
Chris@49 7227 </li>
Chris@49 7228 <br>
Chris@49 7229 <li>
Chris@49 7230 If <i>X</i> is a vector, elements of the vector are placed on the main diagonal in the generated matrix and all other elements are set to zero
Chris@49 7231 </li>
Chris@49 7232 <br>
Chris@49 7233 <li>
Chris@49 7234 Examples:
Chris@49 7235 <ul>
Chris@49 7236 <pre>
Chris@49 7237 mat A = randu&lt;mat&gt;(5,5);
Chris@49 7238 mat B = diagmat(A);
Chris@49 7239 mat C = A*diagmat(A);
Chris@49 7240
Chris@49 7241 rowvec q = randu&lt;rowvec&gt;(5);
Chris@49 7242 colvec r = randu&lt;colvec&gt;(5);
Chris@49 7243 mat X = diagmat(q)*diagmat(r);
Chris@49 7244 </pre>
Chris@49 7245 </ul>
Chris@49 7246 </li>
Chris@49 7247 <br>
Chris@49 7248 <li>
Chris@49 7249 See also:
Chris@49 7250 <ul>
Chris@49 7251 <li><a href="#diagvec">diagvec()</a></li>
Chris@49 7252 <li><a href="#diag">.diag()</a></li>
Chris@49 7253 <li><a href="#trimat">trimatu() / trimatl()</a></li>
Chris@49 7254 <li><a href="#symmat">symmatu() / symmatl()</a></li>
Chris@49 7255 <li><a href="#reshape">reshape()</a></li>
Chris@49 7256 </ul>
Chris@49 7257 </li>
Chris@49 7258 <br>
Chris@49 7259 </ul>
Chris@49 7260 <hr class="greyline">
Chris@49 7261 <br>
Chris@49 7262
Chris@49 7263 <a name="find"></a>
Chris@49 7264 <b>find(X, k=0, s="first")</b>
Chris@49 7265 <ul>
Chris@49 7266 <li>Return a column vector of the indices of non-zero elements of <i>X</i></li>
Chris@49 7267 <br>
Chris@49 7268 <li>The output vector must have the type <a href="#Col">uvec</a> or <a href="#Mat">umat</a>
Chris@49 7269 (ie. the indices are stored as unsigned integers of type <a href="#uword">uword</a>)
Chris@49 7270 </li>
Chris@49 7271 <br>
Chris@49 7272 <li>
Chris@49 7273 The input matrix <i>X</i> is interpreted as a vector, with column-by-column ordering of the elements of <i>X</i>
Chris@49 7274 </li>
Chris@49 7275 <br>
Chris@49 7276 <li>Relational operators can be used instead of <i>X</i>, eg.&nbsp;<i>A&nbsp;&gt;&nbsp;0.5</i>
Chris@49 7277 </li>
Chris@49 7278 <br>
Chris@49 7279 <li>If <i>k=0</i> (default), return the indices of all non-zero elements, otherwise return at most <i>k</i> of their indices</li>
Chris@49 7280 <br>
Chris@49 7281 <li>If <i>s="first"</i> (default), return at most the first <i>k</i> indices of the non-zero elements
Chris@49 7282 </li>
Chris@49 7283 <br>
Chris@49 7284 <li>If <i>s="last"</i>, return at most the last <i>k</i> indices of the non-zero elements
Chris@49 7285 </li>
Chris@49 7286 <br>
Chris@49 7287 <li>
Chris@49 7288 Examples:
Chris@49 7289 <ul>
Chris@49 7290 <pre>
Chris@49 7291 mat A = randu&lt;mat&gt;(5,5);
Chris@49 7292 mat B = randu&lt;mat&gt;(5,5);
Chris@49 7293
Chris@49 7294 uvec q1 = find(A &gt; B);
Chris@49 7295 uvec q2 = find(A &gt; 0.5);
Chris@49 7296 uvec q3 = find(A &gt; 0.5, 3, "last");
Chris@49 7297 </pre>
Chris@49 7298 </ul>
Chris@49 7299 </li>
Chris@49 7300 <br>
Chris@49 7301 <li>
Chris@49 7302 See also:
Chris@49 7303 <ul>
Chris@49 7304 <li><a href="#unique">unique()</a></li>
Chris@49 7305 <li><a href="#conv_to">conv_to()</a> (convert between matrix/vector types)</li>
Chris@49 7306 <li><a href="#submat">submatrix views</a></li>
Chris@49 7307 <li><a href="#sort_index">sort_index()</a></li>
Chris@49 7308 </ul>
Chris@49 7309 </li>
Chris@49 7310 <br>
Chris@49 7311 </ul>
Chris@49 7312 <hr class="greyline">
Chris@49 7313 <br>
Chris@49 7314
Chris@49 7315 <a name="flip"></a>
Chris@49 7316 <b>fliplr(mat)</b>
Chris@49 7317 <br><b>flipud(mat)</b>
Chris@49 7318 <ul>
Chris@49 7319 <li>
Chris@49 7320 fliplr(): generate a copy of the input matrix, with the order of the columns reversed
Chris@49 7321 </li>
Chris@49 7322 <br>
Chris@49 7323 <li>
Chris@49 7324 flipud(): generate a copy of the input matrix, with the order of the rows reversed
Chris@49 7325 </li>
Chris@49 7326 <br>
Chris@49 7327 <li>
Chris@49 7328 Examples:
Chris@49 7329 <ul>
Chris@49 7330 <pre>
Chris@49 7331 mat A = randu&lt;mat&gt;(5,5);
Chris@49 7332
Chris@49 7333 mat B = fliplr(A);
Chris@49 7334 mat C = flipud(A);
Chris@49 7335 </pre>
Chris@49 7336 </ul>
Chris@49 7337 </li>
Chris@49 7338 <br>
Chris@49 7339 <li>
Chris@49 7340 See also:
Chris@49 7341 <ul>
Chris@49 7342 <li><a href="#swap_rows">.swap_rows() &amp; .swap_cols()</a> (member functions of <i>Mat</i>, <i>Col</i> and <i>Row</i> classes)</li>
Chris@49 7343 </ul>
Chris@49 7344 </li>
Chris@49 7345 <br>
Chris@49 7346 </ul>
Chris@49 7347 <hr class="greyline"><br>
Chris@49 7348
Chris@49 7349 <a name="hist"></a>
Chris@49 7350 <b>hist(V, n_bins=10)</b>
Chris@49 7351 <br><b>hist(X, n_bins=10, dim=0)</b>
Chris@49 7352 <br>
Chris@49 7353 <br><b>hist(V, centers)</b>
Chris@49 7354 <br><b>hist(X, centers, dim=0)</b>
Chris@49 7355 <ul>
Chris@49 7356 <li>
Chris@49 7357 For vector <i>V</i>,
Chris@49 7358 produce an unsigned vector of the same orientation as <i>V</i> (ie. either <a href="#Col">uvec</a> or <a href="#Row">urowvec</a>)
Chris@49 7359 that represents a histogram of counts
Chris@49 7360 </li>
Chris@49 7361 <br>
Chris@49 7362 <li>
Chris@49 7363 For matrix <i>X</i>,
Chris@49 7364 produce a <a href="#Mat">umat</a> matrix containing either
Chris@49 7365 column histogram counts (for <i>dim=0</i>, default),
Chris@49 7366 or
Chris@49 7367 row histogram counts (for <i>dim=1</i>)
Chris@49 7368 </li>
Chris@49 7369 <br>
Chris@49 7370 <li>
Chris@49 7371 The bin centers can be automatically determined from the data, with the number of bins specified via <i>n_bins</i> (default is 10);
Chris@49 7372 the range of the bins is determined by the range of the data
Chris@49 7373 </li>
Chris@49 7374 <br>
Chris@49 7375 <li>
Chris@49 7376 The bin centers can also be explicitly specified via the <i>centers</i> vector;
Chris@49 7377 the vector must contain monotonically increasing values (eg. 0.1, 0.2, 0.3, ...)
Chris@49 7378 </li>
Chris@49 7379 <br>
Chris@49 7380 <li>
Chris@49 7381 This function was added in version 3.0
Chris@49 7382 </li>
Chris@49 7383 <br>
Chris@49 7384 <li>
Chris@49 7385 Examples:
Chris@49 7386 <ul>
Chris@49 7387 <pre>
Chris@49 7388 vec v = randn&lt;vec&gt;(1000); // Gaussian distribution
Chris@49 7389
Chris@49 7390 uvec h1 = hist(v, 11);
Chris@49 7391 uvec h2 = hist(v, linspace&lt;vec&gt;(-2,2,11));
Chris@49 7392 </pre>
Chris@49 7393 </ul>
Chris@49 7394 </li>
Chris@49 7395 <br>
Chris@49 7396 <li>See also:
Chris@49 7397 <ul>
Chris@49 7398 <li><a href="#histc">histc()</a></li>
Chris@49 7399 <li><a href="#stats_fns">statistics functions</a></li>
Chris@49 7400 <li><a href="#conv_to">conv_to()</a></li>
Chris@49 7401 </ul>
Chris@49 7402 </li>
Chris@49 7403 <br>
Chris@49 7404 </ul>
Chris@49 7405 <hr class="greyline"><br>
Chris@49 7406
Chris@49 7407 <a name="histc"></a>
Chris@49 7408 <b>histc(V, edges)</b>
Chris@49 7409 <br><b>histc(X, edges, dim=0)</b>
Chris@49 7410 <ul>
Chris@49 7411 <li>
Chris@49 7412 For vector <i>V</i>,
Chris@49 7413 produce an unsigned vector of the same orientation as <i>V</i> (ie. either <a href="#Col">uvec</a> or <a href="#Row">urowvec</a>)
Chris@49 7414 that contains the counts of the number of values that fall between the elements in the <i>edges</i> vector
Chris@49 7415 </li>
Chris@49 7416 <br>
Chris@49 7417 <li>
Chris@49 7418 For matrix <i>X</i>,
Chris@49 7419 produce a <i>umat</i> matrix containing either
Chris@49 7420 column histogram counts (for <i>dim=0</i>, default),
Chris@49 7421 or
Chris@49 7422 row histogram counts (for <i>dim=1</i>)
Chris@49 7423 </li>
Chris@49 7424 <br>
Chris@49 7425 <li>
Chris@49 7426 The <i>edges</i> vector must contain monotonically increasing values (eg. 0.1, 0.2, 0.3, ...)
Chris@49 7427 </li>
Chris@49 7428 <br>
Chris@49 7429 <li>
Chris@49 7430 This function was added in version 3.0
Chris@49 7431 </li>
Chris@49 7432 <br>
Chris@49 7433 <li>
Chris@49 7434 Examples:
Chris@49 7435 <ul>
Chris@49 7436 <pre>
Chris@49 7437 vec v = randn&lt;vec&gt;(1000); // Gaussian distribution
Chris@49 7438
Chris@49 7439 uvec h = histc(v, linspace&lt;vec&gt;(-2,2,11));
Chris@49 7440 </pre>
Chris@49 7441 </ul>
Chris@49 7442 </li>
Chris@49 7443 <br>
Chris@49 7444 <li>See also:
Chris@49 7445 <ul>
Chris@49 7446 <li><a href="#hist">hist()</a></li>
Chris@49 7447 <li><a href="#stats_fns">statistics functions</a></li>
Chris@49 7448 <li><a href="#conv_to">conv_to()</a></li>
Chris@49 7449 </ul>
Chris@49 7450 </li>
Chris@49 7451 <br>
Chris@49 7452 </ul>
Chris@49 7453 <hr class="greyline"><br>
Chris@49 7454
Chris@49 7455 <a name="imag_real"></a>
Chris@49 7456 <b>imag(cx_mat)</b>
Chris@49 7457 <br><b>imag(cx_cube)</b>
Chris@49 7458 <br>
Chris@49 7459 <br><b>real(cx_mat)</b>
Chris@49 7460 <br><b>real(cx_cube)</b>
Chris@49 7461 <ul>
Chris@49 7462 <li>
Chris@49 7463 Extract the imaginary/real part of a complex matrix/cube
Chris@49 7464 </li>
Chris@49 7465 <br>
Chris@49 7466 <li>
Chris@49 7467 Examples:
Chris@49 7468 <ul>
Chris@49 7469 <pre>
Chris@49 7470 cx_mat C = randu&lt;cx_mat&gt;(5,5);
Chris@49 7471
Chris@49 7472 mat A = imag(C);
Chris@49 7473 mat B = real(C);
Chris@49 7474 </pre>
Chris@49 7475 </ul>
Chris@49 7476 </li>
Chris@49 7477 <br>
Chris@49 7478 <li><b>Caveat:</b> versions 4.4, 4.5 and 4.6 of the GCC C++ compiler have a bug when using the <i>-std=c++0x</i> compiler option (ie. experimental support for C++11);
Chris@49 7479 to work around this bug, preface Armadillo's imag() and real() with the <i>arma</i> namespace qualification, eg. arma::imag(C)
Chris@49 7480 </li>
Chris@49 7481 <br>
Chris@49 7482 <li>See also:
Chris@49 7483 <ul>
Chris@49 7484 <li><a href="#set_imag">set_imag()&nbsp;/&nbsp;set_real()</a></li>
Chris@49 7485 </ul>
Chris@49 7486 </li>
Chris@49 7487 <br>
Chris@49 7488 </ul>
Chris@49 7489 <hr class="greyline"><br>
Chris@49 7490
Chris@49 7491 <a name="join"></a>
Chris@49 7492 <b>join_rows(mat A, mat B)</b>
Chris@49 7493 <br><b>join_cols(mat A, mat B)</b>
Chris@49 7494 <br><b>join_slices(cube A, cube B)</b>
Chris@49 7495 <ul>
Chris@49 7496 <li>
Chris@49 7497 join_rows():
Chris@49 7498 for two matrices A and B, append each row of B to its respective row of A;
Chris@49 7499 matrices A and B must have the same number of rows
Chris@49 7500 </li>
Chris@49 7501 <br>
Chris@49 7502 <li>
Chris@49 7503 join_cols():
Chris@49 7504 for two matrices A and B, append each column of B to its respective column of A;
Chris@49 7505 matrices A and B must have the same number of columns
Chris@49 7506 </li>
Chris@49 7507 <br>
Chris@49 7508 <li>
Chris@49 7509 join_slices():
Chris@49 7510 for two cubes A and B, append the slices of B to the slices of A;
Chris@49 7511 cubes A and B have the same number of rows and columns (ie. all slices must have the same size)
Chris@49 7512 </li>
Chris@49 7513 <br>
Chris@49 7514 <li>
Chris@49 7515 Examples:
Chris@49 7516 <ul>
Chris@49 7517 <pre>
Chris@49 7518 mat A = randu&lt;mat&gt;(4,5);
Chris@49 7519 mat B = randu&lt;mat&gt;(4,6);
Chris@49 7520 mat C = randu&lt;mat&gt;(6,5);
Chris@49 7521
Chris@49 7522 mat X = join_rows(A,B);
Chris@49 7523 mat Y = join_cols(A,C);
Chris@49 7524 </pre>
Chris@49 7525 </ul>
Chris@49 7526 </li>
Chris@49 7527 <br>
Chris@49 7528 <li>
Chris@49 7529 See also:
Chris@49 7530 <ul>
Chris@49 7531 <li><a href="#shed">shed rows/columns/slices</a></li>
Chris@49 7532 <li><a href="#insert">insert rows/columns/slices</a></li>
Chris@49 7533 <li><a href="#submat">submatrix views</a></li>
Chris@49 7534 <li><a href="#subcube">subcube views</a></li>
Chris@49 7535 </ul>
Chris@49 7536 </li>
Chris@49 7537 <br>
Chris@49 7538 </ul>
Chris@49 7539 <hr class="greyline"><br>
Chris@49 7540
Chris@49 7541 <a name="kron"></a>
Chris@49 7542 <b>kron(A,B)</b>
Chris@49 7543
Chris@49 7544 <ul>
Chris@49 7545 <li>Kronecker tensor product.</li>
Chris@49 7546 <br>
Chris@49 7547 <li>Using matrix <i>A</i> (with <i>n</i> rows and <i>p</i> columns) and matrix <i>B</i> (with <i>m</i> rows and <i>q</i> columns),
Chris@49 7548 <i>kron(A,B)</i> returns a matrix (with <i>nm</i> rows and <i>pq</i> columns) which denotes the tensor product of <i>A</i> and <i>B</i>
Chris@49 7549 </li>
Chris@49 7550 <br>
Chris@49 7551 <li>
Chris@49 7552 Examples:
Chris@49 7553 <ul>
Chris@49 7554 <pre>
Chris@49 7555 mat A = randu&lt;mat&gt;(4,5);
Chris@49 7556 mat B = randu&lt;mat&gt;(5,4);
Chris@49 7557
Chris@49 7558 mat K = kron(A,B);
Chris@49 7559 </pre>
Chris@49 7560 </ul>
Chris@49 7561 </li>
Chris@49 7562 <br>
Chris@49 7563 <li>
Chris@49 7564 See also:
Chris@49 7565 <ul>
Chris@49 7566 <li><a href="http://mathworld.wolfram.com/KroneckerProduct.html">Kronecker Product in MathWorld</a></li>
Chris@49 7567 </ul>
Chris@49 7568 </li>
Chris@49 7569 </ul>
Chris@49 7570 <br>
Chris@49 7571 <hr class="greyline"><br>
Chris@49 7572
Chris@49 7573 <a name="reshape"></a>
Chris@49 7574 <b>reshape(mat, n_rows, n_cols, dim=0)</b>
Chris@49 7575 <br><b>reshape(cube, n_rows, n_cols, n_slices, dim=0)</b>
Chris@49 7576 <ul>
Chris@49 7577 <li>
Chris@49 7578 Generate a matrix/cube sized according to given size specifications,
Chris@49 7579 whose elements are taken from the given matrix/cube, either column-wise (dim=0) or row-wise (dim=1);
Chris@49 7580 the elements in the generated object are placed column-wise (ie. the first column is filled up before filling the second column)
Chris@49 7581 </li>
Chris@49 7582 <br>
Chris@49 7583 <li>
Chris@49 7584 The layout of the elements in the generated object will be different to the layout in the given object
Chris@49 7585 </li>
Chris@49 7586 <br>
Chris@49 7587 <li>
Chris@49 7588 This function can be used to create a vector representation of a matrix (ie. concatenate all the columns or rows)
Chris@49 7589 </li>
Chris@49 7590 <br>
Chris@49 7591 <li>
Chris@49 7592 The total number of elements in the generated matrix/cube doesn't have to be the same as the total number of elements in the given matrix/cube
Chris@49 7593 </li>
Chris@49 7594 <br>
Chris@49 7595 <li>
Chris@49 7596 If the total number of elements in the given matrix/cube is less than the specified size,
Chris@49 7597 the remaining elements in the generated matrix/cube are set to zero
Chris@49 7598 </li>
Chris@49 7599 <br>
Chris@49 7600 <li>
Chris@49 7601 If the total number of elements in the given matrix/cube is greater than the specified size,
Chris@49 7602 only a subset of elements is taken from the given matrix/cube
Chris@49 7603 </li>
Chris@49 7604 <br>
Chris@49 7605 <li>
Chris@49 7606 <b>Caveat:</b>
Chris@49 7607 reshape() is slower than <a href="#set_size">.set_size()</a>, which doesn't preserve data
Chris@49 7608 </li>
Chris@49 7609 <br>
Chris@49 7610 <li>
Chris@49 7611 <b>Caveat:</b>
Chris@49 7612 if you wish to grow/shrink a matrix while preserving the elements <b>as well as</b> the layout of the elements,
Chris@49 7613 use <a href="#resize">resize()</a> instead
Chris@49 7614 </li>
Chris@49 7615 <br>
Chris@49 7616 <li>
Chris@49 7617 Examples:
Chris@49 7618 <ul>
Chris@49 7619 <pre>
Chris@49 7620 mat A = randu&lt;mat&gt;(10, 5);
Chris@49 7621 mat B = reshape(A, 5, 10);
Chris@49 7622 </pre>
Chris@49 7623 </ul>
Chris@49 7624 </li>
Chris@49 7625 <br>
Chris@49 7626 <li>
Chris@49 7627 See also:
Chris@49 7628 <ul>
Chris@49 7629 <li><a href="#reshape_member">.reshape()</a> (member function of Mat and Cube)</li>
Chris@49 7630 <li><a href="#set_size">.set_size()</a> (member function of Mat and Cube)</li>
Chris@49 7631 <li><a href="#resize">resize()</a></li>
Chris@49 7632 <li><a href="#as_scalar">as_scalar()</a></li>
Chris@49 7633 <li><a href="#conv_to">conv_to()</a></li>
Chris@49 7634 <li><a href="#diagmat">diagmat()</a></li>
Chris@49 7635 </ul>
Chris@49 7636 </li>
Chris@49 7637 <br>
Chris@49 7638 </ul>
Chris@49 7639 <hr class="greyline"><br>
Chris@49 7640
Chris@49 7641 <a name="resize"></a>
Chris@49 7642 <b>resize(mat, n_rows, n_cols)</b>
Chris@49 7643 <br><b>resize(cube, n_rows, n_cols, n_slices)</b>
Chris@49 7644 <ul>
Chris@49 7645 <li>
Chris@49 7646 Generate a matrix/cube sized according to given size specifications,
Chris@49 7647 whose elements as well as the layout of the elements are taken from the given matrix/cube
Chris@49 7648 </li>
Chris@49 7649 <br>
Chris@49 7650 <li>
Chris@49 7651 <b>Caveat:</b>
Chris@49 7652 resize() is slower than <a href="#set_size">.set_size()</a>, which doesn't preserve data
Chris@49 7653 </li>
Chris@49 7654 <br>
Chris@49 7655 <li>
Chris@49 7656 Examples:
Chris@49 7657 <ul>
Chris@49 7658 <pre>
Chris@49 7659 mat A = randu&lt;mat&gt;(4, 5);
Chris@49 7660 mat B = resize(A, 7, 6);
Chris@49 7661 </pre>
Chris@49 7662 </ul>
Chris@49 7663 </li>
Chris@49 7664 <br>
Chris@49 7665 <li>
Chris@49 7666 This function was added in version 2.4
Chris@49 7667 </li>
Chris@49 7668 <br>
Chris@49 7669 <li>
Chris@49 7670 See also:
Chris@49 7671 <ul>
Chris@49 7672 <li><a href="#resize_member">.resize()</a> (member function of Mat and Cube)</li>
Chris@49 7673 <li><a href="#set_size">.set_size()</a> (member function of Mat and Cube)</li>
Chris@49 7674 <li><a href="#reshape">reshape()</a></li>
Chris@49 7675 <li><a href="#as_scalar">as_scalar()</a></li>
Chris@49 7676 <li><a href="#conv_to">conv_to()</a></li>
Chris@49 7677 </ul>
Chris@49 7678 </li>
Chris@49 7679 <br>
Chris@49 7680 </ul>
Chris@49 7681 <hr class="greyline"><br>
Chris@49 7682
Chris@49 7683 <a name="shuffle"></a>
Chris@49 7684 <b>shuffle(mat, dim=0)</b>
Chris@49 7685 <br><b>shuffle(rowvec, dim=0)</b>
Chris@49 7686 <br><b>shuffle(colvec, dim=0)</b>
Chris@49 7687 <ul>
Chris@49 7688 <li>
Chris@49 7689 Shuffle the rows (dim=0) or columns (dim=1) of a matrix or vector
Chris@49 7690 </li>
Chris@49 7691 <br>
Chris@49 7692 <li>
Chris@49 7693 Examples:
Chris@49 7694 <ul>
Chris@49 7695 <pre>
Chris@49 7696 mat A = randu&lt;mat&gt;(4,5);
Chris@49 7697 mat B = shuffle(A);
Chris@49 7698 </pre>
Chris@49 7699 </ul>
Chris@49 7700 </li>
Chris@49 7701 <br>
Chris@49 7702 <li>
Chris@49 7703 See also:
Chris@49 7704 <ul>
Chris@49 7705 <li><a href="#randu_randn_standalone">randu() / randn()</a></li>
Chris@49 7706 <li><a href="#sort">sort()</a></li>
Chris@49 7707 </ul>
Chris@49 7708 </li>
Chris@49 7709 <br>
Chris@49 7710 </ul>
Chris@49 7711 <hr class="greyline"><br>
Chris@49 7712
Chris@49 7713 <a name="sort"></a>
Chris@49 7714 <b>sort(mat, sort_type=0, dim=0)</b>
Chris@49 7715 <br><b>sort(rowvec, sort_type=0)</b>
Chris@49 7716 <br><b>sort(colvec, sort_type=0)</b>
Chris@49 7717 <ul>
Chris@49 7718 <li>For a matrix argument, return a matrix with the elements of the input matrix sorted in each column (<i>dim=0</i>), or each row (<i>dim=1</i>)</li>
Chris@49 7719 <br>
Chris@49 7720 <li><i>sort_type=0</i> (default) indicates an ascending sort</li>
Chris@49 7721 <br>
Chris@49 7722 <li><i>sort_type=1</i> indicates a descending sort</li>
Chris@49 7723 <br>
Chris@49 7724 <li>For a vector argument, return a vector which is a sorted version of the input vector</li>
Chris@49 7725 <br>
Chris@49 7726 <li>For matrices and vectors with complex numbers, sorting is via absolute values</li>
Chris@49 7727 <br>
Chris@49 7728 <li>
Chris@49 7729 Examples:
Chris@49 7730 <ul>
Chris@49 7731 <pre>
Chris@49 7732 mat A = randu&lt;mat&gt;(10,10);
Chris@49 7733 mat B = sort(A);
Chris@49 7734 </pre>
Chris@49 7735 </ul>
Chris@49 7736 </li>
Chris@49 7737 <li>
Chris@49 7738 See also:
Chris@49 7739 <ul>
Chris@49 7740 <li><a href="#sort_index">sort_index()</a></li>
Chris@49 7741 <li><a href="#shuffle">shuffle()</a></li>
Chris@49 7742 <li><a href="#randu_randn_standalone">randu() / randn()</a></li>
Chris@49 7743 </ul>
Chris@49 7744 </li>
Chris@49 7745 <br>
Chris@49 7746 </ul>
Chris@49 7747 <hr class="greyline"><br>
Chris@49 7748
Chris@49 7749 <a name="sort_index"></a>
Chris@49 7750 <b>sort_index(colvec, sort_type=0)</b>
Chris@49 7751 <br><b>sort_index(rowvec, sort_type=0)</b>
Chris@49 7752 <br>
Chris@49 7753 <br><b>stable_sort_index(colvec, sort_type=0)</b>
Chris@49 7754 <br><b>stable_sort_index(rowvec, sort_type=0)</b>
Chris@49 7755 <ul>
Chris@49 7756 <li>Return a vector which describes the sorted order of the given vector's elements
Chris@49 7757 (ie. it contains the indices of the given vector's elements)
Chris@49 7758 </li>
Chris@49 7759 <br>
Chris@49 7760 <li>The output vector must have the type <a href="#Col">uvec</a> or <a href="#Mat">umat</a>
Chris@49 7761 (ie. the indices are stored as unsigned integers of type <a href="#uword">uword</a>)
Chris@49 7762 </li>
Chris@49 7763 <br>
Chris@49 7764 <li><i>sort_type=0</i> (default) indicates an ascending sort</li>
Chris@49 7765 <br>
Chris@49 7766 <li><i>sort_type=1</i> indicates a descending sort</li>
Chris@49 7767 <br>
Chris@49 7768 <li>The <i>stable_sort_index()</i> variant preserves the relative order of elements with equivalent values; the variant was added in version 3.6</li>
Chris@49 7769 <br>
Chris@49 7770 <li>
Chris@49 7771 Examples:
Chris@49 7772 <ul>
Chris@49 7773 <pre>
Chris@49 7774 vec q = randu&lt;vec&gt;(10);
Chris@49 7775 uvec indices = sort_index(q);
Chris@49 7776 </pre>
Chris@49 7777 </ul>
Chris@49 7778 </li>
Chris@49 7779 <br>
Chris@49 7780 <li>
Chris@49 7781 See also:
Chris@49 7782 <ul>
Chris@49 7783 <li><a href="#find">find()</a></li>
Chris@49 7784 <li><a href="#sort">sort()</a></li>
Chris@49 7785 </ul>
Chris@49 7786 </li>
Chris@49 7787 <br>
Chris@49 7788 </ul>
Chris@49 7789 <hr class="greyline"><br>
Chris@49 7790
Chris@49 7791 <a name="symmat"></a>
Chris@49 7792 <b>symmatu(A)</b>
Chris@49 7793 <br><b>symmatl(A)</b>
Chris@49 7794 <ul>
Chris@49 7795 <li>
Chris@49 7796 <i>symmatu(A)</i>: interpret square matrix <i>A</i> as symmetric, reflecting the upper triangle to the lower triangle
Chris@49 7797 </li>
Chris@49 7798 <br>
Chris@49 7799 <li>
Chris@49 7800 <i>symmatl(A)</i>: interpret square matrix <i>A</i> as symmetric, reflecting the lower triangle to the upper triangle
Chris@49 7801 </li>
Chris@49 7802 <br>
Chris@49 7803 <li>
Chris@49 7804 If <i>A</i> is non-square, a <i>std::logic_error</i> exception is thrown
Chris@49 7805 </li>
Chris@49 7806 <br>
Chris@49 7807 <li>
Chris@49 7808 Examples:
Chris@49 7809 <ul>
Chris@49 7810 <pre>
Chris@49 7811 mat A = randu&lt;mat&gt;(5,5);
Chris@49 7812
Chris@49 7813 mat B = symmatu(A);
Chris@49 7814 mat C = symmatl(A);
Chris@49 7815 </pre>
Chris@49 7816 </ul>
Chris@49 7817 </li>
Chris@49 7818 <br>
Chris@49 7819 <li>See also:
Chris@49 7820 <ul>
Chris@49 7821 <li><a href="#diagmat">diagmat()</a></li>
Chris@49 7822 <li><a href="#trimat">trimatu() / trimatl()</a></li>
Chris@49 7823 <li><a href="http://en.wikipedia.org/wiki/Symmetric_matrix">Symmetric matrix in Wikipedia</a></li>
Chris@49 7824 </ul>
Chris@49 7825 </li>
Chris@49 7826 </ul>
Chris@49 7827 <br>
Chris@49 7828 <hr class="greyline"><br>
Chris@49 7829
Chris@49 7830 <a name="strans"></a>
Chris@49 7831 <b>strans(mat)</b>
Chris@49 7832 <br><b>strans(colvec)</b>
Chris@49 7833 <br><b>strans(rowvec)</b>
Chris@49 7834 <ul>
Chris@49 7835 <li>
Chris@49 7836 Simple matrix transpose, without taking the conjugate of the elements (complex matrices)
Chris@49 7837 </li>
Chris@49 7838 <br>
Chris@49 7839 <li>
Chris@49 7840 Use <a href="#trans">trans()</a> instead, unless you explicitly need to take the transpose of a complex matrix without taking the conjugate of the elements
Chris@49 7841 </li>
Chris@49 7842 <br>
Chris@49 7843 <li>See also:
Chris@49 7844 <ul>
Chris@49 7845 <li><a href="#t_st_members">.st()</a></li>
Chris@49 7846 <li><a href="#trans">trans()</a></li>
Chris@49 7847 </ul>
Chris@49 7848 </li>
Chris@49 7849 </ul>
Chris@49 7850 <br>
Chris@49 7851 <hr class="greyline"><br>
Chris@49 7852
Chris@49 7853
Chris@49 7854 <a name="trans"></a>
Chris@49 7855 <b>trans(mat)</b>
Chris@49 7856 <br><b>trans(colvec)</b>
Chris@49 7857 <br><b>trans(rowvec)</b>
Chris@49 7858 <ul>
Chris@49 7859 <li>
Chris@49 7860 Matrix transpose / Hermitian transpose
Chris@49 7861 </li>
Chris@49 7862 <br>
Chris@49 7863 <li>
Chris@49 7864 If a given object has real elements, a normal transpose is done
Chris@49 7865 </li>
Chris@49 7866 <br>
Chris@49 7867 <li>
Chris@49 7868 If a given object has complex elements, a Hermitian transpose is done (ie. the conjugate of the elements is taken during the transpose operation)
Chris@49 7869 </li>
Chris@49 7870 <br>
Chris@49 7871 <li>
Chris@49 7872 <b>Caveat:</b> for complex matrices, the functionality of trans() has changed in version 2.0:
Chris@49 7873 <ul>
Chris@49 7874 <li>in version 1.x, <i>trans()</i> does not take the conjugate of complex elements</li>
Chris@49 7875 <li>in version 1.x, the <i>htrans()</i> function is used for the Hermitian transpose</li>
Chris@49 7876 </ul>
Chris@49 7877 </li>
Chris@49 7878 <br>
Chris@49 7879 <li>
Chris@49 7880 Examples:
Chris@49 7881 <ul>
Chris@49 7882 <pre>mat A = randu&lt;mat&gt;(5,10);
Chris@49 7883 mat B = trans(A);
Chris@49 7884 </pre>
Chris@49 7885 </ul>
Chris@49 7886 </li>
Chris@49 7887 <br>
Chris@49 7888 <li>See also:
Chris@49 7889 <ul>
Chris@49 7890 <li><a href="#t_st_members">.t()</a></li>
Chris@49 7891 <li><a href="#strans">strans()</a></li>
Chris@49 7892 </ul>
Chris@49 7893 </li>
Chris@49 7894 </ul>
Chris@49 7895 <br>
Chris@49 7896 <hr class="greyline"><br>
Chris@49 7897
Chris@49 7898
Chris@49 7899 <a name="trimat"></a>
Chris@49 7900 <b>trimatu(A)</b>
Chris@49 7901 <br><b>trimatl(A)</b>
Chris@49 7902 <ul>
Chris@49 7903 <li>
Chris@49 7904 <i>trimatu(A)</i>: interpret square matrix <i>A</i> as upper triangular
Chris@49 7905 </li>
Chris@49 7906 <br>
Chris@49 7907 <li>
Chris@49 7908 <i>trimatl(A)</i>: interpret square matrix <i>A</i> as lower triangular
Chris@49 7909 </li>
Chris@49 7910 <br>
Chris@49 7911 <li>
Chris@49 7912 A <i>std::logic_error</i> exception is thrown if <i>A</i> is non-square
Chris@49 7913 </li>
Chris@49 7914 <br>
Chris@49 7915 <li>
Chris@49 7916 Examples:
Chris@49 7917 <ul>
Chris@49 7918 <pre>mat A = randu&lt;mat&gt;(5,5);
Chris@49 7919 mat U = trimatu(A);
Chris@49 7920 mat L = trimatl(A);
Chris@49 7921
Chris@49 7922 // tell the inv() function to look only
Chris@49 7923 // at the upper triangular part
Chris@49 7924 mat X = inv( trimatu(U) );
Chris@49 7925 </pre>
Chris@49 7926 </ul>
Chris@49 7927 </li>
Chris@49 7928 <br>
Chris@49 7929 <li>See also:
Chris@49 7930 <ul>
Chris@49 7931 <li><a href="#symmat">symmatu() / symmatl()</a></li>
Chris@49 7932 <li><a href="#diagmat">diagmat()</a></li>
Chris@49 7933 <li><a href="#inv">inv()</a></li>
Chris@49 7934 <li><a href="#solve">solve()</a></li>
Chris@49 7935 <li><a href="http://mathworld.wolfram.com/TriangularMatrix.html">Triangular matrix in MathWorld</a></li>
Chris@49 7936 <li><a href="http://en.wikipedia.org/wiki/Triangular_matrix">Triangular matrix in Wikipedia</a></li>
Chris@49 7937 </ul>
Chris@49 7938 </li>
Chris@49 7939 </ul>
Chris@49 7940 <br>
Chris@49 7941 <hr class="greyline">
Chris@49 7942 <br>
Chris@49 7943
Chris@49 7944
Chris@49 7945 <a name="unique"></a>
Chris@49 7946 <b>unique(A)</b>
Chris@49 7947 <br>
Chris@49 7948 <ul>
Chris@49 7949 <li>
Chris@49 7950 Return the unique elements of <i>A</i>, sorted in ascending order
Chris@49 7951 </li>
Chris@49 7952 <br>
Chris@49 7953 <li>
Chris@49 7954 If <i>A</i> is a vector, the output is also a vector with the same orientation (row or column) as <i>A</i>;
Chris@49 7955 if <i>A</i> is a matrix, the output is always a column vector
Chris@49 7956 </li>
Chris@49 7957 <br>
Chris@49 7958 <li>
Chris@49 7959 This function was added in version 3.2
Chris@49 7960 </li>
Chris@49 7961 <br>
Chris@49 7962 <li>
Chris@49 7963 Examples:
Chris@49 7964 <ul>
Chris@49 7965 <pre>
Chris@49 7966 mat X;
Chris@49 7967 X &lt;&lt; 1 &lt;&lt; 2 &lt;&lt; endr
Chris@49 7968 &lt;&lt; 2 &lt;&lt; 3 &lt;&lt; endr;
Chris@49 7969
Chris@49 7970 mat Y = unique(X);
Chris@49 7971 </pre>
Chris@49 7972 </ul>
Chris@49 7973 </li>
Chris@49 7974 <br>
Chris@49 7975 <li>See also:
Chris@49 7976 <ul>
Chris@49 7977 <li><a href="#find">find()</a></li>
Chris@49 7978 <li><a href="#sort">sort()</a></li>
Chris@49 7979 </ul>
Chris@49 7980 </li>
Chris@49 7981 </ul>
Chris@49 7982 <br>
Chris@49 7983 <hr class="greyline">
Chris@49 7984
Chris@49 7985
Chris@49 7986 <hr class="greyline">
Chris@49 7987 <br>
Chris@49 7988 <br>
Chris@49 7989 <font size=+1><b>Decompositions, Factorisations, Inverses and Equation Solvers</b></font>
Chris@49 7990 <br>
Chris@49 7991 <br>
Chris@49 7992 <hr class="greyline">
Chris@49 7993 <br>
Chris@49 7994
Chris@49 7995 <a name="chol"></a>
Chris@49 7996 <b>R = chol(X)</b>
Chris@49 7997 <br><b>chol(R, X)</b>
Chris@49 7998 <ul>
Chris@49 7999 <li>
Chris@49 8000 Cholesky decomposition of <i>X</i>, such that <i>R.t()*R = X</i>
Chris@49 8001 </li>
Chris@49 8002 <br>
Chris@49 8003 <li>
Chris@49 8004 X must be a symmetric, positive-definite matrix
Chris@49 8005 </li>
Chris@49 8006 <br>
Chris@49 8007 <li>If the decomposition fails, <i>R</i> is reset and:
Chris@49 8008 <ul>
Chris@49 8009 <li><i>chol(X)</i> throws a <i>std::runtime_error</i> exception</li>
Chris@49 8010 <li><i>chol(R,X)</i> returns a bool set to <i>false</i></li>
Chris@49 8011 </ul>
Chris@49 8012 </li>
Chris@49 8013 <br>
Chris@49 8014 <li>
Chris@49 8015 Examples:
Chris@49 8016 <ul>
Chris@49 8017 <pre>
Chris@49 8018 mat X = randu&lt;mat&gt;(5,5);
Chris@49 8019 mat Y = X.t()*X;
Chris@49 8020
Chris@49 8021 mat R = chol(Y);
Chris@49 8022 </pre>
Chris@49 8023 </ul>
Chris@49 8024 </li>
Chris@49 8025 <br>
Chris@49 8026 <li>
Chris@49 8027 See also:
Chris@49 8028 <ul>
Chris@49 8029 <li><a href="http://mathworld.wolfram.com/CholeskyDecomposition.html">Cholesky decomposition in MathWorld</a></li>
Chris@49 8030 <li><a href="http://en.wikipedia.org/wiki/Cholesky_decomposition">Cholesky decomposition in Wikipedia</a></li>
Chris@49 8031 </ul>
Chris@49 8032 </li>
Chris@49 8033 </ul>
Chris@49 8034 <br>
Chris@49 8035 <hr class="greyline"><br>
Chris@49 8036
Chris@49 8037 <a name="eig_sym"></a>
Chris@49 8038 <b>vec eigval = eig_sym(mat X)</b>
Chris@49 8039 <br><b>vec eigval = eig_sym(cx_mat X)</b>
Chris@49 8040 <br>
Chris@49 8041 <br><b>eig_sym(vec eigval, mat X)</b>
Chris@49 8042 <br><b>eig_sym(vec eigval, cx_mat X)</b>
Chris@49 8043 <br>
Chris@49 8044 <br><b>eig_sym(vec eigval, mat eigvec, mat X, method = "standard")</b>
Chris@49 8045 <br><b>eig_sym(vec eigval, cx_mat eigvec, cx_mat X, method = "standard")</b>
Chris@49 8046 <ul>
Chris@49 8047 <li>Eigen decomposition of symmetric/hermitian matrix <i>X</i></li>
Chris@49 8048 <br>
Chris@49 8049 <li>The eigenvalues and corresponding eigenvectors are stored in <i>eigval</i> and <i>eigvec</i>, respectively</li>
Chris@49 8050 <br>
Chris@49 8051 <li>The eigenvalues are in ascending order</li>
Chris@49 8052 <br>
Chris@49 8053 <li>If <i>X</i> is not square, a <i>std::logic_error</i> exception is thrown</li>
Chris@49 8054 <br>
Chris@49 8055 <li>The <i>method</i> argument is optional</li>
Chris@49 8056 <br>
Chris@49 8057 <li>
Chris@49 8058 By default, a standard eigen decomposition algorithm is used;
Chris@49 8059 a divide-and-conquer algorithm can be used instead by explicitly setting <i>method</i> to <i>"dc"</i>
Chris@49 8060 </li>
Chris@49 8061 <br>
Chris@49 8062 <li>
Chris@49 8063 The divide-and-conquer algorithm provides slightly different results, but is notably faster for large matrices
Chris@49 8064 </li>
Chris@49 8065 <br>
Chris@49 8066 <li>If the decomposition fails, the output objects are reset and:
Chris@49 8067 <ul>
Chris@49 8068 <li><i>eig_sym(X)</i> throws a <i>std::runtime_error</i> exception</li>
Chris@49 8069 <li><i>eig_sym(eigval, X)</i> and <i>eig_sym(eigval, eigvec, X)</i> return a bool set to <i>false</i></li>
Chris@49 8070 </ul>
Chris@49 8071 </li>
Chris@49 8072 <br>
Chris@49 8073 <li>There is currently no check whether <i>X</i> is symmetric</li>
Chris@49 8074 <br>
Chris@49 8075 <li>
Chris@49 8076 Examples:
Chris@49 8077 <ul>
Chris@49 8078 <pre>
Chris@49 8079 mat A = randu&lt;mat&gt;(50,50);
Chris@49 8080 mat B = A.t()*A; // generate a symmetric matrix
Chris@49 8081
Chris@49 8082 vec eigval;
Chris@49 8083 mat eigvec;
Chris@49 8084
Chris@49 8085 eig_sym(eigval, eigvec, B); // use standard algorithm by default
Chris@49 8086
Chris@49 8087 eig_sym(eigval, eigvec, B, "dc"); // use "divide &amp; conquer" algorithm
Chris@49 8088 </pre>
Chris@49 8089 </ul>
Chris@49 8090 </li>
Chris@49 8091 <br>
Chris@49 8092 <li>
Chris@49 8093 See also:
Chris@49 8094 <ul>
Chris@49 8095 <li><a href="#eig_gen">eig_gen()</a></li>
Chris@49 8096 <li><a href="#svd">svd()</a></li>
Chris@49 8097 <li><a href="#svd_econ">svd_econ()</a></li>
Chris@49 8098 <li><a href="http://mathworld.wolfram.com/EigenDecomposition.html">eigen decomposition in MathWorld</a></li>
Chris@49 8099 <li><a href="http://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors">eigenvalues &amp; eigenvectors in Wikipedia</a></li>
Chris@49 8100 <li><a href="http://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm">divide &amp; conquer eigenvalue algorithm in Wikipedia</a></li>
Chris@49 8101 </ul>
Chris@49 8102 </li>
Chris@49 8103 <br>
Chris@49 8104 </ul>
Chris@49 8105 <hr class="greyline"><br>
Chris@49 8106
Chris@49 8107 <a name="eig_gen"></a>
Chris@49 8108 <b>eig_gen(cx_vec eigval, cx_mat eigvec, mat X, side='r')</b>
Chris@49 8109 <br>
Chris@49 8110 <b>eig_gen(cx_vec eigval, cx_mat eigvec, cx_mat X, side='r')</b>
Chris@49 8111 <br>
Chris@49 8112 <br>
Chris@49 8113 <b>eig_gen(cx_vec eigval, mat l_eigvec, mat r_eigvec, mat X)</b>
Chris@49 8114 <br>
Chris@49 8115 <b>eig_gen(cx_vec eigval, cx_mat l_eigvec, cx_mat r_eigvec, cx_mat X)</b>
Chris@49 8116 <ul>
Chris@49 8117 <li>
Chris@49 8118 Eigen decomposition of general (non-symmetric/non-hermitian) square matrix <i>X</i></li>
Chris@49 8119 <br>
Chris@49 8120 <li>The eigenvalues and corresponding eigenvectors are stored in <i>eigval</i> and <i>eigvec</i>, respectively</li>
Chris@49 8121 <br>
Chris@49 8122 <li>
Chris@49 8123 For the first two forms, <i>side='r'</i> (default) specifies that right eigenvectors are computed,
Chris@49 8124 while <i>side='l'</i> specifies that left eigenvectors are computed
Chris@49 8125 </li>
Chris@49 8126 <br>
Chris@49 8127 <li>For the last two forms, both left and right eigenvectors are computed</li>
Chris@49 8128 <br>
Chris@49 8129 <li>
Chris@49 8130 The eigenvalues are not guaranteed to be ordered
Chris@49 8131 </li>
Chris@49 8132 <br>
Chris@49 8133 <li>If <i>X</i> is not square, a <i>std::logic_error</i> exception is thrown</li>
Chris@49 8134 <br>
Chris@49 8135 <li>If the decomposition fails, the output objects are reset and <i>eig_gen()</i> returns a bool set to <i>false</i></li>
Chris@49 8136 <br>
Chris@49 8137 <li>
Chris@49 8138 Examples:
Chris@49 8139 <ul>
Chris@49 8140 <pre>
Chris@49 8141 mat A = randu&lt;mat&gt;(10,10);
Chris@49 8142
Chris@49 8143 cx_vec eigval;
Chris@49 8144 cx_mat eigvec;
Chris@49 8145
Chris@49 8146 eig_gen(eigval, eigvec, A);
Chris@49 8147 </pre>
Chris@49 8148 </ul>
Chris@49 8149 </li>
Chris@49 8150 <br>
Chris@49 8151 <li>
Chris@49 8152 See also:
Chris@49 8153 <ul>
Chris@49 8154 <li><a href="#eig_sym">eig_sym()</a></li>
Chris@49 8155 <li><a href="#svd">svd()</a></li>
Chris@49 8156 <li><a href="#svd_econ">svd_econ()</a></li>
Chris@49 8157 <li><a href="http://mathworld.wolfram.com/EigenDecomposition.html">eigen decomposition in MathWorld</a></li>
Chris@49 8158 <li><a href="http://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors">eigenvalues &amp; eigenvectors in Wikipedia</a></li>
Chris@49 8159 </ul>
Chris@49 8160 </li>
Chris@49 8161 </ul>
Chris@49 8162 <br>
Chris@49 8163 <hr class="greyline"><br>
Chris@49 8164
Chris@49 8165 <a name="fft"></a>
Chris@49 8166 <b>cx_mat Y = &nbsp;fft(X)</b><br>
Chris@49 8167 <b>cx_mat Y = &nbsp;fft(X, n)</b><br>
Chris@49 8168 <br>
Chris@49 8169 <b>cx_mat Z = ifft(cx_mat Y)</b><br>
Chris@49 8170 <b>cx_mat Z = ifft(cx_mat Y, n)</b><br>
Chris@49 8171 <ul>
Chris@49 8172 <li>fft(): fast Fourier transform of a vector or matrix (real or complex)</li>
Chris@49 8173 <br>
Chris@49 8174 <li>ifft(): inverse fast Fourier transform of a vector or matrix (complex only)</li>
Chris@49 8175 <br>
Chris@49 8176 <li>If given a matrix, the transform is done on each column vector of the matrix</li>
Chris@49 8177 <br>
Chris@49 8178 <li>
Chris@49 8179 The optional <i>n</i> argument specifies the transform length:
Chris@49 8180 <ul>
Chris@49 8181 <li>if <i>n</i> is larger than the length of the input vector, a zero-padded version of the vector is used</li>
Chris@49 8182 <li>if <i>n</i> is smaller than the length of the input vector, only the first <i>n</i> elements of the vector are used</li>
Chris@49 8183 </ul>
Chris@49 8184 </li>
Chris@49 8185 <br>
Chris@49 8186 <li>
Chris@49 8187 If <i>n</i> is not specified, the transform length is the same as the length of the input vector
Chris@49 8188 </li>
Chris@49 8189 <br>
Chris@49 8190 <li><b>Caveat:</b> the transform is fastest when the transform length is a power of 2, eg. 64, 128, 256, 512, 1024, ...</li>
Chris@49 8191 <br>
Chris@49 8192 <li>The implementation of the transform in this version is preliminary; it is not yet fully optimised</li>
Chris@49 8193 <br>
Chris@49 8194 <li>This function was added in version 3.810</li>
Chris@49 8195 <br>
Chris@49 8196 <li>
Chris@49 8197 Examples:
Chris@49 8198 <ul>
Chris@49 8199 <pre>
Chris@49 8200 vec X = randu&lt;vec&gt;(100);
Chris@49 8201 cx_vec Y = fft(X, 128);
Chris@49 8202 </pre>
Chris@49 8203 </ul>
Chris@49 8204 </li>
Chris@49 8205 <br>
Chris@49 8206 <li>
Chris@49 8207 See also:
Chris@49 8208 <ul>
Chris@49 8209 <li><a href="#conv">conv()</a></li>
Chris@49 8210 <li><a href="#imag_real">real()</a></li>
Chris@49 8211 <li><a href="http://mathworld.wolfram.com/FastFourierTransform.html">fast Fourier transform in MathWorld</a></li>
Chris@49 8212 <li><a href="http://en.wikipedia.org/wiki/Fast_Fourier_transform">fast Fourier transform in Wikipedia</a></li>
Chris@49 8213 </ul>
Chris@49 8214 </li>
Chris@49 8215 <br>
Chris@49 8216 </ul>
Chris@49 8217 <hr class="greyline"><br>
Chris@49 8218
Chris@49 8219 <a name="inv"></a>
Chris@49 8220 <b>B = inv(A, </b><i>slow=false</i><b>)</b>
Chris@49 8221 <br>
Chris@49 8222 <b>inv(B, A, </b><i>slow=false</i><b>)</b>
Chris@49 8223 <ul>
Chris@49 8224 <li>
Chris@49 8225 Inverse of square matrix <i>A</i>
Chris@49 8226 </li>
Chris@49 8227 <br>
Chris@49 8228 <li>the <i>slow</i> argument is optional</li>
Chris@49 8229 <br>
Chris@49 8230 <li>
Chris@49 8231 If <i>A</i> is known to be a triangular matrix,
Chris@49 8232 the inverse can be computed faster by explicitly marking the matrix as triangular
Chris@49 8233 through <a href="#trimat">trimatu()</a> or <a href="#trimat">trimatl()</a>
Chris@49 8234 </li>
Chris@49 8235 <br>
Chris@49 8236 <li>
Chris@49 8237 If <i>A</i> is known to be a positive-definite symmetric matrix,
Chris@49 8238 the inverse can be computed faster by explicitly marking the matrix using sympd()
Chris@49 8239 </li>
Chris@49 8240 <br>
Chris@49 8241 <li>
Chris@49 8242 If <i>A</i> is not square, a <i>std::logic_error</i> exception is thrown
Chris@49 8243 </li>
Chris@49 8244 <br>
Chris@49 8245 <li>If <i>A</i> appears to be singular, <i>B</i> is reset and:
Chris@49 8246 <ul>
Chris@49 8247 <li><i>inv(A)</i> throws a <i>std::runtime_error</i> exception</li>
Chris@49 8248 <li><i>inv(B,A)</i> returns a bool set to <i>false</i></li>
Chris@49 8249 </ul>
Chris@49 8250 </li>
Chris@49 8251 <br>
Chris@49 8252 <li>
Chris@49 8253 <b>NOTE:</b> in many cases it is more efficient/faster to use the <a href="#solve">solve()</a> function instead of performing a matrix inverse;
Chris@49 8254 for example, if you want to solve a system of linear equations, eg., <i>X = inv(A)*B</i>,
Chris@49 8255 use <a href="#solve">solve()</a> instead
Chris@49 8256 </li>
Chris@49 8257 <br>
Chris@49 8258 <li>
Chris@49 8259 For matrix sizes &le; 4x4, a fast inverse algorithm is used by default.
Chris@49 8260 In rare instances, the fast algorithm might be less precise than the standard algorithm.
Chris@49 8261 To force the use of the standard algorithm, set the <i>slow</i> argument to <i>true</i>
Chris@49 8262 </li>
Chris@49 8263 <br>
Chris@49 8264 <li>
Chris@49 8265 Examples:
Chris@49 8266 <ul>
Chris@49 8267 <pre>
Chris@49 8268 mat A = randu&lt;mat&gt;(5,5);
Chris@49 8269 mat B = inv(A);
Chris@49 8270
Chris@49 8271
Chris@49 8272 // Diagonal elements in C are set to the
Chris@49 8273 // reciprocal of the corresponding elements in A.
Chris@49 8274 // Off-diagonal elements in C are set to zero.
Chris@49 8275 mat C = inv( diagmat(A) );
Chris@49 8276
Chris@49 8277
Chris@49 8278 // tell inv() to look only at the upper triangular part of A
Chris@49 8279 mat D = inv( trimatu(A) );
Chris@49 8280
Chris@49 8281
Chris@49 8282 // tell inv() that AA is a symmetric positive definite matrix
Chris@49 8283 mat AA = A*A.t();
Chris@49 8284 mat E = inv( sympd(AA) );
Chris@49 8285
Chris@49 8286
Chris@49 8287 mat44 F = randu&lt;mat&gt;(4,4);
Chris@49 8288
Chris@49 8289 mat G = inv(F); // use fast algorithm by default
Chris@49 8290 mat H = inv(F, true); // use slow algorithm
Chris@49 8291 </pre>
Chris@49 8292 </ul>
Chris@49 8293 </li>
Chris@49 8294 <br>
Chris@49 8295 <li>
Chris@49 8296 See also:
Chris@49 8297 <ul>
Chris@49 8298 <li><a href="#i_member">.i()</a>
Chris@49 8299 <li><a href="#pinv">pinv()</a>
Chris@49 8300 <li><a href="#solve">solve()</a></li>
Chris@49 8301 <li><a href="#trimat">trimatu() / trimatl()</a></li>
Chris@49 8302 <li><a href="http://mathworld.wolfram.com/MatrixInverse.html">matrix inverse in MathWorld</a></li>
Chris@49 8303 <li><a href="http://en.wikipedia.org/wiki/Invertible_matrix">invertible matrix in Wikipedia</a></li>
Chris@49 8304 </ul>
Chris@49 8305 </li>
Chris@49 8306 </ul>
Chris@49 8307 <br>
Chris@49 8308 <hr class="greyline"><br>
Chris@49 8309
Chris@49 8310
Chris@49 8311
Chris@49 8312 <a name="lu"></a>
Chris@49 8313 <b>lu(mat L, mat U, mat P, mat X)</b>
Chris@49 8314 <br>
Chris@49 8315 <b>lu(mat L, mat U, mat X)</b>
Chris@49 8316 <ul>
Chris@49 8317 <li>
Chris@49 8318 Lower-upper decomposition (with partial pivoting) of matrix <i>X</i>
Chris@49 8319 </li>
Chris@49 8320 <br>
Chris@49 8321 <li>
Chris@49 8322 The first form provides
Chris@49 8323 a lower-triangular matrix <i>L</i>,
Chris@49 8324 an upper-triangular matrix <i>U</i>,
Chris@49 8325 and a permutation matrix <i>P</i>,
Chris@49 8326 such that <i>P.t()*L*U&nbsp;=&nbsp;X</i>
Chris@49 8327 </li>
Chris@49 8328 <br>
Chris@49 8329 <li>
Chris@49 8330 The second form provides permuted <i>L</i> and <i>U</i>, such that <i>L*U = X</i>.
Chris@49 8331 Note that in this case <i>L</i> is generally not lower-triangular
Chris@49 8332 </li>
Chris@49 8333 <br>
Chris@49 8334 <li>
Chris@49 8335 If the decomposition fails, the output objects are reset and <i>lu()</i> returns a bool set to <i>false</i>
Chris@49 8336 </li>
Chris@49 8337 <br>
Chris@49 8338 <li>
Chris@49 8339 Examples:
Chris@49 8340 <ul>
Chris@49 8341 <pre>
Chris@49 8342 mat A = randu&lt;mat&gt;(5,5);
Chris@49 8343
Chris@49 8344 mat L, U, P;
Chris@49 8345
Chris@49 8346 lu(L, U, P, A);
Chris@49 8347
Chris@49 8348 mat B = P.t()*L*U;
Chris@49 8349 </pre>
Chris@49 8350 </ul>
Chris@49 8351 </li>
Chris@49 8352 <br>
Chris@49 8353 <li>
Chris@49 8354 See also:
Chris@49 8355 <ul>
Chris@49 8356 <li><a href="http://en.wikipedia.org/wiki/LU_decomposition">LU decomposition in Wikipedia</a></li>
Chris@49 8357 <li><a href="http://mathworld.wolfram.com/LUDecomposition.html">LU decomposition in MathWorld</a></li>
Chris@49 8358 </ul>
Chris@49 8359 </li>
Chris@49 8360 </ul>
Chris@49 8361 <br>
Chris@49 8362 <hr class="greyline"><br>
Chris@49 8363
Chris@49 8364 <a name="pinv"></a>
Chris@49 8365 <b>B = pinv(A, tolerance = default)</b>
Chris@49 8366 <br><b>pinv(B, A, tolerance = default)</b>
Chris@49 8367 <ul>
Chris@49 8368 <li>Moore-Penrose pseudo-inverse of matrix <i>A</i></li>
Chris@49 8369 <br>
Chris@49 8370 <li>The <i>tolerance</i> argument is optional</li>
Chris@49 8371 <br>
Chris@49 8372 <li>The computation is based on singular value decomposition;
Chris@49 8373 if the decomposition fails, <i>B</i> is reset and:
Chris@49 8374 <ul>
Chris@49 8375 <li><i>pinv(A)</i> throws a <i>std::runtime_error</i> exception</li>
Chris@49 8376 <li><i>pinv(B,A)</i> returns a bool set to <i>false</i></li>
Chris@49 8377 </ul>
Chris@49 8378 <br>
Chris@49 8379 <li>Any singular values less than <i>tolerance</i> are treated as zero</li>
Chris@49 8380 <br>
Chris@49 8381 <li>For matrix <i>A</i> with <i>m</i> rows and <i>n</i> columns,
Chris@49 8382 the default tolerance is <i>max(m,n)*norm(A)*datum::eps</i>,
Chris@49 8383 where <i>datum::eps</i> denotes the difference between 1 and the least value greater than 1 that is representable</li>
Chris@49 8384 <br>
Chris@49 8385 <li>
Chris@49 8386 Examples:
Chris@49 8387 <ul>
Chris@49 8388 <pre>
Chris@49 8389 mat A = randu&lt;mat&gt;(4,5);
Chris@49 8390 mat B = pinv(A);
Chris@49 8391 </pre>
Chris@49 8392 </ul>
Chris@49 8393 </li>
Chris@49 8394 <br>
Chris@49 8395 <li>
Chris@49 8396 See also:
Chris@49 8397 <ul>
Chris@49 8398 <li><a href="#i_member">.i()</a></li>
Chris@49 8399 <li><a href="#inv">inv()</a></li>
Chris@49 8400 <li><a href="#solve">solve()</a></li>
Chris@49 8401 <li><a href="#constants">datum::eps</a></li>
Chris@49 8402 <li><a href="http://mathworld.wolfram.com/Pseudoinverse.html">Pseudoinverse in MathWorld</a></li>
Chris@49 8403 <li><a href="http://mathworld.wolfram.com/Moore-PenroseMatrixInverse.html">Moore-Penrose Matrix Inverse in MathWorld</a></li>
Chris@49 8404 <li><a href="http://en.wikipedia.org/wiki/Moore-Penrose_pseudoinverse">Moore-Penrose pseudoinverse in Wikipedia</a></li>
Chris@49 8405 </ul>
Chris@49 8406 </li>
Chris@49 8407 </ul>
Chris@49 8408 <br>
Chris@49 8409 <hr class="greyline"><br>
Chris@49 8410
Chris@49 8411 <a name="princomp"></a>
Chris@49 8412 <b>mat coeff = princomp(mat X)</b>
Chris@49 8413 <br><b>cx_mat coeff = princomp(cx_mat X)</b><br>
Chris@49 8414
Chris@49 8415 <br><b>princomp(mat coeff, mat X)</b>
Chris@49 8416 <br><b>princomp(cx_mat coeff, cx_mat X)</b><br>
Chris@49 8417
Chris@49 8418 <br><b>princomp(mat coeff, mat score, mat X)</b>
Chris@49 8419 <br><b>princomp(cx_mat coeff, cx_mat score, cx_mat X)</b><br>
Chris@49 8420
Chris@49 8421 <br><b>princomp(mat coeff, mat score, vec latent, mat X)</b>
Chris@49 8422 <br><b>princomp(cx_mat coeff, cx_mat score, vec latent, cx_mat X)</b><br>
Chris@49 8423
Chris@49 8424 <br><b>princomp(mat coeff, mat score, vec latent, vec tsquared, mat X)</b>
Chris@49 8425 <br><b>princomp(cx_mat coeff, cx_mat score, vec latent, cx_vec tsquared, cx_mat X)</b><br>
Chris@49 8426 <br>
Chris@49 8427 <ul>
Chris@49 8428 <li>Principal component analysis of matrix <i>X</i></li><br>
Chris@49 8429 <li>Each row of <i>X</i> is an observation and each column is a variable</li><br>
Chris@49 8430 <li>output objects:
Chris@49 8431 <ul>
Chris@49 8432 <li><i>coeff</i>: principal component coefficients</li>
Chris@49 8433 <li><i>score</i>: projected data</li>
Chris@49 8434 <li><i>latent</i>: eigenvalues of the covariance matrix of <i>X</i></li>
Chris@49 8435 <li><i>tsquared</i>: Hotteling's statistic for each sample</li>
Chris@49 8436 </ul>
Chris@49 8437 </li>
Chris@49 8438 <br>
Chris@49 8439 <li>The computation is based on singular value decomposition;
Chris@49 8440 if the decomposition fails, the output objects are reset and:
Chris@49 8441 <ul>
Chris@49 8442 <li><i>princomp(X)</i> throws a <i>std::runtime_error</i> exception</li>
Chris@49 8443 <li>remaining forms of <i>princomp()</i> return a bool set to <i>false</i></li>
Chris@49 8444 </ul>
Chris@49 8445 </li>
Chris@49 8446 <br>
Chris@49 8447 <li>
Chris@49 8448 Examples:
Chris@49 8449 <ul>
Chris@49 8450 <pre>
Chris@49 8451 mat A = randu&lt;mat&gt;(5,4);
Chris@49 8452
Chris@49 8453 mat coeff;
Chris@49 8454 mat score;
Chris@49 8455 vec latent;
Chris@49 8456 vec tsquared;
Chris@49 8457
Chris@49 8458 princomp(coeff, score, latent, tsquared, A);
Chris@49 8459 </pre>
Chris@49 8460 </ul>
Chris@49 8461 </li>
Chris@49 8462 <br>
Chris@49 8463 <li>
Chris@49 8464 See also:
Chris@49 8465 <ul>
Chris@49 8466 <li><a href="http://en.wikipedia.org/wiki/Principal_component_analysis">principal components analysis in Wikipedia</a></li>
Chris@49 8467 <li><a href="http://mathworld.wolfram.com/PrincipalComponentAnalysis.html">principal components analysis in MathWorld</a></li>
Chris@49 8468 </ul>
Chris@49 8469 </li>
Chris@49 8470 <br>
Chris@49 8471 </ul>
Chris@49 8472 <hr class="greyline"><br>
Chris@49 8473
Chris@49 8474 <a name="qr"></a>
Chris@49 8475 <b>qr(Q,R,X)</b>
Chris@49 8476 <ul>
Chris@49 8477 <li>
Chris@49 8478 Decomposition of <i>X</i> into an orthogonal matrix <i>Q</i> and a right triangular matrix <i>R</i>, such that <i>Q*R = X</i>
Chris@49 8479 </li>
Chris@49 8480 <br>
Chris@49 8481 <li>
Chris@49 8482 If the decomposition fails, <i>Q</i> and <i>R</i> are reset and the function returns a bool set to <i>false</i>
Chris@49 8483 </li>
Chris@49 8484 <br>
Chris@49 8485 <li>
Chris@49 8486 Examples:
Chris@49 8487 <ul>
Chris@49 8488 <pre>
Chris@49 8489 mat X = randu&lt;mat&gt;(5,5);
Chris@49 8490 mat Q, R;
Chris@49 8491
Chris@49 8492 qr(Q,R,X);
Chris@49 8493 </pre>
Chris@49 8494 </ul>
Chris@49 8495 </li>
Chris@49 8496 <br>
Chris@49 8497 <li>
Chris@49 8498 See also:
Chris@49 8499 <ul>
Chris@49 8500 <li><a href="#qr_econ">qr_econ()</a></li>
Chris@49 8501 <li><a href="http://en.wikipedia.org/wiki/Orthogonal_matrix">Orthogonal matrix in Wikipedia</a></li>
Chris@49 8502 <li><a href="http://en.wikipedia.org/wiki/QR_decomposition">QR decomposition in Wikipedia</a></li>
Chris@49 8503 <li><a href="http://mathworld.wolfram.com/QRDecomposition.html">QR decomposition in MathWorld</a></li>
Chris@49 8504 <li><a href="http://octave.sourceforge.net/octave/function/qr.html">QR decomposition in Octave</a></li>
Chris@49 8505 </ul>
Chris@49 8506 </li>
Chris@49 8507 </ul>
Chris@49 8508 <br>
Chris@49 8509 <hr class="greyline"><br>
Chris@49 8510
Chris@49 8511 <a name="qr_econ"></a>
Chris@49 8512 <b>qr_econ(Q,R,X)</b>
Chris@49 8513 <ul>
Chris@49 8514 <li>
Chris@49 8515 Economical decomposition of <i>X</i> (with size <i>m</i> x <i>n</i>) into an orthogonal matrix <i>Q</i> and a right triangular matrix <i>R</i>, such that <i>Q*R = X</i>
Chris@49 8516 </li>
Chris@49 8517 <br>
Chris@49 8518 <li>
Chris@49 8519 If <i>m</i> &gt; <i>n</i>, only the first <i>n</i> rows of <i>R</i> and the first <i>n</i> columns of <i>Q</i> are calculated
Chris@49 8520 (ie. the zero rows of <i>R</i> and the corresponding columns of <i>Q</i> are omitted)
Chris@49 8521 </li>
Chris@49 8522 <br>
Chris@49 8523 <li>
Chris@49 8524 If the decomposition fails, <i>Q</i> and <i>R</i> are reset and the function returns a bool set to <i>false</i>
Chris@49 8525 </li>
Chris@49 8526 <br>
Chris@49 8527 <li>
Chris@49 8528 This function was added in version 3.4
Chris@49 8529 </li>
Chris@49 8530 <br>
Chris@49 8531 <li>
Chris@49 8532 Examples:
Chris@49 8533 <ul>
Chris@49 8534 <pre>
Chris@49 8535 mat X = randu&lt;mat&gt;(6,5);
Chris@49 8536 mat Q, R;
Chris@49 8537
Chris@49 8538 qr_econ(Q,R,X);
Chris@49 8539 </pre>
Chris@49 8540 </ul>
Chris@49 8541 </li>
Chris@49 8542 <br>
Chris@49 8543 <li>
Chris@49 8544 See also:
Chris@49 8545 <ul>
Chris@49 8546 <li><a href="#qr">qr()</a></li>
Chris@49 8547 <li><a href="http://en.wikipedia.org/wiki/Orthogonal_matrix">Orthogonal matrix in Wikipedia</a></li>
Chris@49 8548 <li><a href="http://en.wikipedia.org/wiki/QR_decomposition">QR decomposition in Wikipedia</a></li>
Chris@49 8549 <li><a href="http://octave.sourceforge.net/octave/function/qr.html">QR decomposition in Octave</a></li>
Chris@49 8550 <li><a href="http://mathworld.wolfram.com/QRDecomposition.html">QR decomposition in MathWorld</a></li>
Chris@49 8551 </ul>
Chris@49 8552 </li>
Chris@49 8553 </ul>
Chris@49 8554 <br>
Chris@49 8555 <hr class="greyline"><br>
Chris@49 8556
Chris@49 8557 <a name="solve"></a>
Chris@49 8558 <b>X = solve(A, B, </b><i>slow=false</i><b>)</b>
Chris@49 8559 <br><b>solve(X, A, B, </b><i>slow=false</i><b>)</b>
Chris@49 8560 <ul>
Chris@49 8561 <li>Solve a system of linear equations, ie., <i>A*X = B</i>, where <i>X</i> is unknown</li>
Chris@49 8562 <br>
Chris@49 8563 <li>The <i>slow</i> argument is optional</li>
Chris@49 8564 <br>
Chris@49 8565 <li>For a square matrix <i>A</i>, this function is conceptually the same as <i>X = inv(A)*B</i>, but is more efficient</li>
Chris@49 8566 <br>
Chris@49 8567 <li>Similar functionality to the "\" (left division operator) operator in Matlab/Octave, ie. <i>X&nbsp;=&nbsp;A&nbsp;\&nbsp;B</i></li>
Chris@49 8568 <br>
Chris@49 8569 <li>The number of rows in <i>A</i> and <i>B</i> must be the same</li>
Chris@49 8570 <br>
Chris@49 8571 <li>
Chris@49 8572 If <i>A</i> is known to be a triangular matrix,
Chris@49 8573 the solution can be computed faster by explicitly marking the matrix as triangular
Chris@49 8574 through <a href="#trimat">trimatu()</a> or <a href="#trimat">trimatl()</a>
Chris@49 8575 </li>
Chris@49 8576 <br>
Chris@49 8577 <li>
Chris@49 8578 If <i>A</i> is non-square (and hence also non-triangular),
Chris@49 8579 solve() will also try to provide approximate solutions to under-determined as well as over-determined systems</li>
Chris@49 8580 <br>
Chris@49 8581 <li>
Chris@49 8582 If no solution is found, <i>X</i> is reset and:
Chris@49 8583 <ul>
Chris@49 8584 <li><i>solve(A,B)</i> throws a <i>std::runtime_error</i> exception</li>
Chris@49 8585 <li><i>solve(X,A,B)</i> returns a bool set to <i>false</i></li>
Chris@49 8586 </ul>
Chris@49 8587 </li>
Chris@49 8588 <br>
Chris@49 8589 <li>
Chris@49 8590 For matrix sizes &le; 4x4, a fast algorithm is used by default.
Chris@49 8591 In rare instances, the fast algorithm might be less precise than the standard algorithm.
Chris@49 8592 To force the use of the standard algorithm, set the <i>slow</i> argument to <i>true</i>
Chris@49 8593 </li>
Chris@49 8594 <br>
Chris@49 8595 <li>
Chris@49 8596 <b>NOTE:</b> Old versions of the ATLAS library (eg.&nbsp;3.6) can corrupt memory and crash your program;
Chris@49 8597 the standard LAPACK library and later versions of ATLAS (eg.&nbsp;3.8) work without problems
Chris@49 8598 </li>
Chris@49 8599 <br>
Chris@49 8600 <li>
Chris@49 8601 Examples:
Chris@49 8602 <ul>
Chris@49 8603 <pre>
Chris@49 8604 mat A = randu&lt;mat&gt;(5,5);
Chris@49 8605 vec b = randu&lt;vec&gt;(5);
Chris@49 8606 mat B = randu&lt;mat&gt;(5,5);
Chris@49 8607
Chris@49 8608 vec x = solve(A, b);
Chris@49 8609 mat X = solve(A, B);
Chris@49 8610
Chris@49 8611 vec x2;
Chris@49 8612 solve(x2, A, b);
Chris@49 8613
Chris@49 8614 // tell solve() to look only at the upper triangular part of A
Chris@49 8615 mat Y = solve( trimatu(A), B );
Chris@49 8616
Chris@49 8617
Chris@49 8618 mat44 C = randu&lt;mat&gt;(4,4);
Chris@49 8619 mat44 D = randu&lt;mat&gt;(4,4);
Chris@49 8620
Chris@49 8621 mat E = solve(C, D); // use fast algorithm by default
Chris@49 8622 mat F = solve(C, D, true); // use slow algorithm
Chris@49 8623
Chris@49 8624 </pre>
Chris@49 8625 </ul>
Chris@49 8626 </li>
Chris@49 8627 <br>
Chris@49 8628 <li>
Chris@49 8629 See also:
Chris@49 8630 <ul>
Chris@49 8631 <li><a href="#i_member">.i()</a></li>
Chris@49 8632 <li><a href="#inv">inv()</a></li>
Chris@49 8633 <li><a href="#pinv">pinv()</a></li>
Chris@49 8634 <li><a href="#syl">syl()</a></li>
Chris@49 8635 <li><a href="#trimat">trimatu() / trimatl()</a></li>
Chris@49 8636 <li><a href="http://mathworld.wolfram.com/LinearSystemofEquations.html">linear system of equations in MathWorld</a></li>
Chris@49 8637 <li><a href="http://en.wikipedia.org/wiki/Linear_system_of_equations">system of linear equations in Wikipedia</a></li>
Chris@49 8638 </ul>
Chris@49 8639 </li>
Chris@49 8640 <br>
Chris@49 8641 </ul>
Chris@49 8642 <hr class="greyline"><br>
Chris@49 8643
Chris@49 8644
Chris@49 8645 <a name="svd"></a>
Chris@49 8646 <b>vec s = svd(mat X)</b>
Chris@49 8647 <br><b>vec s = svd(cx_mat X)</b>
Chris@49 8648 <br>
Chris@49 8649 <br><b>svd(vec s, mat X)</b>,
Chris@49 8650 <br><b>svd(vec s, cx_mat X)</b>
Chris@49 8651 <br>
Chris@49 8652 <br><b>svd(mat U, vec s, mat V, mat X, method = "standard")</b>
Chris@49 8653 <br><b>svd(cx_mat U, vec s, cx_mat V, cx_mat X, method = "standard")</b>
Chris@49 8654 <ul>
Chris@49 8655 <li>
Chris@49 8656 The first four forms compute the singular values of <i>X</i>
Chris@49 8657 </li>
Chris@49 8658 <br>
Chris@49 8659 <li>
Chris@49 8660 The last two forms compute the full singular value decomposition of <i>X</i>
Chris@49 8661 </li>
Chris@49 8662 <br>
Chris@49 8663 <li>The <i>method</i> argument is optional</li>
Chris@49 8664 <br>
Chris@49 8665 <li>
Chris@49 8666 By default, a standard decomposition algorithm is used;
Chris@49 8667 a divide-and-conquer algorithm can be used instead by explicitly setting <i>method</i> to <i>"dc"</i>
Chris@49 8668 </li>
Chris@49 8669 <br>
Chris@49 8670 <li>
Chris@49 8671 The divide-and-conquer algorithm provides slightly different results, but is notably faster for large matrices
Chris@49 8672 </li>
Chris@49 8673 <br>
Chris@49 8674 <li>If <i>X</i> is square, it can be reconstructed using <i>X = U*diagmat(s)*V.t()</i>
Chris@49 8675 </li>
Chris@49 8676 <br>
Chris@49 8677 <li>
Chris@49 8678 The singular values are in descending order
Chris@49 8679 </li>
Chris@49 8680 <br>
Chris@49 8681 <li>
Chris@49 8682 If the decomposition fails, the output objects are reset and:
Chris@49 8683 <ul>
Chris@49 8684 <li><i>svd(X)</i> throws a <i>std::runtime_error</i> exception</li>
Chris@49 8685 <li><i>svd(s,X)</i> and <i>svd(U,s,V,X)</i> return a bool set to <i>false</i></li>
Chris@49 8686 </ul>
Chris@49 8687 </li>
Chris@49 8688 <br>
Chris@49 8689 <li>
Chris@49 8690 <b>NOTE:</b> Old versions of the ATLAS library (eg.&nbsp;3.6) can corrupt memory and crash your program;
Chris@49 8691 the standard LAPACK library and later versions of ATLAS (eg.&nbsp;3.8) work without problems
Chris@49 8692 </li>
Chris@49 8693 <br>
Chris@49 8694 <li>
Chris@49 8695 Examples:
Chris@49 8696 <ul>
Chris@49 8697 <pre>
Chris@49 8698 mat X = randu&lt;mat&gt;(5,5);
Chris@49 8699
Chris@49 8700 mat U;
Chris@49 8701 vec s;
Chris@49 8702 mat V;
Chris@49 8703
Chris@49 8704 svd(U,s,V,X); // use standard algorithm by default
Chris@49 8705
Chris@49 8706 svd(U,s,V,X, "dc"); // use "divide &amp; conquer" algorithm
Chris@49 8707 </pre>
Chris@49 8708 </ul>
Chris@49 8709 </li>
Chris@49 8710 <br>
Chris@49 8711 <li>
Chris@49 8712 See also:
Chris@49 8713 <ul>
Chris@49 8714 <li><a href="#svd_econ">svd_econ()</a></li>
Chris@49 8715 <li><a href="#eig_gen">eig_gen()</a></li>
Chris@49 8716 <li><a href="#eig_sym">eig_sym()</a></li>
Chris@49 8717 <li><a href="http://en.wikipedia.org/wiki/Singular_value_decomposition">singular value decomposition in Wikipedia</a></li>
Chris@49 8718 <li><a href="http://mathworld.wolfram.com/SingularValueDecomposition.html">singular value decomposition in MathWorld</a></li>
Chris@49 8719 </ul>
Chris@49 8720 </li>
Chris@49 8721 </ul>
Chris@49 8722 <br>
Chris@49 8723 <hr class="greyline">
Chris@49 8724 <br>
Chris@49 8725
Chris@49 8726 <a name="svd_econ"></a>
Chris@49 8727 <b>svd_econ(mat U, vec s, mat V, mat X, mode = 'b')</b>
Chris@49 8728 <br><b>svd_econ(cx_mat U, vec s, cx_mat V, cx_mat X, mode = 'b')</b>
Chris@49 8729 <ul>
Chris@49 8730 <li>
Chris@49 8731 Economical singular value decomposition of <i>X</i>
Chris@49 8732 </li>
Chris@49 8733 <br>
Chris@49 8734 <li>
Chris@49 8735 mode is one of:
Chris@49 8736 <ul>
Chris@49 8737 <li><i>'l'</i>: compute only left singular vectors</li>
Chris@49 8738 <li><i>'r'</i>: compute only right singular vectors</li>
Chris@49 8739 <li><i>'b'</i>: compute both left and right singular vectors (default)</li>
Chris@49 8740 </ul>
Chris@49 8741 </li>
Chris@49 8742 <br>
Chris@49 8743 <li>
Chris@49 8744 The singular values are in descending order
Chris@49 8745 </li>
Chris@49 8746 <br>
Chris@49 8747 <li>
Chris@49 8748 If the decomposition fails, the output objects are reset and bool set to <i>false</i> is returned
Chris@49 8749 </li>
Chris@49 8750 <br>
Chris@49 8751 <li>
Chris@49 8752 Examples:
Chris@49 8753 <ul>
Chris@49 8754 <pre>
Chris@49 8755 mat X = randu&lt;mat&gt;(4,5);
Chris@49 8756
Chris@49 8757 mat U;
Chris@49 8758 vec s;
Chris@49 8759 mat V;
Chris@49 8760 svd_econ(U, s, V, X, 'l');
Chris@49 8761 </pre>
Chris@49 8762 </ul>
Chris@49 8763 </li>
Chris@49 8764 <br>
Chris@49 8765 <li>
Chris@49 8766 See also:
Chris@49 8767 <ul>
Chris@49 8768 <li><a href="#svd">svd()</a></li>
Chris@49 8769 <li><a href="#eig_gen">eig_gen()</a></li>
Chris@49 8770 <li><a href="#eig_sym">eig_sym()</a></li>
Chris@49 8771 <li><a href="http://en.wikipedia.org/wiki/Singular_value_decomposition">singular value decomposition in Wikipedia</a></li>
Chris@49 8772 <li><a href="http://mathworld.wolfram.com/SingularValueDecomposition.html">singular value decomposition in MathWorld</a></li>
Chris@49 8773 </ul>
Chris@49 8774 </li>
Chris@49 8775 </ul>
Chris@49 8776 <br>
Chris@49 8777 <hr class="greyline">
Chris@49 8778 <br>
Chris@49 8779
Chris@49 8780 <a name="syl"></a>
Chris@49 8781 <b>X = syl(A, B, C)</b>
Chris@49 8782 <br><b>syl(X, A, B, C)</b>
Chris@49 8783 <ul>
Chris@49 8784 <li>Solve the Sylvester equation, ie., <i>AX + XB + C = 0</i>, where <i>X</i> is unknown.</li>
Chris@49 8785 <br>
Chris@49 8786 <li>Matrices <i>A</i>, <i>B</i> and <i>C</i> must be square sized.</li>
Chris@49 8787 <br>
Chris@49 8788 <li>
Chris@49 8789 If no solution is found, <i>X</i> is reset and:
Chris@49 8790 <ul>
Chris@49 8791 <li><i>syl(A,B,C)</i> throws a <i>std::runtime_error</i> exception</li>
Chris@49 8792 <li><i>svd(X,A,B,C)</i> returns a bool set to <i>false</i></li>
Chris@49 8793 </ul>
Chris@49 8794 </li>
Chris@49 8795 <br>
Chris@49 8796 <li>
Chris@49 8797 Examples:
Chris@49 8798 <ul>
Chris@49 8799 <pre>
Chris@49 8800 mat A = randu&lt;mat&gt;(5,5);
Chris@49 8801 mat B = randu&lt;mat&gt;(5,5);
Chris@49 8802 mat C = randu&lt;mat&gt;(5,5);
Chris@49 8803
Chris@49 8804 mat X1 = syl(A, B, C);
Chris@49 8805
Chris@49 8806 mat X2;
Chris@49 8807 syl(X2, A, B, C);
Chris@49 8808 </pre>
Chris@49 8809 </ul>
Chris@49 8810 </li>
Chris@49 8811 <br>
Chris@49 8812 <li>
Chris@49 8813 See also:
Chris@49 8814 <ul>
Chris@49 8815 <li><a href="#solve">solve()</a></li>
Chris@49 8816 <li><a href="http://en.wikipedia.org/wiki/Sylvester_equation">Sylvester equation in Wikipedia</a></li>
Chris@49 8817 </ul>
Chris@49 8818 </li>
Chris@49 8819 <br>
Chris@49 8820 </ul>
Chris@49 8821 <hr class="greyline">
Chris@49 8822
Chris@49 8823
Chris@49 8824 <hr class="greyline">
Chris@49 8825 <br>
Chris@49 8826 <br>
Chris@49 8827 <font size=+1><b>Miscellaneous</b></font>
Chris@49 8828 <br>
Chris@49 8829 <br>
Chris@49 8830 <hr class="greyline">
Chris@49 8831 <br>
Chris@49 8832
Chris@49 8833 <a name="is_finite_standalone"></a>
Chris@49 8834 <b>is_finite(X)</b>
Chris@49 8835 <ul>
Chris@49 8836 <li>
Chris@49 8837 Returns <i>true</i> if all elements in <i>X</i> are finite
Chris@49 8838 </li>
Chris@49 8839 <br>
Chris@49 8840 <li>
Chris@49 8841 Returns <i>false</i> if at least one element in <i>X</i> is non-finite (&plusmn;infinity or NaN)
Chris@49 8842 </li>
Chris@49 8843 <br>
Chris@49 8844 <li>
Chris@49 8845 <i>X</i> can be a scalar (eg. <i>double</i>), vector, matrix or cube
Chris@49 8846 </li>
Chris@49 8847 <br>
Chris@49 8848 <li>
Chris@49 8849 Examples:
Chris@49 8850 <ul>
Chris@49 8851 <pre>
Chris@49 8852 mat A = randu&lt;mat&gt;(5,5);
Chris@49 8853 mat B = randu&lt;mat&gt;(5,5);
Chris@49 8854
Chris@49 8855 B(1,1) = datum::nan;
Chris@49 8856
Chris@49 8857 cout &lt;&lt; is_finite(A) &lt;&lt; endl;
Chris@49 8858 cout &lt;&lt; is_finite(B) &lt;&lt; endl;
Chris@49 8859
Chris@49 8860 cout &lt;&lt; is_finite( 0.123456789 ) &lt;&lt; endl;
Chris@49 8861 cout &lt;&lt; is_finite( datum::nan ) &lt;&lt; endl;
Chris@49 8862 cout &lt;&lt; is_finite( datum::inf ) &lt;&lt; endl;
Chris@49 8863 </pre>
Chris@49 8864 </ul>
Chris@49 8865 </li>
Chris@49 8866 <br>
Chris@49 8867 <li>
Chris@49 8868 See also:
Chris@49 8869 <ul>
Chris@49 8870 <li><a href="#constants">datum::nan</a></li>
Chris@49 8871 <li><a href="#constants">datum::inf</a></li>
Chris@49 8872 <li><a href="#is_finite">.is_finite()</a> (member function of <i>Mat</i> and <i>Cube</i>)</li>
Chris@49 8873 </ul>
Chris@49 8874 </li>
Chris@49 8875 <br>
Chris@49 8876 </ul>
Chris@49 8877 <hr class="greyline"><br>
Chris@49 8878
Chris@49 8879 <a name="logging"></a>
Chris@49 8880 <b>logging of warnings and errors</b>
Chris@49 8881 <br>
Chris@49 8882 <br>
Chris@49 8883 <b>set_stream_err1(user_stream)</b><br>
Chris@49 8884 <b>set_stream_err2(user_stream)</b><br>
Chris@49 8885 <br>
Chris@49 8886 <b>std::ostream&amp; x = get_stream_err1()</b>
Chris@49 8887 <br>
Chris@49 8888 <b>std::ostream&amp; x = get_stream_err2()</b>
Chris@49 8889 <br>
Chris@49 8890 <ul>
Chris@49 8891 <li>
Chris@49 8892 By default, Armadillo prints warnings and messages associated with <i>std::logic_error</i> and <i>std::runtime_error</i> exceptions to the <i>std::cout</i> stream
Chris@49 8893 </li>
Chris@49 8894 <br>
Chris@49 8895 <li><b>set_stream_err1()</b>: change the stream for messages associated with <i>std::logic_error</i> exceptions (eg. out of bounds accesses)</li>
Chris@49 8896 <br>
Chris@49 8897 <li><b>set_stream_err2()</b>: change the stream for warnings and messages associated with <i>std::runtime_error</i> exceptions (eg. failed decompositions)</li>
Chris@49 8898 <br>
Chris@49 8899 <li><b>get_stream_err1()</b>: get a reference to the stream for messages associated with <i>std::logic_error</i> exceptions</li>
Chris@49 8900 <br>
Chris@49 8901 <li><b>get_stream_err2()</b>: get a reference to the stream for warnings and messages associated with <i>std::runtime_error</i> exceptions</li>
Chris@49 8902 <br>
Chris@49 8903 <li>
Chris@49 8904 Examples:
Chris@49 8905 <ul>
Chris@49 8906 <pre>
Chris@49 8907 // print "hello" to the current err1 stream
Chris@49 8908 get_stream_err1() &lt;&lt; "hello" &lt;&lt; endl;
Chris@49 8909
Chris@49 8910 // change the err2 stream to be a file
Chris@49 8911 ofstream f("my_log.txt");
Chris@49 8912 set_stream_err2(f);
Chris@49 8913
Chris@49 8914 // trying to invert a singular matrix
Chris@49 8915 // will print a message to the err2 stream
Chris@49 8916 // and throw an exception
Chris@49 8917 mat X = zeros&lt;mat&gt;(5,5);
Chris@49 8918 mat Y = inv(X);
Chris@49 8919
Chris@49 8920 // disable messages being printed to the err2 stream
Chris@49 8921 std::ostream nullstream(0);
Chris@49 8922 set_stream_err2(nullstream);
Chris@49 8923 </pre>
Chris@49 8924 </ul>
Chris@49 8925 </li>
Chris@49 8926 <br>
Chris@49 8927 <li>
Chris@49 8928 <b>Caveat</b>: set_stream_err1() and set_stream_err2() will not change the stream used by .print()
Chris@49 8929 </li>
Chris@49 8930 <br>
Chris@49 8931 <li>
Chris@49 8932 See also:
Chris@49 8933 <ul>
Chris@49 8934 <li><a href="#print">.print()</a></li>
Chris@49 8935 <li><a href="http://cplusplus.com/reference/iostream/cout/">std::cout</a></li>
Chris@49 8936 <li><a href="http://cplusplus.com/reference/iostream/ostream/">std::ostream</a></li>
Chris@49 8937 <li><a href="http://cplusplus.com/reference/std/stdexcept/logic_error/">std::logic_error</a></li>
Chris@49 8938 <li><a href="http://cplusplus.com/reference/std/stdexcept/runtime_error/">std::runtime_error</a></li>
Chris@49 8939 <li><a href="http://cplusplus.com/doc/tutorial/exceptions/">tutorial on exceptions</a></li>
Chris@49 8940 </ul>
Chris@49 8941 </li>
Chris@49 8942 <br>
Chris@49 8943 </ul>
Chris@49 8944 <hr class="greyline"><br>
Chris@49 8945
Chris@49 8946
Chris@49 8947
Chris@49 8948 <a name="constants"></a>
Chris@49 8949 <b>various constants (pi, inf, speed of light, ...)</b>
Chris@49 8950 <br>
Chris@49 8951 <ul>
Chris@49 8952 <li>
Chris@49 8953 Collection of math and fundamental physical constants
Chris@49 8954 </li>
Chris@49 8955 <br>
Chris@49 8956 <li>
Chris@49 8957 Physical constants were mainly taken from
Chris@49 8958 <a href="http://physics.nist.gov/cuu/Constants">NIST</a>
Chris@49 8959 and some from
Chris@49 8960 <a href="http://www.wolframalpha.com">WolframAlpha</a>
Chris@49 8961 on 2009-06-23;
Chris@49 8962 constants from NIST are in turn sourced from the <a href="http://physics.nist.gov/cuu/Constants/papers.html">2006 CODATA values</a>
Chris@49 8963 </li>
Chris@49 8964 <br>
Chris@49 8965 <li>
Chris@49 8966 The constants are stored in the <i>Datum&lt;type&gt;</i> class,
Chris@49 8967 where <i>type</i> is either <i>float</i> or <i>double</i>
Chris@49 8968 </li>
Chris@49 8969 <br>
Chris@49 8970 <li>
Chris@49 8971 For convenience,
Chris@49 8972 <i>Datum&lt;double&gt;</i> has been typedefed as <i>datum</i>
Chris@49 8973 while
Chris@49 8974 <i>Datum&lt;float&gt;</i> has been typedefed as <i>fdatum</i>
Chris@49 8975 </li>
Chris@49 8976 <br>
Chris@49 8977 <li>
Chris@49 8978 In previous versions of Armadillo (eg. 2.x), the constants are accessed via static functions in <i>math</i> and <i>phy</i> classes, eg. <i>math::pi()</i>;
Chris@49 8979 for compatibility, these classes are still available in version 3.x, but are not explicitly documented
Chris@49 8980 </li>
Chris@49 8981 <br>
Chris@49 8982 <li>
Chris@49 8983 Meaning of the constants:
Chris@49 8984 <br>
Chris@49 8985 <br>
Chris@49 8986 <ul>
Chris@49 8987 <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
Chris@49 8988 <tbody>
Chris@49 8989 <tr>
Chris@49 8990 <td style="vertical-align: top;">
Chris@49 8991 datum::pi
Chris@49 8992 </td>
Chris@49 8993 <td style="vertical-align: top;">
Chris@49 8994 &nbsp;
Chris@49 8995 </td>
Chris@49 8996 <td style="vertical-align: top;">
Chris@49 8997 &pi;, the ratio of any circle's circumference to its diameter
Chris@49 8998 </td>
Chris@49 8999 </tr>
Chris@49 9000 <tr>
Chris@49 9001 <td style="vertical-align: top;">
Chris@49 9002 datum::inf
Chris@49 9003 </td>
Chris@49 9004 <td style="vertical-align: top;">
Chris@49 9005 &nbsp;
Chris@49 9006 </td>
Chris@49 9007 <td style="vertical-align: top;">
Chris@49 9008 infinity
Chris@49 9009 </td>
Chris@49 9010 </tr>
Chris@49 9011 <tr>
Chris@49 9012 <td style="vertical-align: top;">
Chris@49 9013 datum::nan
Chris@49 9014 </td>
Chris@49 9015 <td style="vertical-align: top;">
Chris@49 9016 &nbsp;
Chris@49 9017 </td>
Chris@49 9018 <td style="vertical-align: top;">
Chris@49 9019 &ldquo;not a number&rdquo; (NaN); <b>caveat:</b> NaN is not equal to anything, even itself
Chris@49 9020 </td>
Chris@49 9021 </tr>
Chris@49 9022 <tr>
Chris@49 9023 <td style="vertical-align: top;">
Chris@49 9024 datum::e
Chris@49 9025 </td>
Chris@49 9026 <td style="vertical-align: top;">
Chris@49 9027 &nbsp;
Chris@49 9028 </td>
Chris@49 9029 <td style="vertical-align: top;">
Chris@49 9030 base of the natural logarithm
Chris@49 9031 </td>
Chris@49 9032 </tr>
Chris@49 9033 <tr>
Chris@49 9034 <td style="vertical-align: top;">
Chris@49 9035 datum::sqrt2
Chris@49 9036 </td>
Chris@49 9037 <td style="vertical-align: top;">
Chris@49 9038 &nbsp;
Chris@49 9039 </td>
Chris@49 9040 <td style="vertical-align: top;">
Chris@49 9041 square root of 2
Chris@49 9042 </td>
Chris@49 9043 </tr>
Chris@49 9044 <tr>
Chris@49 9045 <td style="vertical-align: top;">
Chris@49 9046 datum::eps
Chris@49 9047 </td>
Chris@49 9048 <td style="vertical-align: top;">
Chris@49 9049 &nbsp;
Chris@49 9050 </td>
Chris@49 9051 <td style="vertical-align: top;">
Chris@49 9052 the difference between 1 and the least value greater than 1 that is representable (type and machine dependant)
Chris@49 9053 </td>
Chris@49 9054 </tr>
Chris@49 9055 <tr>
Chris@49 9056 <td style="vertical-align: top;">
Chris@49 9057 datum::log_min
Chris@49 9058 </td>
Chris@49 9059 <td style="vertical-align: top;">
Chris@49 9060 &nbsp;
Chris@49 9061 </td>
Chris@49 9062 <td style="vertical-align: top;">
Chris@49 9063 log of minimum non-zero value (type and machine dependant)
Chris@49 9064 </td>
Chris@49 9065 </tr>
Chris@49 9066 <tr>
Chris@49 9067 <td style="vertical-align: top;">
Chris@49 9068 datum::log_max
Chris@49 9069 </td>
Chris@49 9070 <td style="vertical-align: top;">
Chris@49 9071 &nbsp;
Chris@49 9072 </td>
Chris@49 9073 <td style="vertical-align: top;">
Chris@49 9074 log of maximum value (type and machine dependant)
Chris@49 9075 </td>
Chris@49 9076 </tr>
Chris@49 9077 <tr>
Chris@49 9078 <td style="vertical-align: top;">
Chris@49 9079 datum::euler
Chris@49 9080 </td>
Chris@49 9081 <td style="vertical-align: top;">
Chris@49 9082 &nbsp;
Chris@49 9083 </td>
Chris@49 9084 <td style="vertical-align: top;">
Chris@49 9085 Euler's constant, aka Euler-Mascheroni constant
Chris@49 9086 </td>
Chris@49 9087 </tr>
Chris@49 9088 <tr>
Chris@49 9089 <td style="vertical-align: top;">
Chris@49 9090 datum::gratio
Chris@49 9091 </td>
Chris@49 9092 <td style="vertical-align: top;">
Chris@49 9093 &nbsp;
Chris@49 9094 </td>
Chris@49 9095 <td style="vertical-align: top;">
Chris@49 9096 golden ratio
Chris@49 9097 </td>
Chris@49 9098 </tr>
Chris@49 9099 <tr>
Chris@49 9100 <td style="vertical-align: top;">
Chris@49 9101 datum::m_u
Chris@49 9102 </td>
Chris@49 9103 <td style="vertical-align: top;">
Chris@49 9104 &nbsp;
Chris@49 9105 </td>
Chris@49 9106 <td style="vertical-align: top;">
Chris@49 9107 atomic mass constant (in kg)
Chris@49 9108 </td>
Chris@49 9109 </tr>
Chris@49 9110 <tr>
Chris@49 9111 <td style="vertical-align: top;">
Chris@49 9112 datum::N_A
Chris@49 9113 </td>
Chris@49 9114 <td style="vertical-align: top;">
Chris@49 9115 &nbsp;
Chris@49 9116 </td>
Chris@49 9117 <td style="vertical-align: top;">
Chris@49 9118 Avogadro constant
Chris@49 9119 </td>
Chris@49 9120 </tr>
Chris@49 9121 <tr>
Chris@49 9122 <td style="vertical-align: top;">
Chris@49 9123 datum::k
Chris@49 9124 </td>
Chris@49 9125 <td style="vertical-align: top;">
Chris@49 9126 &nbsp;
Chris@49 9127 </td>
Chris@49 9128 <td style="vertical-align: top;">
Chris@49 9129 Boltzmann constant (in joules per kelvin)
Chris@49 9130 </td>
Chris@49 9131 </tr>
Chris@49 9132 <tr>
Chris@49 9133 <td style="vertical-align: top;">
Chris@49 9134 datum::k_evk
Chris@49 9135 </td>
Chris@49 9136 <td style="vertical-align: top;">
Chris@49 9137 &nbsp;
Chris@49 9138 </td>
Chris@49 9139 <td style="vertical-align: top;">
Chris@49 9140 Boltzmann constant (in eV/K)
Chris@49 9141 </td>
Chris@49 9142 </tr>
Chris@49 9143 <tr>
Chris@49 9144 <td style="vertical-align: top;">
Chris@49 9145 datum::a_0
Chris@49 9146 </td>
Chris@49 9147 <td style="vertical-align: top;">
Chris@49 9148 &nbsp;
Chris@49 9149 </td>
Chris@49 9150 <td style="vertical-align: top;">
Chris@49 9151 Bohr radius (in meters)
Chris@49 9152 </td>
Chris@49 9153 </tr>
Chris@49 9154 <tr>
Chris@49 9155 <td style="vertical-align: top;">
Chris@49 9156 datum::mu_B
Chris@49 9157 </td>
Chris@49 9158 <td style="vertical-align: top;">
Chris@49 9159 &nbsp;
Chris@49 9160 </td>
Chris@49 9161 <td style="vertical-align: top;">
Chris@49 9162 Bohr magneton
Chris@49 9163 </td>
Chris@49 9164 </tr>
Chris@49 9165 <tr>
Chris@49 9166 <td style="vertical-align: top;">
Chris@49 9167 datum::Z_0
Chris@49 9168 </td>
Chris@49 9169 <td style="vertical-align: top;">
Chris@49 9170 &nbsp;
Chris@49 9171 </td>
Chris@49 9172 <td style="vertical-align: top;">
Chris@49 9173 characteristic impedance of vacuum (in ohms)
Chris@49 9174 </td>
Chris@49 9175 </tr>
Chris@49 9176 <tr>
Chris@49 9177 <td style="vertical-align: top;">
Chris@49 9178 datum::G_0
Chris@49 9179 </td>
Chris@49 9180 <td style="vertical-align: top;">
Chris@49 9181 &nbsp;
Chris@49 9182 </td>
Chris@49 9183 <td style="vertical-align: top;">
Chris@49 9184 conductance quantum (in siemens)
Chris@49 9185 </td>
Chris@49 9186 </tr>
Chris@49 9187 <tr>
Chris@49 9188 <td style="vertical-align: top;">
Chris@49 9189 datum::k_e
Chris@49 9190 </td>
Chris@49 9191 <td style="vertical-align: top;">
Chris@49 9192 &nbsp;
Chris@49 9193 </td>
Chris@49 9194 <td style="vertical-align: top;">
Chris@49 9195 Coulomb's constant (in meters per farad)
Chris@49 9196 </td>
Chris@49 9197 </tr>
Chris@49 9198 <tr>
Chris@49 9199 <td style="vertical-align: top;">
Chris@49 9200 datum::eps_0
Chris@49 9201 </td>
Chris@49 9202 <td style="vertical-align: top;">
Chris@49 9203 &nbsp;
Chris@49 9204 </td>
Chris@49 9205 <td style="vertical-align: top;">
Chris@49 9206 electric constant (in farads per meter)
Chris@49 9207 </td>
Chris@49 9208 </tr>
Chris@49 9209 <tr>
Chris@49 9210 <td style="vertical-align: top;">
Chris@49 9211 datum::m_e
Chris@49 9212 </td>
Chris@49 9213 <td style="vertical-align: top;">
Chris@49 9214 &nbsp;
Chris@49 9215 </td>
Chris@49 9216 <td style="vertical-align: top;">
Chris@49 9217 electron mass (in kg)
Chris@49 9218 </td>
Chris@49 9219 </tr>
Chris@49 9220 <tr>
Chris@49 9221 <td style="vertical-align: top;">
Chris@49 9222 datum::eV
Chris@49 9223 </td>
Chris@49 9224 <td style="vertical-align: top;">
Chris@49 9225 &nbsp;
Chris@49 9226 </td>
Chris@49 9227 <td style="vertical-align: top;">
Chris@49 9228 electron volt (in joules)
Chris@49 9229 </td>
Chris@49 9230 </tr>
Chris@49 9231 <tr>
Chris@49 9232 <td style="vertical-align: top;">
Chris@49 9233 datum::ec
Chris@49 9234 </td>
Chris@49 9235 <td style="vertical-align: top;">
Chris@49 9236 &nbsp;
Chris@49 9237 </td>
Chris@49 9238 <td style="vertical-align: top;">
Chris@49 9239 elementary charge (in coulombs)
Chris@49 9240 </td>
Chris@49 9241 </tr>
Chris@49 9242 <tr>
Chris@49 9243 <td style="vertical-align: top;">
Chris@49 9244 datum::F
Chris@49 9245 </td>
Chris@49 9246 <td style="vertical-align: top;">
Chris@49 9247 &nbsp;
Chris@49 9248 </td>
Chris@49 9249 <td style="vertical-align: top;">
Chris@49 9250 Faraday constant (in coulombs)
Chris@49 9251 </td>
Chris@49 9252 </tr>
Chris@49 9253 <tr>
Chris@49 9254 <td style="vertical-align: top;">
Chris@49 9255 datum::alpha
Chris@49 9256 </td>
Chris@49 9257 <td style="vertical-align: top;">
Chris@49 9258 &nbsp;
Chris@49 9259 </td>
Chris@49 9260 <td style="vertical-align: top;">
Chris@49 9261 fine-structure constant
Chris@49 9262 </td>
Chris@49 9263 </tr>
Chris@49 9264 <tr>
Chris@49 9265 <td style="vertical-align: top;">
Chris@49 9266 datum::alpha_inv
Chris@49 9267 </td>
Chris@49 9268 <td style="vertical-align: top;">
Chris@49 9269 &nbsp;
Chris@49 9270 </td>
Chris@49 9271 <td style="vertical-align: top;">
Chris@49 9272 inverse fine-structure constant
Chris@49 9273 </td>
Chris@49 9274 </tr>
Chris@49 9275 <tr>
Chris@49 9276 <td style="vertical-align: top;">
Chris@49 9277 datum::K_J
Chris@49 9278 </td>
Chris@49 9279 <td style="vertical-align: top;">
Chris@49 9280 &nbsp;
Chris@49 9281 </td>
Chris@49 9282 <td style="vertical-align: top;">
Chris@49 9283 Josephson constant
Chris@49 9284 </td>
Chris@49 9285 </tr>
Chris@49 9286 <tr>
Chris@49 9287 <td style="vertical-align: top;">
Chris@49 9288 datum::mu_0
Chris@49 9289 </td>
Chris@49 9290 <td style="vertical-align: top;">
Chris@49 9291 &nbsp;
Chris@49 9292 </td>
Chris@49 9293 <td style="vertical-align: top;">
Chris@49 9294 magnetic constant (in henries per meter)
Chris@49 9295 </td>
Chris@49 9296 </tr>
Chris@49 9297 <tr>
Chris@49 9298 <td style="vertical-align: top;">
Chris@49 9299 datum::phi_0
Chris@49 9300 </td>
Chris@49 9301 <td style="vertical-align: top;">
Chris@49 9302 &nbsp;
Chris@49 9303 </td>
Chris@49 9304 <td style="vertical-align: top;">
Chris@49 9305 magnetic flux quantum (in webers)
Chris@49 9306 </td>
Chris@49 9307 </tr>
Chris@49 9308 <tr>
Chris@49 9309 <td style="vertical-align: top;">
Chris@49 9310 datum::R
Chris@49 9311 </td>
Chris@49 9312 <td style="vertical-align: top;">
Chris@49 9313 &nbsp;
Chris@49 9314 </td>
Chris@49 9315 <td style="vertical-align: top;">
Chris@49 9316 molar gas constant (in joules per mole kelvin)
Chris@49 9317 </td>
Chris@49 9318 </tr>
Chris@49 9319 <tr>
Chris@49 9320 <td style="vertical-align: top;">
Chris@49 9321 datum::G
Chris@49 9322 </td>
Chris@49 9323 <td style="vertical-align: top;">
Chris@49 9324 &nbsp;
Chris@49 9325 </td>
Chris@49 9326 <td style="vertical-align: top;">
Chris@49 9327 Newtonian constant of gravitation (in newton square meters per kilogram squared)
Chris@49 9328 </td>
Chris@49 9329 </tr>
Chris@49 9330 <tr>
Chris@49 9331 <td style="vertical-align: top;">
Chris@49 9332 datum::h
Chris@49 9333 </td>
Chris@49 9334 <td style="vertical-align: top;">
Chris@49 9335 &nbsp;
Chris@49 9336 </td>
Chris@49 9337 <td style="vertical-align: top;">
Chris@49 9338 Planck constant (in joule seconds)
Chris@49 9339 </td>
Chris@49 9340 </tr>
Chris@49 9341 <tr>
Chris@49 9342 <td style="vertical-align: top;">
Chris@49 9343 datum::h_bar
Chris@49 9344 </td>
Chris@49 9345 <td style="vertical-align: top;">
Chris@49 9346 &nbsp;
Chris@49 9347 </td>
Chris@49 9348 <td style="vertical-align: top;">
Chris@49 9349 Planck constant over 2 pi, aka reduced Planck constant (in joule seconds)
Chris@49 9350 </td>
Chris@49 9351 </tr>
Chris@49 9352 <tr>
Chris@49 9353 <td style="vertical-align: top;">
Chris@49 9354 datum::m_p
Chris@49 9355 </td>
Chris@49 9356 <td style="vertical-align: top;">
Chris@49 9357 &nbsp;
Chris@49 9358 </td>
Chris@49 9359 <td style="vertical-align: top;">
Chris@49 9360 proton mass (in kg)
Chris@49 9361 </td>
Chris@49 9362 </tr>
Chris@49 9363 <tr>
Chris@49 9364 <td style="vertical-align: top;">
Chris@49 9365 datum::R_inf
Chris@49 9366 </td>
Chris@49 9367 <td style="vertical-align: top;">
Chris@49 9368 &nbsp;
Chris@49 9369 </td>
Chris@49 9370 <td style="vertical-align: top;">
Chris@49 9371 Rydberg constant (in reciprocal meters)
Chris@49 9372 </td>
Chris@49 9373 </tr>
Chris@49 9374 <tr>
Chris@49 9375 <td style="vertical-align: top;">
Chris@49 9376 datum::c_0
Chris@49 9377 </td>
Chris@49 9378 <td style="vertical-align: top;">
Chris@49 9379 &nbsp;
Chris@49 9380 </td>
Chris@49 9381 <td style="vertical-align: top;">
Chris@49 9382 speed of light in vacuum (in meters per second)
Chris@49 9383 </td>
Chris@49 9384 </tr>
Chris@49 9385 <tr>
Chris@49 9386 <td style="vertical-align: top;">
Chris@49 9387 datum::sigma
Chris@49 9388 </td>
Chris@49 9389 <td style="vertical-align: top;">
Chris@49 9390 &nbsp;
Chris@49 9391 </td>
Chris@49 9392 <td style="vertical-align: top;">
Chris@49 9393 Stefan-Boltzmann constant
Chris@49 9394 </td>
Chris@49 9395 </tr>
Chris@49 9396 <tr>
Chris@49 9397 <td style="vertical-align: top;">
Chris@49 9398 datum::R_k
Chris@49 9399 </td>
Chris@49 9400 <td style="vertical-align: top;">
Chris@49 9401 &nbsp;
Chris@49 9402 </td>
Chris@49 9403 <td style="vertical-align: top;">
Chris@49 9404 von Klitzing constant (in ohms)
Chris@49 9405 </td>
Chris@49 9406 </tr>
Chris@49 9407 <tr>
Chris@49 9408 <td style="vertical-align: top;">
Chris@49 9409 datum::b
Chris@49 9410 </td>
Chris@49 9411 <td style="vertical-align: top;">
Chris@49 9412 &nbsp;
Chris@49 9413 </td>
Chris@49 9414 <td style="vertical-align: top;">
Chris@49 9415 Wien wavelength displacement law constant
Chris@49 9416 </td>
Chris@49 9417 </tr>
Chris@49 9418 </tbody>
Chris@49 9419 </table>
Chris@49 9420 </ul>
Chris@49 9421 </li>
Chris@49 9422 <br>
Chris@49 9423 <li>
Chris@49 9424 <b>Caveat:</b>
Chris@49 9425 datum::nan is not equal to anything, even itself;
Chris@49 9426 if you wish to check whether a given number <i>x</i> is finite,
Chris@49 9427 use <a href="#is_finite_standalone">is_finite</a>(<i>x</i>).
Chris@49 9428 </li>
Chris@49 9429 <br>
Chris@49 9430 <li>
Chris@49 9431 Examples:
Chris@49 9432 <ul>
Chris@49 9433 <pre>
Chris@49 9434 cout &lt;&lt; "2.0 * pi = " &lt;&lt; 2.0 * datum::pi &lt;&lt; endl;
Chris@49 9435
Chris@49 9436 cout &lt;&lt; "speed of light = " &lt;&lt; datum::c_0 &lt;&lt; endl;
Chris@49 9437
Chris@49 9438 cout &lt;&lt; "log_max for floats = ";
Chris@49 9439 cout &lt;&lt; fdatum::log_max &lt;&lt; endl;
Chris@49 9440
Chris@49 9441 cout &lt;&lt; "log_max for doubles = ";
Chris@49 9442 cout &lt;&lt; datum::log_max &lt;&lt; endl;
Chris@49 9443 </pre>
Chris@49 9444 </ul>
Chris@49 9445 </li>
Chris@49 9446 <li>
Chris@49 9447 See also:
Chris@49 9448 <ul>
Chris@49 9449 <li><a href="#is_finite_standalone">is_finite()</a></li>
Chris@49 9450 <li><a href="http://en.wikipedia.org/wiki/NaN">NaN</a> in Wikipedia</li>
Chris@49 9451 <li><a href="http://en.wikipedia.org/wiki/Physical_constant">physical constant</a> in Wikipedia</li>
Chris@49 9452 <li><a href="http://cplusplus.com/reference/std/limits/numeric_limits/">std::numeric_limits</a></li>
Chris@49 9453 </ul>
Chris@49 9454 </li>
Chris@49 9455 </ul>
Chris@49 9456 <br>
Chris@49 9457 <hr class="greyline"><br>
Chris@49 9458
Chris@49 9459 <!--
Chris@49 9460 <a name="log_add"></a>
Chris@49 9461 <b>log_add(log_a, log_b)</b>
Chris@49 9462 <ul>
Chris@49 9463 <li>
Chris@49 9464 Safe replacement for log(exp(log_a) + exp(log_b))
Chris@49 9465 </li>
Chris@49 9466 <br>
Chris@49 9467 <li>
Chris@49 9468 Usage:
Chris@49 9469 <ul>
Chris@49 9470 <li>
Chris@49 9471 <i>scalar_type</i> log_c = log_add(log_a, log_b)
Chris@49 9472 </li>
Chris@49 9473 <li>
Chris@49 9474 <i>scalar_type</i> is either <i>float</i> or <i>double</i>
Chris@49 9475 </li>
Chris@49 9476 <li>
Chris@49 9477 log_a, log_b and log_c must have the same type
Chris@49 9478 </li>
Chris@49 9479 </ul>
Chris@49 9480 </li>
Chris@49 9481 </ul>
Chris@49 9482 <br>
Chris@49 9483 <hr class="greyline"><br>
Chris@49 9484 -->
Chris@49 9485
Chris@49 9486 <a name="uword"></a>
Chris@49 9487 <b>uword</b>, <b>sword</b>
Chris@49 9488 <ul>
Chris@49 9489 <li>
Chris@49 9490 <i>uword</i> is a typedef for an unsigned integer with a minimum width of 32 bits; if <i>ARMA_64BIT_WORD</i> is enabled, the minimum width is 64 bits
Chris@49 9491 </li>
Chris@49 9492 <br>
Chris@49 9493 <li>
Chris@49 9494 <i>sword</i> is a typedef for a signed integer with a minimum width of 32 bits; if <i>ARMA_64BIT_WORD</i> is enabled, the minimum width is 64 bits
Chris@49 9495 </li>
Chris@49 9496 <br>
Chris@49 9497 <li>
Chris@49 9498 <a href="#config_hpp_arma_64bit_word"><i>ARMA_64BIT_WORD</i></a> can be enabled via editing <i>include/armadillo_bits/config.hpp</i>
Chris@49 9499 </li>
Chris@49 9500 <br>
Chris@49 9501 <li>See also:
Chris@49 9502 <ul>
Chris@49 9503 <li><a href="http://cplusplus.com/doc/tutorial/variables/">C++ variable types</a></li>
Chris@49 9504 <li><a href="http://www.cplusplus.com/doc/tutorial/other_data_types/">explanation of <i>typedef</i></a></li>
Chris@49 9505 <li><a href="#Mat">imat &amp; umat</a> matrix types
Chris@49 9506 <li><a href="#Col">ivec &amp; uvec</a> vector types
Chris@49 9507 </ul>
Chris@49 9508 </li>
Chris@49 9509 <br>
Chris@49 9510 </ul>
Chris@49 9511 <hr class="greyline"><br>
Chris@49 9512
Chris@49 9513 <a name="cx_float_double"></a>
Chris@49 9514 <b>cx_float</b>, <b>cx_double</b>
Chris@49 9515 <ul>
Chris@49 9516 <li>
Chris@49 9517 cx_float is a typedef for <i>std::complex&lt;float&gt;</i>
Chris@49 9518 </li>
Chris@49 9519 <br>
Chris@49 9520 <li>
Chris@49 9521 cx_double is a typedef for <i>std::complex&lt;double&gt;</i>
Chris@49 9522 </li>
Chris@49 9523 <br>
Chris@49 9524 <li>See also:
Chris@49 9525 <ul>
Chris@49 9526 <li><a href="http://cplusplus.com/reference/std/complex/">complex numbers in the standard C++ library</a></li>
Chris@49 9527 <li><a href="http://www.cplusplus.com/doc/tutorial/other_data_types/">explanation of <i>typedef</i></a></li>
Chris@49 9528 <li><a href="#Mat">cx_mat</a> matrix type
Chris@49 9529 <li><a href="#Col">cx_vec</a> vector type
Chris@49 9530 </ul>
Chris@49 9531 </li>
Chris@49 9532 <br>
Chris@49 9533 </ul>
Chris@49 9534
Chris@49 9535 <a name="syntax"></a>
Chris@49 9536 <hr class="greyline">
Chris@49 9537 <br>
Chris@49 9538 <b>
Chris@49 9539 Examples of Matlab/Octave syntax and conceptually corresponding Armadillo syntax
Chris@49 9540 </b>
Chris@49 9541 <br>
Chris@49 9542 <br>
Chris@49 9543 <ul>
Chris@49 9544 <table style="text-align: left;" border="0" cellpadding="2" cellspacing="2">
Chris@49 9545 <tbody>
Chris@49 9546 <tr>
Chris@49 9547 <td style="vertical-align: top;">
Chris@49 9548 <b>Matlab/Octave</b>
Chris@49 9549 </td>
Chris@49 9550 <td style="vertical-align: top;">
Chris@49 9551 &nbsp;
Chris@49 9552 </td>
Chris@49 9553 <td style="vertical-align: top;">
Chris@49 9554 <b>Armadillo</b>
Chris@49 9555 </td>
Chris@49 9556 <td style="vertical-align: top;">
Chris@49 9557 &nbsp;
Chris@49 9558 </td>
Chris@49 9559 <td style="vertical-align: top;">
Chris@49 9560 <b>Notes</b>
Chris@49 9561 </td>
Chris@49 9562 </tr>
Chris@49 9563 <tr>
Chris@49 9564 <td style="vertical-align: top;">
Chris@49 9565 &nbsp;
Chris@49 9566 </td>
Chris@49 9567 <td style="vertical-align: top;">
Chris@49 9568 &nbsp;
Chris@49 9569 </td>
Chris@49 9570 <td style="vertical-align: top;">
Chris@49 9571 &nbsp;
Chris@49 9572 </td>
Chris@49 9573 <td style="vertical-align: top;">
Chris@49 9574 &nbsp;
Chris@49 9575 </td>
Chris@49 9576 <td style="vertical-align: top;">
Chris@49 9577 &nbsp;
Chris@49 9578 </td>
Chris@49 9579 </tr>
Chris@49 9580 <tr>
Chris@49 9581 <td style="vertical-align: top;">
Chris@49 9582 A(1, 1)
Chris@49 9583 </td>
Chris@49 9584 <td style="vertical-align: top;">
Chris@49 9585 &nbsp;
Chris@49 9586 </td>
Chris@49 9587 <td style="vertical-align: top;">
Chris@49 9588 A(0, 0)
Chris@49 9589 </td>
Chris@49 9590 <td style="vertical-align: top;">
Chris@49 9591 &nbsp;
Chris@49 9592 </td>
Chris@49 9593 <td style="vertical-align: top;">
Chris@49 9594 indexing in Armadillo starts at 0
Chris@49 9595 </td>
Chris@49 9596 </tr>
Chris@49 9597 <tr>
Chris@49 9598 <td style="vertical-align: top;">
Chris@49 9599 A(k, k)
Chris@49 9600 </td>
Chris@49 9601 <td style="vertical-align: top;">
Chris@49 9602 &nbsp;
Chris@49 9603 </td>
Chris@49 9604 <td style="vertical-align: top;">
Chris@49 9605 A(k-1, k-1)
Chris@49 9606 </td>
Chris@49 9607 <td style="vertical-align: top;">
Chris@49 9608 &nbsp;
Chris@49 9609 </td>
Chris@49 9610 <td style="vertical-align: top;">
Chris@49 9611 &nbsp;
Chris@49 9612 </td>
Chris@49 9613 </tr>
Chris@49 9614 <tr>
Chris@49 9615 <td style="vertical-align: top;">
Chris@49 9616 &nbsp;
Chris@49 9617 </td>
Chris@49 9618 <td style="vertical-align: top;">
Chris@49 9619 &nbsp;
Chris@49 9620 </td>
Chris@49 9621 <td style="vertical-align: top;">
Chris@49 9622 &nbsp;
Chris@49 9623 </td>
Chris@49 9624 <td style="vertical-align: top;">
Chris@49 9625 &nbsp;
Chris@49 9626 </td>
Chris@49 9627 <td style="vertical-align: top;">
Chris@49 9628 &nbsp;
Chris@49 9629 </td>
Chris@49 9630 </tr>
Chris@49 9631 <tr>
Chris@49 9632 <td style="vertical-align: top;">
Chris@49 9633 size(A,1)
Chris@49 9634 </td>
Chris@49 9635 <td style="vertical-align: top;">
Chris@49 9636 &nbsp;
Chris@49 9637 </td>
Chris@49 9638 <td style="vertical-align: top;">
Chris@49 9639 A<a href="#attributes">.n_rows</a>
Chris@49 9640 </td>
Chris@49 9641 <td style="vertical-align: top;">
Chris@49 9642 &nbsp;
Chris@49 9643 </td>
Chris@49 9644 <td style="vertical-align: top;">
Chris@49 9645 read only
Chris@49 9646 </td>
Chris@49 9647 </tr>
Chris@49 9648 <tr>
Chris@49 9649 <td style="vertical-align: top;">
Chris@49 9650 size(A,2)
Chris@49 9651 </td>
Chris@49 9652 <td style="vertical-align: top;">
Chris@49 9653 &nbsp;
Chris@49 9654 </td>
Chris@49 9655 <td style="vertical-align: top;">
Chris@49 9656 A<a href="#attributes">.n_cols</a>
Chris@49 9657 </td>
Chris@49 9658 <td style="vertical-align: top;">
Chris@49 9659 &nbsp;
Chris@49 9660 </td>
Chris@49 9661 <td style="vertical-align: top;">
Chris@49 9662 &nbsp;
Chris@49 9663 </td>
Chris@49 9664 </tr>
Chris@49 9665 <tr>
Chris@49 9666 <td style="vertical-align: top;">
Chris@49 9667 size(Q,3)
Chris@49 9668 </td>
Chris@49 9669 <td style="vertical-align: top;">
Chris@49 9670 &nbsp;
Chris@49 9671 </td>
Chris@49 9672 <td style="vertical-align: top;">
Chris@49 9673 Q<a href="#attributes">.n_slices</a>
Chris@49 9674 </td>
Chris@49 9675 <td style="vertical-align: top;">
Chris@49 9676 &nbsp;
Chris@49 9677 </td>
Chris@49 9678 <td style="vertical-align: top;">
Chris@49 9679 Q is a <a href="#Cube">cube</a> (3D array)
Chris@49 9680 </td>
Chris@49 9681 </tr>
Chris@49 9682 <tr>
Chris@49 9683 <td style="vertical-align: top;">
Chris@49 9684 numel(A)
Chris@49 9685 </td>
Chris@49 9686 <td style="vertical-align: top;">
Chris@49 9687 &nbsp;
Chris@49 9688 </td>
Chris@49 9689 <td style="vertical-align: top;">
Chris@49 9690 A<a href="#attributes">.n_elem</a>
Chris@49 9691 </td>
Chris@49 9692 <td style="vertical-align: top;">
Chris@49 9693 &nbsp;
Chris@49 9694 </td>
Chris@49 9695 <td style="vertical-align: top;">
Chris@49 9696 &nbsp;
Chris@49 9697 </td>
Chris@49 9698 </tr>
Chris@49 9699 <tr>
Chris@49 9700 <td style="vertical-align: top;">
Chris@49 9701 &nbsp;
Chris@49 9702 </td>
Chris@49 9703 <td style="vertical-align: top;">
Chris@49 9704 &nbsp;
Chris@49 9705 </td>
Chris@49 9706 <td style="vertical-align: top;">
Chris@49 9707 &nbsp;
Chris@49 9708 </td>
Chris@49 9709 <td style="vertical-align: top;">
Chris@49 9710 &nbsp;
Chris@49 9711 </td>
Chris@49 9712 <td style="vertical-align: top;">
Chris@49 9713 &nbsp;
Chris@49 9714 </td>
Chris@49 9715 </tr>
Chris@49 9716 <tr>
Chris@49 9717 <td style="vertical-align: top;">
Chris@49 9718 A(:, k)
Chris@49 9719 </td>
Chris@49 9720 <td style="vertical-align: top;">
Chris@49 9721 &nbsp;
Chris@49 9722 </td>
Chris@49 9723 <td style="vertical-align: top;">
Chris@49 9724 A<a href="#submat">.col</a>(k)
Chris@49 9725 </td>
Chris@49 9726 <td style="vertical-align: top;">
Chris@49 9727 &nbsp;
Chris@49 9728 </td>
Chris@49 9729 <td style="vertical-align: top;">
Chris@49 9730 this is a conceptual example only;
Chris@49 9731 exact conversion from Matlab/Octave to Armadillo syntax
Chris@49 9732 will require taking into account that indexing starts at 0
Chris@49 9733 </td>
Chris@49 9734 </tr>
Chris@49 9735 <tr>
Chris@49 9736 <td style="vertical-align: top;">
Chris@49 9737 A(k, :)
Chris@49 9738 </td>
Chris@49 9739 <td style="vertical-align: top;">
Chris@49 9740 &nbsp;
Chris@49 9741 </td>
Chris@49 9742 <td style="vertical-align: top;">
Chris@49 9743 A<a href="#submat">.row</a>(k)
Chris@49 9744 </td>
Chris@49 9745 <td style="vertical-align: top;">
Chris@49 9746 &nbsp;
Chris@49 9747 </td>
Chris@49 9748 <td style="vertical-align: top;">
Chris@49 9749 &nbsp;
Chris@49 9750 </td>
Chris@49 9751 </tr>
Chris@49 9752 <tr>
Chris@49 9753 <td style="vertical-align: top;">
Chris@49 9754 A(:, p:q)
Chris@49 9755 </td>
Chris@49 9756 <td style="vertical-align: top;">
Chris@49 9757 &nbsp;
Chris@49 9758 </td>
Chris@49 9759 <td style="vertical-align: top;">
Chris@49 9760 A<a href="#submat">.cols</a>(p, q)
Chris@49 9761 </td>
Chris@49 9762 <td style="vertical-align: top;">
Chris@49 9763 &nbsp;
Chris@49 9764 </td>
Chris@49 9765 <td style="vertical-align: top;">
Chris@49 9766 &nbsp;
Chris@49 9767 </td>
Chris@49 9768 </tr>
Chris@49 9769 <tr>
Chris@49 9770 <td style="vertical-align: top;">
Chris@49 9771 A(p:q, :)
Chris@49 9772 </td>
Chris@49 9773 <td style="vertical-align: top;">
Chris@49 9774 &nbsp;
Chris@49 9775 </td>
Chris@49 9776 <td style="vertical-align: top;">
Chris@49 9777 A<a href="#submat">.rows</a>(p, q)
Chris@49 9778 </td>
Chris@49 9779 <td style="vertical-align: top;">
Chris@49 9780 &nbsp;
Chris@49 9781 </td>
Chris@49 9782 <td style="vertical-align: top;">
Chris@49 9783 &nbsp;
Chris@49 9784 </td>
Chris@49 9785 </tr>
Chris@49 9786 <tr>
Chris@49 9787 <td style="vertical-align: top;">
Chris@49 9788 &nbsp;
Chris@49 9789 </td>
Chris@49 9790 <td style="vertical-align: top;">
Chris@49 9791 &nbsp;
Chris@49 9792 </td>
Chris@49 9793 <td style="vertical-align: top;">
Chris@49 9794 &nbsp;
Chris@49 9795 </td>
Chris@49 9796 <td style="vertical-align: top;">
Chris@49 9797 &nbsp;
Chris@49 9798 </td>
Chris@49 9799 <td style="vertical-align: top;">
Chris@49 9800 &nbsp;
Chris@49 9801 </td>
Chris@49 9802 </tr>
Chris@49 9803 <tr>
Chris@49 9804 <td style="vertical-align: top;">
Chris@49 9805 A(p:q, r:s)
Chris@49 9806 </td>
Chris@49 9807 <td style="vertical-align: top;">
Chris@49 9808 &nbsp;
Chris@49 9809 </td>
Chris@49 9810 <td style="vertical-align: top;">
Chris@49 9811 <font size=-1>
Chris@49 9812 A<a href="#submat">.submat</a>(p, r, q, s)
Chris@49 9813 </font>
Chris@49 9814 </td>
Chris@49 9815 <td style="vertical-align: top;">
Chris@49 9816 &nbsp;
Chris@49 9817 </td>
Chris@49 9818 <td style="vertical-align: top;">
Chris@49 9819 <font size=-1>
Chris@49 9820 A.submat(first_row, first_col, last_row, last_col)
Chris@49 9821 </font>
Chris@49 9822 </td>
Chris@49 9823 </tr>
Chris@49 9824 <tr>
Chris@49 9825 <td style="vertical-align: top;">
Chris@49 9826 &nbsp;
Chris@49 9827 </td>
Chris@49 9828 <td style="vertical-align: top;">
Chris@49 9829 &nbsp;
Chris@49 9830 </td>
Chris@49 9831 <td style="vertical-align: top;">
Chris@49 9832 <font size=-1>
Chris@49 9833 or
Chris@49 9834 </font>
Chris@49 9835 </td>
Chris@49 9836 <td style="vertical-align: top;">
Chris@49 9837 &nbsp;
Chris@49 9838 </td>
Chris@49 9839 <td style="vertical-align: top;">
Chris@49 9840 &nbsp;
Chris@49 9841 </td>
Chris@49 9842 </tr>
Chris@49 9843 <tr>
Chris@49 9844 <td style="vertical-align: top;">
Chris@49 9845 &nbsp;
Chris@49 9846 </td>
Chris@49 9847 <td style="vertical-align: top;">
Chris@49 9848 &nbsp;
Chris@49 9849 </td>
Chris@49 9850 <td style="vertical-align: top;">
Chris@49 9851 <font size=-1>
Chris@49 9852 A(&nbsp;<a href="#submat">span</a>(p,q),&nbsp;<a href="#submat">span</a>(r,s)&nbsp;)
Chris@49 9853 </font>
Chris@49 9854 </td>
Chris@49 9855 <td style="vertical-align: top;">
Chris@49 9856 &nbsp;
Chris@49 9857 </td>
Chris@49 9858 <td style="vertical-align: top;">
Chris@49 9859 <font size=-1>
Chris@49 9860 A(&nbsp;span(first_row,&nbsp;last_row), span(first_col,&nbsp;last_col)&nbsp;)
Chris@49 9861 </font>
Chris@49 9862 </td>
Chris@49 9863 </tr>
Chris@49 9864 <tr>
Chris@49 9865 <td style="vertical-align: top;">
Chris@49 9866 &nbsp;
Chris@49 9867 </td>
Chris@49 9868 <td style="vertical-align: top;">
Chris@49 9869 &nbsp;
Chris@49 9870 </td>
Chris@49 9871 <td style="vertical-align: top;">
Chris@49 9872 &nbsp;
Chris@49 9873 </td>
Chris@49 9874 <td style="vertical-align: top;">
Chris@49 9875 &nbsp;
Chris@49 9876 </td>
Chris@49 9877 <td style="vertical-align: top;">
Chris@49 9878 &nbsp;
Chris@49 9879 </td>
Chris@49 9880 </tr>
Chris@49 9881 <tr>
Chris@49 9882 <td style="vertical-align: top;">
Chris@49 9883 Q(:, :, k)
Chris@49 9884 </td>
Chris@49 9885 <td style="vertical-align: top;">
Chris@49 9886 &nbsp;
Chris@49 9887 </td>
Chris@49 9888 <td style="vertical-align: top;">
Chris@49 9889 Q<a href="#subcube">.slice</a>(k)
Chris@49 9890 </td>
Chris@49 9891 <td style="vertical-align: top;">
Chris@49 9892 &nbsp;
Chris@49 9893 </td>
Chris@49 9894 <td style="vertical-align: top;">
Chris@49 9895 Q is a <a href="#Cube">cube</a> (3D array)
Chris@49 9896 </td>
Chris@49 9897 </tr>
Chris@49 9898 <tr>
Chris@49 9899 <td style="vertical-align: top;">
Chris@49 9900 Q(:, :, t:u)
Chris@49 9901 </td>
Chris@49 9902 <td style="vertical-align: top;">
Chris@49 9903 &nbsp;
Chris@49 9904 </td>
Chris@49 9905 <td style="vertical-align: top;">
Chris@49 9906 Q<a href="#subcube">.slices</a>(t, u)
Chris@49 9907 </td>
Chris@49 9908 <td style="vertical-align: top;">
Chris@49 9909 &nbsp;
Chris@49 9910 </td>
Chris@49 9911 <td style="vertical-align: top;">
Chris@49 9912 &nbsp;
Chris@49 9913 </td>
Chris@49 9914 </tr>
Chris@49 9915 <tr>
Chris@49 9916 <td style="vertical-align: top;">
Chris@49 9917 &nbsp;
Chris@49 9918 </td>
Chris@49 9919 <td style="vertical-align: top;">
Chris@49 9920 &nbsp;
Chris@49 9921 </td>
Chris@49 9922 <td style="vertical-align: top;">
Chris@49 9923 &nbsp;
Chris@49 9924 </td>
Chris@49 9925 <td style="vertical-align: top;">
Chris@49 9926 &nbsp;
Chris@49 9927 </td>
Chris@49 9928 <td style="vertical-align: top;">
Chris@49 9929 &nbsp;
Chris@49 9930 </td>
Chris@49 9931 </tr>
Chris@49 9932 <tr>
Chris@49 9933 <td style="vertical-align: top;">
Chris@49 9934 Q(p:q, r:s, t:u)
Chris@49 9935 </td>
Chris@49 9936 <td style="vertical-align: top;">
Chris@49 9937 &nbsp;
Chris@49 9938 </td>
Chris@49 9939 <td style="vertical-align: top;">
Chris@49 9940 <font size=-1>
Chris@49 9941 Q<a href="#subcube">.subcube</a>(p,&nbsp;r,&nbsp;t,&nbsp;q,&nbsp;s,&nbsp;u)
Chris@49 9942 </font>
Chris@49 9943 </td>
Chris@49 9944 <td style="vertical-align: top;">
Chris@49 9945 &nbsp;
Chris@49 9946 </td>
Chris@49 9947 <td style="vertical-align: top;">
Chris@49 9948 <font size=-1>
Chris@49 9949 .subcube(first_row, first_col, first_slice, last_row, last_col, last_slice)
Chris@49 9950 </font>
Chris@49 9951 </td>
Chris@49 9952 </tr>
Chris@49 9953 <tr>
Chris@49 9954 <td style="vertical-align: top;">
Chris@49 9955 &nbsp;
Chris@49 9956 </td>
Chris@49 9957 <td style="vertical-align: top;">
Chris@49 9958 &nbsp;
Chris@49 9959 </td>
Chris@49 9960 <td style="vertical-align: top;">
Chris@49 9961 <font size=-1>
Chris@49 9962 or
Chris@49 9963 </font>
Chris@49 9964 </td>
Chris@49 9965 <td style="vertical-align: top;">
Chris@49 9966 &nbsp;
Chris@49 9967 </td>
Chris@49 9968 <td style="vertical-align: top;">
Chris@49 9969 &nbsp;
Chris@49 9970 </td>
Chris@49 9971 </tr>
Chris@49 9972 <tr>
Chris@49 9973 <td style="vertical-align: top;">
Chris@49 9974 &nbsp;
Chris@49 9975 </td>
Chris@49 9976 <td style="vertical-align: top;">
Chris@49 9977 &nbsp;
Chris@49 9978 </td>
Chris@49 9979 <td style="vertical-align: top;">
Chris@49 9980 <font size=-1>
Chris@49 9981 Q(&nbsp;<a href="#subcube">span</a>(p,q),&nbsp;<a href="#subcube">span</a>(r,s),&nbsp;<a href="#subcube">span</a>(t,u)&nbsp;)
Chris@49 9982 </font>
Chris@49 9983 </td>
Chris@49 9984 <td style="vertical-align: top;">
Chris@49 9985 &nbsp;
Chris@49 9986 </td>
Chris@49 9987 <td style="vertical-align: top;">
Chris@49 9988 &nbsp;
Chris@49 9989 </td>
Chris@49 9990 </tr>
Chris@49 9991 <tr>
Chris@49 9992 <td style="vertical-align: top;">
Chris@49 9993 &nbsp;
Chris@49 9994 </td>
Chris@49 9995 <td style="vertical-align: top;">
Chris@49 9996 &nbsp;
Chris@49 9997 </td>
Chris@49 9998 <td style="vertical-align: top;">
Chris@49 9999 &nbsp;
Chris@49 10000 </td>
Chris@49 10001 <td style="vertical-align: top;">
Chris@49 10002 &nbsp;
Chris@49 10003 </td>
Chris@49 10004 <td style="vertical-align: top;">
Chris@49 10005 &nbsp;
Chris@49 10006 </td>
Chris@49 10007 </tr>
Chris@49 10008 <tr>
Chris@49 10009 <td style="vertical-align: top;">
Chris@49 10010 A'
Chris@49 10011 </td>
Chris@49 10012 <td style="vertical-align: top;">
Chris@49 10013 &nbsp;
Chris@49 10014 </td>
Chris@49 10015 <td style="vertical-align: top;">
Chris@49 10016 A<a href="#t_st_members">.t()</a> or <a href="#trans">trans</a>(A)
Chris@49 10017 </td>
Chris@49 10018 <td style="vertical-align: top;">
Chris@49 10019 &nbsp;
Chris@49 10020 </td>
Chris@49 10021 <td style="vertical-align: top;">
Chris@49 10022 matrix transpose / Hermitian transpose
Chris@49 10023 <br>
Chris@49 10024 (for complex matrices, the conjugate of each element is taken)
Chris@49 10025 </td>
Chris@49 10026 </tr>
Chris@49 10027 <tr>
Chris@49 10028 <td style="vertical-align: top;">
Chris@49 10029 A.'
Chris@49 10030 </td>
Chris@49 10031 <td style="vertical-align: top;">
Chris@49 10032 &nbsp;
Chris@49 10033 </td>
Chris@49 10034 <td style="vertical-align: top;">
Chris@49 10035 A<a href="#t_st_members">.st()</a> or <a href="#strans">strans</a>(A)
Chris@49 10036 </td>
Chris@49 10037 <td style="vertical-align: top;">
Chris@49 10038 &nbsp;
Chris@49 10039 </td>
Chris@49 10040 <td style="vertical-align: top;">
Chris@49 10041 simple matrix transpose
Chris@49 10042 <br>
Chris@49 10043 (for complex matrices, the conjugate of each element is not taken)
Chris@49 10044 </td>
Chris@49 10045 </tr>
Chris@49 10046 <tr>
Chris@49 10047 <td style="vertical-align: top;">
Chris@49 10048 &nbsp;
Chris@49 10049 </td>
Chris@49 10050 <td style="vertical-align: top;">
Chris@49 10051 &nbsp;
Chris@49 10052 </td>
Chris@49 10053 <td style="vertical-align: top;">
Chris@49 10054 &nbsp;
Chris@49 10055 </td>
Chris@49 10056 <td style="vertical-align: top;">
Chris@49 10057 &nbsp;
Chris@49 10058 </td>
Chris@49 10059 <td style="vertical-align: top;">
Chris@49 10060 &nbsp;
Chris@49 10061 </td>
Chris@49 10062 </tr>
Chris@49 10063 <tr>
Chris@49 10064 <td style="vertical-align: top;">
Chris@49 10065 A = zeros(size(A))
Chris@49 10066 </td>
Chris@49 10067 <td style="vertical-align: top;">
Chris@49 10068 &nbsp;
Chris@49 10069 </td>
Chris@49 10070 <td style="vertical-align: top;">
Chris@49 10071 A<a href="#zeros_member">.zeros()</a>
Chris@49 10072 </td>
Chris@49 10073 <td style="vertical-align: top;">
Chris@49 10074 &nbsp;
Chris@49 10075 </td>
Chris@49 10076 <td style="vertical-align: top;">
Chris@49 10077 &nbsp;
Chris@49 10078 </td>
Chris@49 10079 </tr>
Chris@49 10080 <tr>
Chris@49 10081 <td style="vertical-align: top;">
Chris@49 10082 A = ones(size(A))
Chris@49 10083 </td>
Chris@49 10084 <td style="vertical-align: top;">
Chris@49 10085 &nbsp;
Chris@49 10086 </td>
Chris@49 10087 <td style="vertical-align: top;">
Chris@49 10088 A.<a href="#ones_member">ones()</a>
Chris@49 10089 </td>
Chris@49 10090 <td style="vertical-align: top;">
Chris@49 10091 &nbsp;
Chris@49 10092 </td>
Chris@49 10093 <td style="vertical-align: top;">
Chris@49 10094 &nbsp;
Chris@49 10095 </td>
Chris@49 10096 </tr>
Chris@49 10097 <tr>
Chris@49 10098 <td style="vertical-align: top;">
Chris@49 10099 A = zeros(k)
Chris@49 10100 </td>
Chris@49 10101 <td style="vertical-align: top;">
Chris@49 10102 &nbsp;
Chris@49 10103 </td>
Chris@49 10104 <td style="vertical-align: top;">
Chris@49 10105 A = <a href="#zeros_standalone">zeros</a>&lt;mat&gt;(k,k)
Chris@49 10106 </td>
Chris@49 10107 <td style="vertical-align: top;">
Chris@49 10108 &nbsp;
Chris@49 10109 </td>
Chris@49 10110 <td style="vertical-align: top;">
Chris@49 10111 &nbsp;
Chris@49 10112 </td>
Chris@49 10113 </tr>
Chris@49 10114 <tr>
Chris@49 10115 <td style="vertical-align: top;">
Chris@49 10116 A = ones(k)
Chris@49 10117 </td>
Chris@49 10118 <td style="vertical-align: top;">
Chris@49 10119 &nbsp;
Chris@49 10120 </td>
Chris@49 10121 <td style="vertical-align: top;">
Chris@49 10122 A = <a href="#ones_standalone">ones</a>&lt;mat&gt;(k,k)
Chris@49 10123 </td>
Chris@49 10124 <td style="vertical-align: top;">
Chris@49 10125 &nbsp;
Chris@49 10126 </td>
Chris@49 10127 <td style="vertical-align: top;">
Chris@49 10128 &nbsp;
Chris@49 10129 </td>
Chris@49 10130 </tr>
Chris@49 10131 <tr>
Chris@49 10132 <td style="vertical-align: top;">
Chris@49 10133 &nbsp;
Chris@49 10134 </td>
Chris@49 10135 <td style="vertical-align: top;">
Chris@49 10136 &nbsp;
Chris@49 10137 </td>
Chris@49 10138 <td style="vertical-align: top;">
Chris@49 10139 &nbsp;
Chris@49 10140 </td>
Chris@49 10141 <td style="vertical-align: top;">
Chris@49 10142 &nbsp;
Chris@49 10143 </td>
Chris@49 10144 <td style="vertical-align: top;">
Chris@49 10145 &nbsp;
Chris@49 10146 </td>
Chris@49 10147 </tr>
Chris@49 10148 <tr>
Chris@49 10149 <td style="vertical-align: top;">
Chris@49 10150 C = complex(A,B)
Chris@49 10151 </td>
Chris@49 10152 <td style="vertical-align: top;">
Chris@49 10153 &nbsp;
Chris@49 10154 </td>
Chris@49 10155 <td style="vertical-align: top;">
Chris@49 10156 cx_mat C = <a href="#Mat">cx_mat</a>(A,B)
Chris@49 10157 </td>
Chris@49 10158 <td style="vertical-align: top;">
Chris@49 10159 &nbsp;
Chris@49 10160 </td>
Chris@49 10161 <td style="vertical-align: top;">
Chris@49 10162 &nbsp;
Chris@49 10163 </td>
Chris@49 10164 </tr>
Chris@49 10165 <tr>
Chris@49 10166 <td style="vertical-align: top;">
Chris@49 10167 &nbsp;
Chris@49 10168 </td>
Chris@49 10169 <td style="vertical-align: top;">
Chris@49 10170 &nbsp;
Chris@49 10171 </td>
Chris@49 10172 <td style="vertical-align: top;">
Chris@49 10173 &nbsp;
Chris@49 10174 </td>
Chris@49 10175 <td style="vertical-align: top;">
Chris@49 10176 &nbsp;
Chris@49 10177 </td>
Chris@49 10178 <td style="vertical-align: top;">
Chris@49 10179 &nbsp;
Chris@49 10180 </td>
Chris@49 10181 </tr>
Chris@49 10182 <tr>
Chris@49 10183 <td style="vertical-align: top;">
Chris@49 10184 A .* B
Chris@49 10185 </td>
Chris@49 10186 <td style="vertical-align: top;">
Chris@49 10187 &nbsp;
Chris@49 10188 </td>
Chris@49 10189 <td style="vertical-align: top;">
Chris@49 10190 A % B
Chris@49 10191 </td>
Chris@49 10192 <td style="vertical-align: top;">
Chris@49 10193 &nbsp;
Chris@49 10194 </td>
Chris@49 10195 <td style="vertical-align: top;">
Chris@49 10196 <a href="#operators">element-wise multiplication</a>
Chris@49 10197 </td>
Chris@49 10198 </tr>
Chris@49 10199 <tr>
Chris@49 10200 <td style="vertical-align: top;">
Chris@49 10201 A ./ B
Chris@49 10202 </td>
Chris@49 10203 <td style="vertical-align: top;">
Chris@49 10204 &nbsp;
Chris@49 10205 </td>
Chris@49 10206 <td style="vertical-align: top;">
Chris@49 10207 A / B
Chris@49 10208 </td>
Chris@49 10209 <td style="vertical-align: top;">
Chris@49 10210 &nbsp;
Chris@49 10211 </td>
Chris@49 10212 <td style="vertical-align: top;">
Chris@49 10213 <a href="#operators">element-wise division</a>
Chris@49 10214 </td>
Chris@49 10215 </tr>
Chris@49 10216 <tr>
Chris@49 10217 <td style="vertical-align: top;">
Chris@49 10218 A \ B
Chris@49 10219 </td>
Chris@49 10220 <td style="vertical-align: top;">
Chris@49 10221 &nbsp;
Chris@49 10222 </td>
Chris@49 10223 <td style="vertical-align: top;">
Chris@49 10224 <a href="#solve">solve</a>(A,B)
Chris@49 10225 </td>
Chris@49 10226 <td style="vertical-align: top;">
Chris@49 10227 &nbsp;
Chris@49 10228 </td>
Chris@49 10229 <td style="vertical-align: top;">
Chris@49 10230 conceptually similar to <a href="#inv">inv</a>(A)*B, but more efficient
Chris@49 10231 </td>
Chris@49 10232 </tr>
Chris@49 10233 <tr>
Chris@49 10234 <td style="vertical-align: top;">
Chris@49 10235 A = A + 1;
Chris@49 10236 </td>
Chris@49 10237 <td style="vertical-align: top;">
Chris@49 10238 &nbsp;
Chris@49 10239 </td>
Chris@49 10240 <td style="vertical-align: top;">
Chris@49 10241 A++
Chris@49 10242 </td>
Chris@49 10243 <td style="vertical-align: top;">
Chris@49 10244 &nbsp;
Chris@49 10245 </td>
Chris@49 10246 <td style="vertical-align: top;">
Chris@49 10247 &nbsp;
Chris@49 10248 </td>
Chris@49 10249 </tr>
Chris@49 10250 <tr>
Chris@49 10251 <td style="vertical-align: top;">
Chris@49 10252 A = A - 1;
Chris@49 10253 </td>
Chris@49 10254 <td style="vertical-align: top;">
Chris@49 10255 &nbsp;
Chris@49 10256 </td>
Chris@49 10257 <td style="vertical-align: top;">
Chris@49 10258 A--
Chris@49 10259 </td>
Chris@49 10260 <td style="vertical-align: top;">
Chris@49 10261 &nbsp;
Chris@49 10262 </td>
Chris@49 10263 <td style="vertical-align: top;">
Chris@49 10264 &nbsp;
Chris@49 10265 </td>
Chris@49 10266 </tr>
Chris@49 10267 <tr>
Chris@49 10268 <td style="vertical-align: top;">
Chris@49 10269 &nbsp;
Chris@49 10270 </td>
Chris@49 10271 <td style="vertical-align: top;">
Chris@49 10272 &nbsp;
Chris@49 10273 </td>
Chris@49 10274 <td style="vertical-align: top;">
Chris@49 10275 &nbsp;
Chris@49 10276 </td>
Chris@49 10277 <td style="vertical-align: top;">
Chris@49 10278 &nbsp;
Chris@49 10279 </td>
Chris@49 10280 <td style="vertical-align: top;">
Chris@49 10281 &nbsp;
Chris@49 10282 </td>
Chris@49 10283 </tr>
Chris@49 10284 <tr>
Chris@49 10285 <td style="vertical-align: top;">
Chris@49 10286 A = [ 1 2; 3 4; ]
Chris@49 10287 </td>
Chris@49 10288 <td style="vertical-align: top;">
Chris@49 10289 &nbsp;
Chris@49 10290 </td>
Chris@49 10291 <td style="vertical-align: top;">
Chris@49 10292 A&nbsp;<font size=-1>&lt;&lt;</font> 1 <font size=-1>&lt;&lt;</font> 2 <font size=-1>&lt;&lt;</font> endr<br>
Chris@49 10293 &nbsp;&nbsp;&nbsp;<font size=-1>&lt;&lt;</font> 3 <font size=-1>&lt;&lt;</font> 4 <font size=-1>&lt;&lt;</font> endr;
Chris@49 10294 </td>
Chris@49 10295 <td style="vertical-align: top;">
Chris@49 10296 &nbsp;
Chris@49 10297 </td>
Chris@49 10298 <td style="vertical-align: top;">
Chris@49 10299 <a href="#element_initialisation">element initialisation</a>,
Chris@49 10300 with special element <i>endr</i> indicating <i>end of row</i>
Chris@49 10301 </td>
Chris@49 10302 </tr>
Chris@49 10303 <tr>
Chris@49 10304 <td style="vertical-align: top;">
Chris@49 10305 &nbsp;
Chris@49 10306 </td>
Chris@49 10307 <td style="vertical-align: top;">
Chris@49 10308 &nbsp;
Chris@49 10309 </td>
Chris@49 10310 <td style="vertical-align: top;">
Chris@49 10311 &nbsp;
Chris@49 10312 </td>
Chris@49 10313 <td style="vertical-align: top;">
Chris@49 10314 &nbsp;
Chris@49 10315 </td>
Chris@49 10316 <td style="vertical-align: top;">
Chris@49 10317 &nbsp;
Chris@49 10318 </td>
Chris@49 10319 </tr>
Chris@49 10320 <tr>
Chris@49 10321 <td style="vertical-align: top;">
Chris@49 10322 X = [&nbsp;A&nbsp;&nbsp;B&nbsp;]
Chris@49 10323 </td>
Chris@49 10324 <td style="vertical-align: top;">
Chris@49 10325 &nbsp;
Chris@49 10326 </td>
Chris@49 10327 <td style="vertical-align: top;">
Chris@49 10328 X = <a href="#join">join_rows</a>(A,B)
Chris@49 10329 </td>
Chris@49 10330 <td style="vertical-align: top;">
Chris@49 10331 &nbsp;
Chris@49 10332 </td>
Chris@49 10333 <td style="vertical-align: top;">
Chris@49 10334 &nbsp;
Chris@49 10335 </td>
Chris@49 10336 </tr>
Chris@49 10337 <tr>
Chris@49 10338 <td style="vertical-align: top;">
Chris@49 10339 X = [&nbsp;A;&nbsp;B&nbsp;]
Chris@49 10340 </td>
Chris@49 10341 <td style="vertical-align: top;">
Chris@49 10342 &nbsp;
Chris@49 10343 </td>
Chris@49 10344 <td style="vertical-align: top;">
Chris@49 10345 X = <a href="#join">join_cols</a>(A,B)
Chris@49 10346 </td>
Chris@49 10347 <td style="vertical-align: top;">
Chris@49 10348 &nbsp;
Chris@49 10349 </td>
Chris@49 10350 <td style="vertical-align: top;">
Chris@49 10351 &nbsp;
Chris@49 10352 </td>
Chris@49 10353 </tr>
Chris@49 10354 <tr>
Chris@49 10355 <td style="vertical-align: top;">
Chris@49 10356 &nbsp;
Chris@49 10357 </td>
Chris@49 10358 <td style="vertical-align: top;">
Chris@49 10359 &nbsp;
Chris@49 10360 </td>
Chris@49 10361 <td style="vertical-align: top;">
Chris@49 10362 &nbsp;
Chris@49 10363 </td>
Chris@49 10364 <td style="vertical-align: top;">
Chris@49 10365 &nbsp;
Chris@49 10366 </td>
Chris@49 10367 <td style="vertical-align: top;">
Chris@49 10368 &nbsp;
Chris@49 10369 </td>
Chris@49 10370 </tr>
Chris@49 10371 <tr>
Chris@49 10372 <td style="vertical-align: top;">
Chris@49 10373 A
Chris@49 10374 </td>
Chris@49 10375 <td style="vertical-align: top;">
Chris@49 10376 &nbsp;
Chris@49 10377 </td>
Chris@49 10378 <td style="vertical-align: top;">
Chris@49 10379 cout <font size=-1>&lt;&lt;</font> A <font size=-1>&lt;&lt;</font> endl;
Chris@49 10380 <br>or
Chris@49 10381 <br>A<a href="#print">.print</a>("A =");
Chris@49 10382 </td>
Chris@49 10383 <td style="vertical-align: top;">
Chris@49 10384 &nbsp;
Chris@49 10385 </td>
Chris@49 10386 <td style="vertical-align: top;">
Chris@49 10387 &nbsp;
Chris@49 10388 </td>
Chris@49 10389 </tr>
Chris@49 10390 <tr>
Chris@49 10391 <td style="vertical-align: top;">
Chris@49 10392 &nbsp;
Chris@49 10393 </td>
Chris@49 10394 <td style="vertical-align: top;">
Chris@49 10395 &nbsp;
Chris@49 10396 </td>
Chris@49 10397 <td style="vertical-align: top;">
Chris@49 10398 &nbsp;
Chris@49 10399 </td>
Chris@49 10400 <td style="vertical-align: top;">
Chris@49 10401 &nbsp;
Chris@49 10402 </td>
Chris@49 10403 <td style="vertical-align: top;">
Chris@49 10404 &nbsp;
Chris@49 10405 </td>
Chris@49 10406 </tr>
Chris@49 10407 <tr>
Chris@49 10408 <td style="vertical-align: top;">
Chris@49 10409 save&nbsp;-ascii&nbsp;'A.dat'&nbsp;A
Chris@49 10410 </td>
Chris@49 10411 <td style="vertical-align: top;">
Chris@49 10412 &nbsp;
Chris@49 10413 </td>
Chris@49 10414 <td style="vertical-align: top;">
Chris@49 10415 A<a href="#save_load_mat">.save</a>("A.dat",&nbsp;raw_ascii);
Chris@49 10416 </td>
Chris@49 10417 <td style="vertical-align: top;">
Chris@49 10418 &nbsp;
Chris@49 10419 </td>
Chris@49 10420 <td style="vertical-align: top;">
Chris@49 10421 Matlab/Octave matrices saved as ascii are readable by Armadillo (and vice-versa)
Chris@49 10422 </td>
Chris@49 10423 </tr>
Chris@49 10424 <tr>
Chris@49 10425 <td style="vertical-align: top;">
Chris@49 10426 load&nbsp;-ascii&nbsp;'A.dat'
Chris@49 10427 </td>
Chris@49 10428 <td style="vertical-align: top;">
Chris@49 10429 &nbsp;
Chris@49 10430 </td>
Chris@49 10431 <td style="vertical-align: top;">
Chris@49 10432 A<a href="#save_load_mat">.load</a>("A.dat",&nbsp;raw_ascii);
Chris@49 10433 </td>
Chris@49 10434 <td style="vertical-align: top;">
Chris@49 10435 &nbsp;
Chris@49 10436 </td>
Chris@49 10437 <td style="vertical-align: top;">
Chris@49 10438 &nbsp;
Chris@49 10439 </td>
Chris@49 10440 </tr>
Chris@49 10441 <tr>
Chris@49 10442 <td style="vertical-align: top;">
Chris@49 10443 &nbsp;
Chris@49 10444 </td>
Chris@49 10445 <td style="vertical-align: top;">
Chris@49 10446 &nbsp;
Chris@49 10447 </td>
Chris@49 10448 <td style="vertical-align: top;">
Chris@49 10449 &nbsp;
Chris@49 10450 </td>
Chris@49 10451 <td style="vertical-align: top;">
Chris@49 10452 &nbsp;
Chris@49 10453 </td>
Chris@49 10454 <td style="vertical-align: top;">
Chris@49 10455 &nbsp;
Chris@49 10456 </td>
Chris@49 10457 </tr>
Chris@49 10458 <tr>
Chris@49 10459 <td style="vertical-align: top;">
Chris@49 10460 S&nbsp;=&nbsp;{&nbsp;'abc';&nbsp;'def'&nbsp;}
Chris@49 10461 </td>
Chris@49 10462 <td style="vertical-align: top;">
Chris@49 10463 &nbsp;
Chris@49 10464 </td>
Chris@49 10465 <td style="vertical-align: top;">
Chris@49 10466 <a href="#field">field</a>&lt;std::string&gt; S(2);
Chris@49 10467 <br>S(0) = "abc";
Chris@49 10468 <br>S(1) = "def";
Chris@49 10469 </td>
Chris@49 10470 <td style="vertical-align: top;">
Chris@49 10471 &nbsp;
Chris@49 10472 </td>
Chris@49 10473 <td style="vertical-align: top;">
Chris@49 10474 <a href="#field">fields</a> can store arbitrary objects, in a 1D or 2D layout
Chris@49 10475 </td>
Chris@49 10476 </tr>
Chris@49 10477 </tbody>
Chris@49 10478 </table>
Chris@49 10479 </ul>
Chris@49 10480 <br>
Chris@49 10481
Chris@49 10482 <a name="example_prog"></a>
Chris@49 10483 <hr class="greyline">
Chris@49 10484 <br>
Chris@49 10485 <b>example program</b>
Chris@49 10486 <br>
Chris@49 10487 <br>
Chris@49 10488 <ul>
Chris@49 10489 <li>
Chris@49 10490 If you save the program below as <i>example.cpp</i>,
Chris@49 10491 under Linux you can compile it using:
Chris@49 10492 <br>
Chris@49 10493 g++ example.cpp -o example -O1 -larmadillo
Chris@49 10494 </li>
Chris@49 10495 <ul>
Chris@49 10496 <pre>
Chris@49 10497 #include &lt;iostream&gt;
Chris@49 10498 #include &lt;armadillo&gt;
Chris@49 10499
Chris@49 10500 using namespace std;
Chris@49 10501 using namespace arma;
Chris@49 10502
Chris@49 10503 int main(int argc, char** argv)
Chris@49 10504 {
Chris@49 10505 mat A = randu&lt;mat&gt;(4,5);
Chris@49 10506 mat B = randu&lt;mat&gt;(4,5);
Chris@49 10507
Chris@49 10508 cout &lt;&lt; A*B.t() &lt;&lt; endl;
Chris@49 10509
Chris@49 10510 return 0;
Chris@49 10511 }
Chris@49 10512 </pre>
Chris@49 10513 </ul>
Chris@49 10514 <li>
Chris@49 10515 You may also want to have a look at the example programs that come with the Armadillo archive.
Chris@49 10516 </li>
Chris@49 10517 <br>
Chris@49 10518 <li>
Chris@49 10519 As Armadillo is a template library, we strongly recommended to have optimisation enabled when compiling programs
Chris@49 10520 (eg. when compiling with GCC, use the -O1 or -O2 options).
Chris@49 10521 </li>
Chris@49 10522 </ul>
Chris@49 10523 <br>
Chris@49 10524
Chris@49 10525
Chris@49 10526
Chris@49 10527 <a name="config_hpp"></a>
Chris@49 10528 <hr class="greyline">
Chris@49 10529 <br>
Chris@49 10530 <b>config.hpp</b>
Chris@49 10531 <br>
Chris@49 10532 <br>
Chris@49 10533 <ul>
Chris@49 10534 <li>
Chris@49 10535 Armadillo can be configured via editing the file <i>include/armadillo_bits/config.hpp</i>.
Chris@49 10536 Specific functionality can be enabled or disabled by uncommenting or commenting out a particular <i>#define</i>, listed below.
Chris@49 10537 <br>
Chris@49 10538 <br>
Chris@49 10539 <table style="text-align: left;" border="0" cellpadding="2" cellspacing="2">
Chris@49 10540 <tbody>
Chris@49 10541 <tr>
Chris@49 10542 <td style="vertical-align: top;">
Chris@49 10543 ARMA_USE_LAPACK
Chris@49 10544 </td>
Chris@49 10545 <td style="vertical-align: top;">
Chris@49 10546 &nbsp;
Chris@49 10547 </td>
Chris@49 10548 <td style="vertical-align: top;">
Chris@49 10549 Enable the use of LAPACK, or a high-speed replacement for LAPACK (eg. Intel MKL, AMD ACML or the Accelerate framework).
Chris@49 10550 Armadillo requires LAPACK for functions such as <a href="#svd">svd()</a>, <a href="#inv">inv()</a>, <a href="#eig_sym">eig_sym()</a>, <a href="#solve">solve()</a>, etc.
Chris@49 10551 </td>
Chris@49 10552 </tr>
Chris@49 10553 <tr>
Chris@49 10554 <td style="vertical-align: top;">
Chris@49 10555 &nbsp;
Chris@49 10556 </td>
Chris@49 10557 <td style="vertical-align: top;">
Chris@49 10558 &nbsp;
Chris@49 10559 </td>
Chris@49 10560 <td style="vertical-align: top;">
Chris@49 10561 &nbsp;
Chris@49 10562 </td>
Chris@49 10563 <td style="vertical-align: top;">
Chris@49 10564 &nbsp;
Chris@49 10565 </td>
Chris@49 10566 <td style="vertical-align: top;">
Chris@49 10567 &nbsp;
Chris@49 10568 </td>
Chris@49 10569 </tr>
Chris@49 10570 <tr>
Chris@49 10571 <td style="vertical-align: top;">
Chris@49 10572 ARMA_USE_BLAS
Chris@49 10573 </td>
Chris@49 10574 <td style="vertical-align: top;">
Chris@49 10575 &nbsp;
Chris@49 10576 </td>
Chris@49 10577 <td style="vertical-align: top;">
Chris@49 10578 Enable the use of BLAS, or a high-speed replacement for BLAS (eg. OpenBLAS, Intel MKL, AMD ACML or the Accelerate framework).
Chris@49 10579 BLAS is used for <a href="#operators">matrix multiplication</a>.
Chris@49 10580 Without BLAS, Armadillo will use a built-in matrix multiplication routine, which might be slower for large matrices.
Chris@49 10581 <!--However, if you're using 64 bit operating system with 32 bit BLAS, it's better to disable the use of BLAS.-->
Chris@49 10582 </td>
Chris@49 10583 </tr>
Chris@49 10584 <tr>
Chris@49 10585 <td style="vertical-align: top;">
Chris@49 10586 &nbsp;
Chris@49 10587 </td>
Chris@49 10588 <td style="vertical-align: top;">
Chris@49 10589 &nbsp;
Chris@49 10590 </td>
Chris@49 10591 <td style="vertical-align: top;">
Chris@49 10592 &nbsp;
Chris@49 10593 </td>
Chris@49 10594 <td style="vertical-align: top;">
Chris@49 10595 &nbsp;
Chris@49 10596 </td>
Chris@49 10597 <td style="vertical-align: top;">
Chris@49 10598 &nbsp;
Chris@49 10599 </td>
Chris@49 10600 </tr>
Chris@49 10601 <tr>
Chris@49 10602 <td style="vertical-align: top;">
Chris@49 10603 ARMA_BLAS_CAPITALS
Chris@49 10604 </td>
Chris@49 10605 <td style="vertical-align: top;">
Chris@49 10606 &nbsp;
Chris@49 10607 </td>
Chris@49 10608 <td style="vertical-align: top;">
Chris@49 10609 Use capitalised (uppercase) BLAS and LAPACK function names (eg. DGEMM vs dgemm)
Chris@49 10610 </td>
Chris@49 10611 </tr>
Chris@49 10612 <tr>
Chris@49 10613 <td style="vertical-align: top;">
Chris@49 10614 &nbsp;
Chris@49 10615 </td>
Chris@49 10616 <td style="vertical-align: top;">
Chris@49 10617 &nbsp;
Chris@49 10618 </td>
Chris@49 10619 <td style="vertical-align: top;">
Chris@49 10620 &nbsp;
Chris@49 10621 </td>
Chris@49 10622 <td style="vertical-align: top;">
Chris@49 10623 &nbsp;
Chris@49 10624 </td>
Chris@49 10625 <td style="vertical-align: top;">
Chris@49 10626 &nbsp;
Chris@49 10627 </td>
Chris@49 10628 </tr>
Chris@49 10629 <tr>
Chris@49 10630 <td style="vertical-align: top;">
Chris@49 10631 ARMA_BLAS_UNDERSCORE
Chris@49 10632 </td>
Chris@49 10633 <td style="vertical-align: top;">
Chris@49 10634 &nbsp;
Chris@49 10635 </td>
Chris@49 10636 <td style="vertical-align: top;">
Chris@49 10637 Append an underscore to BLAS and LAPACK function names (eg. dgemm_ vs dgemm). Enabled by default.
Chris@49 10638 </td>
Chris@49 10639 </tr>
Chris@49 10640 <tr>
Chris@49 10641 <td style="vertical-align: top;">
Chris@49 10642 &nbsp;
Chris@49 10643 </td>
Chris@49 10644 <td style="vertical-align: top;">
Chris@49 10645 &nbsp;
Chris@49 10646 </td>
Chris@49 10647 <td style="vertical-align: top;">
Chris@49 10648 &nbsp;
Chris@49 10649 </td>
Chris@49 10650 <td style="vertical-align: top;">
Chris@49 10651 &nbsp;
Chris@49 10652 </td>
Chris@49 10653 <td style="vertical-align: top;">
Chris@49 10654 &nbsp;
Chris@49 10655 </td>
Chris@49 10656 </tr>
Chris@49 10657 <tr>
Chris@49 10658 <td style="vertical-align: top;">
Chris@49 10659 ARMA_BLAS_LONG
Chris@49 10660 </td>
Chris@49 10661 <td style="vertical-align: top;">
Chris@49 10662 &nbsp;
Chris@49 10663 </td>
Chris@49 10664 <td style="vertical-align: top;">
Chris@49 10665 Use "long" instead of "int" when calling BLAS and LAPACK functions
Chris@49 10666 </td>
Chris@49 10667 </tr>
Chris@49 10668 <tr>
Chris@49 10669 <td style="vertical-align: top;">
Chris@49 10670 &nbsp;
Chris@49 10671 </td>
Chris@49 10672 <td style="vertical-align: top;">
Chris@49 10673 &nbsp;
Chris@49 10674 </td>
Chris@49 10675 <td style="vertical-align: top;">
Chris@49 10676 &nbsp;
Chris@49 10677 </td>
Chris@49 10678 <td style="vertical-align: top;">
Chris@49 10679 &nbsp;
Chris@49 10680 </td>
Chris@49 10681 <td style="vertical-align: top;">
Chris@49 10682 &nbsp;
Chris@49 10683 </td>
Chris@49 10684 </tr>
Chris@49 10685 <tr>
Chris@49 10686 <td style="vertical-align: top;">
Chris@49 10687 ARMA_BLAS_LONG_LONG
Chris@49 10688 </td>
Chris@49 10689 <td style="vertical-align: top;">
Chris@49 10690 &nbsp;
Chris@49 10691 </td>
Chris@49 10692 <td style="vertical-align: top;">
Chris@49 10693 Use "long long" instead of "int" when calling BLAS and LAPACK functions
Chris@49 10694 </td>
Chris@49 10695 </tr>
Chris@49 10696 <tr>
Chris@49 10697 <td style="vertical-align: top;">
Chris@49 10698 &nbsp;
Chris@49 10699 </td>
Chris@49 10700 <td style="vertical-align: top;">
Chris@49 10701 &nbsp;
Chris@49 10702 </td>
Chris@49 10703 <td style="vertical-align: top;">
Chris@49 10704 &nbsp;
Chris@49 10705 </td>
Chris@49 10706 <td style="vertical-align: top;">
Chris@49 10707 &nbsp;
Chris@49 10708 </td>
Chris@49 10709 <td style="vertical-align: top;">
Chris@49 10710 &nbsp;
Chris@49 10711 </td>
Chris@49 10712 </tr>
Chris@49 10713 <tr>
Chris@49 10714 <td style="vertical-align: top;">
Chris@49 10715 ARMA_USE_TBB_ALLOC
Chris@49 10716 </td>
Chris@49 10717 <td style="vertical-align: top;">
Chris@49 10718 &nbsp;
Chris@49 10719 </td>
Chris@49 10720 <td style="vertical-align: top;">
Chris@49 10721 Use Intel TBB <i>scalable_malloc()</i> and <i>scalable_free()</i> instead of standard <i>new[]</i> and <i>delete[]</i> for managing matrix memory
Chris@49 10722 </td>
Chris@49 10723 </tr>
Chris@49 10724 <tr>
Chris@49 10725 <td style="vertical-align: top;">
Chris@49 10726 &nbsp;
Chris@49 10727 </td>
Chris@49 10728 <td style="vertical-align: top;">
Chris@49 10729 &nbsp;
Chris@49 10730 </td>
Chris@49 10731 <td style="vertical-align: top;">
Chris@49 10732 &nbsp;
Chris@49 10733 </td>
Chris@49 10734 <td style="vertical-align: top;">
Chris@49 10735 &nbsp;
Chris@49 10736 </td>
Chris@49 10737 <td style="vertical-align: top;">
Chris@49 10738 &nbsp;
Chris@49 10739 </td>
Chris@49 10740 </tr>
Chris@49 10741 <tr>
Chris@49 10742 <td style="vertical-align: top;">
Chris@49 10743 ARMA_USE_MKL_ALLOC
Chris@49 10744 </td>
Chris@49 10745 <td style="vertical-align: top;">
Chris@49 10746 &nbsp;
Chris@49 10747 </td>
Chris@49 10748 <td style="vertical-align: top;">
Chris@49 10749 Use Intel MKL <i>mkl_malloc()</i> and <i>mkl_free()</i> instead of standard <i>new[]</i> and <i>delete[]</i> for managing matrix memory
Chris@49 10750 </td>
Chris@49 10751 </tr>
Chris@49 10752 <tr>
Chris@49 10753 <td style="vertical-align: top;">
Chris@49 10754 &nbsp;
Chris@49 10755 </td>
Chris@49 10756 <td style="vertical-align: top;">
Chris@49 10757 &nbsp;
Chris@49 10758 </td>
Chris@49 10759 <td style="vertical-align: top;">
Chris@49 10760 &nbsp;
Chris@49 10761 </td>
Chris@49 10762 <td style="vertical-align: top;">
Chris@49 10763 &nbsp;
Chris@49 10764 </td>
Chris@49 10765 <td style="vertical-align: top;">
Chris@49 10766 &nbsp;
Chris@49 10767 </td>
Chris@49 10768 </tr>
Chris@49 10769 <tr>
Chris@49 10770 <td style="vertical-align: top;">
Chris@49 10771 <a name="config_hpp_arma_64bit_word"></a>
Chris@49 10772 ARMA_64BIT_WORD
Chris@49 10773 </td>
Chris@49 10774 <td style="vertical-align: top;">
Chris@49 10775 &nbsp;
Chris@49 10776 </td>
Chris@49 10777 <td style="vertical-align: top;">
Chris@49 10778 Use 64 bit integers. Useful if you require matrices/vectors capable of holding more than 4 billion elements.
Chris@49 10779 Your machine and compiler must have support for 64 bit integers (eg. via "long" or "long long").
Chris@49 10780 This can also be enabled by adding <i>#define&nbsp;ARMA_64BIT_WORD</i> before each instance of <i>#include&nbsp;&lt;armadillo&gt;</i>.
Chris@49 10781 </td>
Chris@49 10782 </tr>
Chris@49 10783 <tr>
Chris@49 10784 <td style="vertical-align: top;">
Chris@49 10785 &nbsp;
Chris@49 10786 </td>
Chris@49 10787 <td style="vertical-align: top;">
Chris@49 10788 &nbsp;
Chris@49 10789 </td>
Chris@49 10790 <td style="vertical-align: top;">
Chris@49 10791 &nbsp;
Chris@49 10792 </td>
Chris@49 10793 <td style="vertical-align: top;">
Chris@49 10794 &nbsp;
Chris@49 10795 </td>
Chris@49 10796 <td style="vertical-align: top;">
Chris@49 10797 &nbsp;
Chris@49 10798 </td>
Chris@49 10799 </tr>
Chris@49 10800 <tr>
Chris@49 10801 <td style="vertical-align: top;">
Chris@49 10802 <a name="config_hpp_arma_use_cxx11"></a>
Chris@49 10803 ARMA_USE_CXX11
Chris@49 10804 </td>
Chris@49 10805 <td style="vertical-align: top;">
Chris@49 10806 &nbsp;
Chris@49 10807 </td>
Chris@49 10808 <td style="vertical-align: top;">
Chris@49 10809 Use C++11 features, such as <a href="#element_initialisation">initialiser lists</a>
Chris@49 10810 </td>
Chris@49 10811 </tr>
Chris@49 10812 <tr>
Chris@49 10813 <td style="vertical-align: top;">
Chris@49 10814 &nbsp;
Chris@49 10815 </td>
Chris@49 10816 <td style="vertical-align: top;">
Chris@49 10817 &nbsp;
Chris@49 10818 </td>
Chris@49 10819 <td style="vertical-align: top;">
Chris@49 10820 &nbsp;
Chris@49 10821 </td>
Chris@49 10822 <td style="vertical-align: top;">
Chris@49 10823 &nbsp;
Chris@49 10824 </td>
Chris@49 10825 <td style="vertical-align: top;">
Chris@49 10826 &nbsp;
Chris@49 10827 </td>
Chris@49 10828 </tr>
Chris@49 10829 <tr>
Chris@49 10830 <td style="vertical-align: top;">
Chris@49 10831 ARMA_USE_HDF5
Chris@49 10832 </td>
Chris@49 10833 <td style="vertical-align: top;">
Chris@49 10834 &nbsp;
Chris@49 10835 </td>
Chris@49 10836 <td style="vertical-align: top;">
Chris@49 10837 Enable the the ability to <a href="#save_load_mat">save and load</a> matrices stored in the HDF5 format;
Chris@49 10838 the <i>hdf5.h</i> header file must be available on your system and you will need to link with the hdf5 library (eg. -lhdf5)
Chris@49 10839 </td>
Chris@49 10840 </tr>
Chris@49 10841 <tr>
Chris@49 10842 <td style="vertical-align: top;">
Chris@49 10843 &nbsp;
Chris@49 10844 </td>
Chris@49 10845 <td style="vertical-align: top;">
Chris@49 10846 &nbsp;
Chris@49 10847 </td>
Chris@49 10848 <td style="vertical-align: top;">
Chris@49 10849 &nbsp;
Chris@49 10850 </td>
Chris@49 10851 <td style="vertical-align: top;">
Chris@49 10852 &nbsp;
Chris@49 10853 </td>
Chris@49 10854 <td style="vertical-align: top;">
Chris@49 10855 &nbsp;
Chris@49 10856 </td>
Chris@49 10857 </tr>
Chris@49 10858 <tr>
Chris@49 10859 <td style="vertical-align: top;">
Chris@49 10860 <a name="config_hpp_arma_no_debug"></a>
Chris@49 10861 ARMA_NO_DEBUG
Chris@49 10862 </td>
Chris@49 10863 <td style="vertical-align: top;">
Chris@49 10864 &nbsp;
Chris@49 10865 </td>
Chris@49 10866 <td style="vertical-align: top;">
Chris@49 10867 Disable all run-time checks, such as <a href="#element_access">bounds checking</a>.
Chris@49 10868 This will result in faster code, but you first need to make sure that your code runs correctly!
Chris@49 10869 We strongly recommend to have the run-time checks enabled during development,
Chris@49 10870 as this greatly aids in finding mistakes in your code, and hence speeds up development.
Chris@49 10871 We recommend that run-time checks be disabled <b>only</b> for the shipped version of your program.
Chris@49 10872 </td>
Chris@49 10873 </tr>
Chris@49 10874 <tr>
Chris@49 10875 <td style="vertical-align: top;">
Chris@49 10876 &nbsp;
Chris@49 10877 </td>
Chris@49 10878 <td style="vertical-align: top;">
Chris@49 10879 &nbsp;
Chris@49 10880 </td>
Chris@49 10881 <td style="vertical-align: top;">
Chris@49 10882 &nbsp;
Chris@49 10883 </td>
Chris@49 10884 <td style="vertical-align: top;">
Chris@49 10885 &nbsp;
Chris@49 10886 </td>
Chris@49 10887 <td style="vertical-align: top;">
Chris@49 10888 &nbsp;
Chris@49 10889 </td>
Chris@49 10890 </tr>
Chris@49 10891 <tr>
Chris@49 10892 <td style="vertical-align: top;">
Chris@49 10893 ARMA_EXTRA_DEBUG
Chris@49 10894 </td>
Chris@49 10895 <td style="vertical-align: top;">
Chris@49 10896 &nbsp;
Chris@49 10897 </td>
Chris@49 10898 <td style="vertical-align: top;">
Chris@49 10899 Print out the trace of internal functions used for evaluating expressions.
Chris@49 10900 Not recommended for normal use.
Chris@49 10901 This is mainly useful for debugging the library.
Chris@49 10902 </td>
Chris@49 10903 </tr>
Chris@49 10904 <tr>
Chris@49 10905 <td style="vertical-align: top;">
Chris@49 10906 &nbsp;
Chris@49 10907 </td>
Chris@49 10908 <td style="vertical-align: top;">
Chris@49 10909 &nbsp;
Chris@49 10910 </td>
Chris@49 10911 <td style="vertical-align: top;">
Chris@49 10912 &nbsp;
Chris@49 10913 </td>
Chris@49 10914 <td style="vertical-align: top;">
Chris@49 10915 &nbsp;
Chris@49 10916 </td>
Chris@49 10917 <td style="vertical-align: top;">
Chris@49 10918 &nbsp;
Chris@49 10919 </td>
Chris@49 10920 </tr>
Chris@49 10921 <tr>
Chris@49 10922 <td style="vertical-align: top;">
Chris@49 10923 ARMA_MAT_PREALLOC
Chris@49 10924 </td>
Chris@49 10925 <td style="vertical-align: top;">
Chris@49 10926 &nbsp;
Chris@49 10927 </td>
Chris@49 10928 <td style="vertical-align: top;">
Chris@49 10929 The number of preallocated elements used by matrices and vectors.
Chris@49 10930 Must be always enabled and set to an integer that is at least&nbsp;1.
Chris@49 10931 By default set to 16.
Chris@49 10932 If you mainly use lots of very small vectors (eg. &le; 4 elements), change the number to the size of your vectors.
Chris@49 10933 </td>
Chris@49 10934 </tr>
Chris@49 10935 <tr>
Chris@49 10936 <td style="vertical-align: top;">
Chris@49 10937 &nbsp;
Chris@49 10938 </td>
Chris@49 10939 <td style="vertical-align: top;">
Chris@49 10940 &nbsp;
Chris@49 10941 </td>
Chris@49 10942 <td style="vertical-align: top;">
Chris@49 10943 &nbsp;
Chris@49 10944 </td>
Chris@49 10945 <td style="vertical-align: top;">
Chris@49 10946 &nbsp;
Chris@49 10947 </td>
Chris@49 10948 <td style="vertical-align: top;">
Chris@49 10949 &nbsp;
Chris@49 10950 </td>
Chris@49 10951 </tr>
Chris@49 10952 <tr>
Chris@49 10953 <td style="vertical-align: top;">
Chris@49 10954 ARMA_DEFAULT_OSTREAM
Chris@49 10955 </td>
Chris@49 10956 <td style="vertical-align: top;">
Chris@49 10957 &nbsp;
Chris@49 10958 </td>
Chris@49 10959 <td style="vertical-align: top;">
Chris@49 10960 The default stream used for printing <a href="#logging">error messages</a> and by <a href="#print">.print()</a>.
Chris@49 10961 Must be always enabled.
Chris@49 10962 By default this is set to <i>std::cout</i>
Chris@49 10963 </td>
Chris@49 10964 </tr>
Chris@49 10965 <tr>
Chris@49 10966 <td style="vertical-align: top;">
Chris@49 10967 &nbsp;
Chris@49 10968 </td>
Chris@49 10969 <td style="vertical-align: top;">
Chris@49 10970 &nbsp;
Chris@49 10971 </td>
Chris@49 10972 <td style="vertical-align: top;">
Chris@49 10973 &nbsp;
Chris@49 10974 </td>
Chris@49 10975 <td style="vertical-align: top;">
Chris@49 10976 &nbsp;
Chris@49 10977 </td>
Chris@49 10978 <td style="vertical-align: top;">
Chris@49 10979 &nbsp;
Chris@49 10980 </td>
Chris@49 10981 </tr>
Chris@49 10982 <tr>
Chris@49 10983 <td style="vertical-align: top;">
Chris@49 10984 ARMA_DONT_USE_LAPACK
Chris@49 10985 </td>
Chris@49 10986 <td style="vertical-align: top;">
Chris@49 10987 &nbsp;
Chris@49 10988 </td>
Chris@49 10989 <td style="vertical-align: top;">
Chris@49 10990 Disable use of LAPACK. Overrides <i>ARMA_USE_LAPACK</i>
Chris@49 10991 </td>
Chris@49 10992 </tr>
Chris@49 10993 <tr>
Chris@49 10994 <td style="vertical-align: top;">
Chris@49 10995 &nbsp;
Chris@49 10996 </td>
Chris@49 10997 <td style="vertical-align: top;">
Chris@49 10998 &nbsp;
Chris@49 10999 </td>
Chris@49 11000 <td style="vertical-align: top;">
Chris@49 11001 &nbsp;
Chris@49 11002 </td>
Chris@49 11003 <td style="vertical-align: top;">
Chris@49 11004 &nbsp;
Chris@49 11005 </td>
Chris@49 11006 <td style="vertical-align: top;">
Chris@49 11007 &nbsp;
Chris@49 11008 </td>
Chris@49 11009 </tr>
Chris@49 11010 <tr>
Chris@49 11011 <td style="vertical-align: top;">
Chris@49 11012 ARMA_DONT_USE_BLAS
Chris@49 11013 </td>
Chris@49 11014 <td style="vertical-align: top;">
Chris@49 11015 &nbsp;
Chris@49 11016 </td>
Chris@49 11017 <td style="vertical-align: top;">
Chris@49 11018 Disable use of BLAS. Overrides <i>ARMA_USE_BLAS</i>
Chris@49 11019 </td>
Chris@49 11020 </tr>
Chris@49 11021 <tr>
Chris@49 11022 <td style="vertical-align: top;">
Chris@49 11023 &nbsp;
Chris@49 11024 </td>
Chris@49 11025 <td style="vertical-align: top;">
Chris@49 11026 &nbsp;
Chris@49 11027 </td>
Chris@49 11028 <td style="vertical-align: top;">
Chris@49 11029 &nbsp;
Chris@49 11030 </td>
Chris@49 11031 <td style="vertical-align: top;">
Chris@49 11032 &nbsp;
Chris@49 11033 </td>
Chris@49 11034 <td style="vertical-align: top;">
Chris@49 11035 &nbsp;
Chris@49 11036 </td>
Chris@49 11037 </tr>
Chris@49 11038 </tbody>
Chris@49 11039 </table>
Chris@49 11040 </li>
Chris@49 11041
Chris@49 11042 <br>
Chris@49 11043 <li>
Chris@49 11044 See also:
Chris@49 11045 <ul>
Chris@49 11046 <li><a href="#logging">logging of warnings and errors</a></li>
Chris@49 11047 <li><a href="#element_access">element access</a></li>
Chris@49 11048 <li><a href="#element_initialisation">element initialisation</a></li>
Chris@49 11049 <li><a href="#uword">uword/sword</a></li>
Chris@49 11050 </ul>
Chris@49 11051 </li>
Chris@49 11052 <br>
Chris@49 11053 </ul>
Chris@49 11054 <br>
Chris@49 11055
Chris@49 11056
Chris@49 11057
Chris@49 11058 <!--
Chris@49 11059 <a name="catching_exceptions"></a>
Chris@49 11060 <hr class="greyline">
Chris@49 11061 <br>
Chris@49 11062 <b>how to catch std::runtime_error exceptions</b>
Chris@49 11063 <br>
Chris@49 11064 <br>
Chris@49 11065 <ul>
Chris@49 11066 <li>
Chris@49 11067 If a function such as <a href="#inv">inv()</a> fails to find a solution,
Chris@49 11068 an error message is printed and a <i>std::runtime_error</i> exception is thrown.
Chris@49 11069 If the exception is not caught, the program typically terminates.
Chris@49 11070 Below is an example of how to catch exceptions:
Chris@49 11071 <ul>
Chris@49 11072 <pre>
Chris@49 11073 #include &lt;iostream&gt;
Chris@49 11074 #include &lt;armadillo&gt;
Chris@49 11075
Chris@49 11076 using namespace std;
Chris@49 11077 using namespace arma;
Chris@49 11078
Chris@49 11079 int main(int argc, char** argv)
Chris@49 11080 {
Chris@49 11081 // create a non-invertible matrix
Chris@49 11082 mat A = zeros&lt;mat&gt;(5,5);
Chris@49 11083
Chris@49 11084 mat B;
Chris@49 11085
Chris@49 11086 try
Chris@49 11087 {
Chris@49 11088 B = inv(A);
Chris@49 11089 }
Chris@49 11090 catch (std::runtime_error&amp; x)
Chris@49 11091 {
Chris@49 11092 cout &lt;&lt; "caught an exception" &lt;&lt; endl;
Chris@49 11093 }
Chris@49 11094
Chris@49 11095 return 0;
Chris@49 11096 }
Chris@49 11097 </pre>
Chris@49 11098 </ul>
Chris@49 11099 <li>
Chris@49 11100 See also:
Chris@49 11101 <ul>
Chris@49 11102 <li><a href="#logging">logging of warnings and errors</a></li>
Chris@49 11103 <li><a href="http://cplusplus.com/doc/tutorial/exceptions/">tutorial on exceptions</a></li>
Chris@49 11104 <li><a href="http://cplusplus.com/reference/std/stdexcept/runtime_error/">std::runtime_error</a></li>
Chris@49 11105 </ul>
Chris@49 11106 </li>
Chris@49 11107 <br>
Chris@49 11108 </ul>
Chris@49 11109 <br>
Chris@49 11110 -->
Chris@49 11111
Chris@49 11112 <a name="api_additions"></a>
Chris@49 11113 <a name="api_changes"></a>
Chris@49 11114 <hr class="greyline">
Chris@49 11115 <br>
Chris@49 11116 <b>API Additions, Changes and Deprecations</b>
Chris@49 11117 <br>
Chris@49 11118 <br>
Chris@49 11119 <li>API and Version Policy
Chris@49 11120 <ul>
Chris@49 11121 <li>
Chris@49 11122 Armadillo's version number is X.Y.Z, where X is a major version, Y is a minor version, and Z is the patch level (indicating bug fixes).
Chris@49 11123 </li>
Chris@49 11124 <br>
Chris@49 11125 <li>
Chris@49 11126 Within each major version (eg. 3.x), minor versions with an even number (eg. 3.2) are backwards compatible with earlier even minor versions (eg. 3.0).
Chris@49 11127 For example, code written for version 3.0 will work with version 3.2.
Chris@49 11128 However, as each minor version may have more features (ie. API extensions) than earlier versions,
Chris@49 11129 code specifically written for version 3.2 doesn't necessarily work with 3.0.
Chris@49 11130 </li>
Chris@49 11131 <br>
Chris@49 11132 <li>
Chris@49 11133 An odd minor version number (eg. 3.3) indicates an experimental version.
Chris@49 11134 Experimental versions are generally faster and have more functionality,
Chris@49 11135 but their APIs have not been finalised yet.
Chris@49 11136 </li>
Chris@49 11137 <br>
Chris@49 11138 <li>
Chris@49 11139 In general, we don't like changes to existing APIs and prefer not to break any user software.
Chris@49 11140 However, to allow evolution and help code maintenance, we reserve the right to change the APIs in future major versions of Armadillo,
Chris@49 11141 while remaining backwards compatible wherever possible
Chris@49 11142 (eg. 4.0 may have slightly different APIs than 3.x).
Chris@49 11143 Also, in a rare instance the user API may need to be altered if a bug fix absolutely requires it.
Chris@49 11144 </li>
Chris@49 11145 </ul>
Chris@49 11146 </li>
Chris@49 11147
Chris@49 11148 <!--
Chris@49 11149 <br>
Chris@49 11150 <li>
Chris@49 11151 <a name="deprecated"></a>
Chris@49 11152 List of deprecated functionality; this functionality will be <b>removed</b> in version 4.0:
Chris@49 11153 <ul>
Chris@49 11154 <li>
Chris@49 11155 ...
Chris@49 11156 </li>
Chris@49 11157 </ul>
Chris@49 11158 </li>
Chris@49 11159 -->
Chris@49 11160
Chris@49 11161 <br>
Chris@49 11162 <br>
Chris@49 11163 <li>
Chris@49 11164 List of additions and changes for each version:
Chris@49 11165 <br>
Chris@49 11166 <br>
Chris@49 11167 <ul>
Chris@49 11168 <a name="added_in_3900"></a>
Chris@49 11169 <li>Added in 3.900:
Chris@49 11170 <ul>
Chris@49 11171 <li>automatic SSE2 vectorisation of elementary expressions (eg. matrix addition) when using GCC 4.7+ with -O3 optimisation</li>
Chris@49 11172 <li>faster <a href="#stats_fns">median()</a></li>
Chris@49 11173 <li>faster handling of compound expressions with transposes of <a href="#submat">submatrix</a> rows</li>
Chris@49 11174 <li>faster handling of compound expressions with transposes of complex vectors</li>
Chris@49 11175 <li>added support for <a href="#save_load_mat">saving &amp; loading</a> of <a href="#Cube">cubes</a> in HDF5 format</li>
Chris@49 11176 </ul>
Chris@49 11177 </li>
Chris@49 11178 <br>
Chris@49 11179 <a name="added_in_3820"></a>
Chris@49 11180 <li>Added in 3.820:
Chris@49 11181 <ul>
Chris@49 11182 <li>faster <a href="#as_scalar">as_scalar()</a> for compound expressions</li>
Chris@49 11183 <li>faster transpose of small vectors</li>
Chris@49 11184 <li>faster matrix-vector product for small vectors</li>
Chris@49 11185 <li>faster multiplication of small <a href="#adv_constructors_mat_fixed">fixed size matrices</a></li>
Chris@49 11186 </ul>
Chris@49 11187 </li>
Chris@49 11188 <br>
Chris@49 11189 <a name="added_in_3810"></a>
Chris@49 11190 <li>Added in 3.810:
Chris@49 11191 <ul>
Chris@49 11192 <li>fast Fourier transform: <a href="#fft">fft()</a></li>
Chris@49 11193 <li>handling of <a href="#imbue">.imbue()</a> and <a href="#transform">.transform()</a> by submatrices and subcubes</li>
Chris@49 11194 <li><a href="#batch_constructors_sp_mat">batch insertion constructors</a> for sparse matrices
Chris@49 11195 </ul>
Chris@49 11196 </li>
Chris@49 11197 <br>
Chris@49 11198 <a name="added_in_3800"></a>
Chris@49 11199 <li>Added in 3.800:
Chris@49 11200 <ul>
Chris@49 11201 <li><a href="#imbue">.imbue()</a> for filling a matrix/cube with values provided by a functor or lambda expression</li>
Chris@49 11202 <li><a href="#swap">.swap()</a> for swapping contents with another matrix</li>
Chris@49 11203 <li><a href="#transform">.transform()</a> for transforming a matrix/cube using a functor or lambda expression</li>
Chris@49 11204 <li><a href="#misc_fns">round()</a> for rounding matrix elements towards nearest integer</li>
Chris@49 11205 <li>faster <a href="#find">find()</a></li>
Chris@49 11206 </ul>
Chris@49 11207 </li>
Chris@49 11208 <br>
Chris@49 11209 <li>Changed in 3.800:
Chris@49 11210 <ul>
Chris@49 11211 <li>Armadillo is now licensed using the <a href="http://www.mozilla.org/MPL/2.0/">Mozilla Public License 2.0</a>;
Chris@49 11212 <br>
Chris@49 11213 see also the associated <a href="http://www.mozilla.org/MPL/2.0/FAQ.html">frequently asked questions</a> about the license</li>
Chris@49 11214 </ul>
Chris@49 11215 <br>
Chris@49 11216 </li>
Chris@49 11217 <a name="added_in_36"></a>
Chris@49 11218 <li>Added in 3.6:
Chris@49 11219 <ul>
Chris@49 11220 <li>faster handling of compound expressions with submatrices and subcubes</li>
Chris@49 11221 <li>faster <a href="#trace">trace()</a></li>
Chris@49 11222 <li>support for loading matrices as text files with <i>NaN</i> and <i>Inf</i> elements</li>
Chris@49 11223 <li><a href="#sort_index">stable_sort_index()</a>, which preserves the relative order of elements with equivalent values</li>
Chris@49 11224 <li>handling of <a href="#SpMat">sparse matrices</a> by <a href="#stats_fns">mean()</a>, <a href="#stats_fns">var()</a>, <a href="#norm">norm()</a>, <a href="#abs">abs()</a>, <a href="#misc_fns">square()</a>, <a href="#misc_fns">sqrt()</a></li>
Chris@49 11225 <li>saving and loading of sparse matrices in <i>arma_binary</i> format</li>
Chris@49 11226 </ul>
Chris@49 11227 <br>
Chris@49 11228 </li>
Chris@49 11229 <a name="added_in_34"></a>
Chris@49 11230 <li>Added in 3.4:
Chris@49 11231 <ul>
Chris@49 11232 <li>economical QR decomposition: <a href="#qr_econ">qr_econ()</a></li>
Chris@49 11233 <li><a href="#each_colrow">.each_col() &amp; .each_row()</a> for vector operations repeated on each column or row of a matrix</li>
Chris@49 11234 <li>preliminary support for <a href="#SpMat">sparse matrices</a></li>
Chris@49 11235 <li>ability to <a href="#save_load_mat">save and load</a> matrices in HDF5 format</li>
Chris@49 11236 <li>faster <a href="#svd">singular value decomposition</a> via optional use of divide-and-conquer algorithm</li>
Chris@49 11237 <li>faster <a href="#randu_randn_member">.randn()</a></li>
Chris@49 11238 <li>faster <a href="#dot">dot() and cdot()</a> for complex numbers</li>
Chris@49 11239 </ul>
Chris@49 11240 <br>
Chris@49 11241 </li>
Chris@49 11242 <a name="added_in_32"></a>
Chris@49 11243 <li>Added in 3.2:
Chris@49 11244 <ul>
Chris@49 11245 <li><a href="#unique">unique()</a>, for finding unique elements of a matrix</li>
Chris@49 11246 <li><a href="#eval_member">.eval()</a>, for forcing the evaluation of delayed expressions</li>
Chris@49 11247 <li>faster <a href="#eig_sym">eigen decomposition</a> via optional use of divide-and-conquer algorithm</li>
Chris@49 11248 <li>faster <a href="#t_st_members">transpose</a> of vectors and compound expressions</li>
Chris@49 11249 <li>faster handling of <a href="#diag">diagonal views</a></li>
Chris@49 11250 <li>faster handling of tiny <a href="#adv_constructors_col_fixed">fixed size</a> vectors (&le; 4 elements)</li>
Chris@49 11251 </ul>
Chris@49 11252 <br>
Chris@49 11253 </li>
Chris@49 11254 <a name="added_in_30"></a>
Chris@49 11255 <li>Added in 3.0:
Chris@49 11256 <ul>
Chris@49 11257 <li>shorthand for inverse: <a href="#i_member">.i()</a></li>
Chris@49 11258 <li><a href="#constants">datum</a> class</li>
Chris@49 11259 <li><a href="#hist">hist()</a> and <a href="#histc">histc()</a></li>
Chris@49 11260 <li>non-contiguous <a href="#submat">submatrix views</a></li>
Chris@49 11261 <li>faster handling of <a href="#submat">submatrix views</a> with a single row or column</li>
Chris@49 11262 <li>faster element access in <a href="#adv_constructors_mat_fixed">fixed size matrices</a></li>
Chris@49 11263 <li>faster <a href="#repmat">repmat()</a></li>
Chris@49 11264 </ul>
Chris@49 11265 <br>
Chris@49 11266 </li>
Chris@49 11267 <li>Changed in 3.0:
Chris@49 11268 <ul>
Chris@49 11269 <li>expressions <i>X=<a href="#inv">inv</a>(A)*B</i> and <i>X=A<a href="#i_member">.i()</a>*B</i> are automatically converted to <i>X=<a href="#solve">solve</a>(A,B)</i>
Chris@49 11270 <li>better detection of vector expressions by <a href="#sum">sum()</a>, <a href="#cumsum">cumsum()</a>, <a href="#prod">prod()</a>, <a href="#min_and_max">min()</a>, <a href="#min_and_max">max()</a>, <a href="#stats_fns">mean()</a>, <a href="#stats_fns">median()</a>, <a href="#stats_fns">stddev()</a>, <a href="#stats_fns">var()</a>
Chris@49 11271 <li>faster generation of random numbers
Chris@49 11272 (eg. <a href="#randu_randn_standalone">randu()</a> and <a href="#randu_randn_standalone">randn()</a>),
Chris@49 11273 via an algorithm that produces slightly different numbers than in 2.x
Chris@49 11274 </li>
Chris@49 11275 <li>
Chris@49 11276 support for tying writeable auxiliary (external) memory to fixed size matrices has been removed;
Chris@49 11277 instead, you can use standard matrices with <a href="#adv_constructors_mat">writeable auxiliary memory</a>,
Chris@49 11278 or initialise fixed size matrices by <a href="#adv_constructors_mat">copying the memory</a>.
Chris@49 11279 Using auxiliary memory with standard matrices is unaffected.
Chris@49 11280 </li>
Chris@49 11281 <li>
Chris@49 11282 <i>.print_trans()</i> and <i>.raw_print_trans()</i> have been removed;
Chris@49 11283 instead, you can chain <i><a href="#t_st_members">.t()</a></i> and <i><a href="#print">.print()</a></i> to achieve a similar result: <i>X.t().print()</i>
Chris@49 11284 </li>
Chris@49 11285 </ul>
Chris@49 11286 <br>
Chris@49 11287 </li>
Chris@49 11288 <a name="added_in_24"></a>
Chris@49 11289 <li>Added in 2.4:
Chris@49 11290 <ul>
Chris@49 11291 <li>shorter forms of transposes: <a href="#t_st_members">.t()</a> and <a href="#t_st_members">.st()</a></li>
Chris@49 11292 <li><a href="#resize_member">.resize()</a> and <a href="#resize">resize()</a></li>
Chris@49 11293 <li>optional use of 64 bit indices (allowing matrices to have more than 4 billion elements),
Chris@49 11294 <br>enabled via ARMA_64BIT_WORD in <i>include/armadillo_bits/config.hpp</i></li>
Chris@49 11295 <li>experimental support for C++11 initialiser lists,
Chris@49 11296 <br>enabled via ARMA_USE_CXX11 in <i>include/armadillo_bits/config.hpp</i></li>
Chris@49 11297 </ul>
Chris@49 11298 <br>
Chris@49 11299 <li>Changed in 2.4:
Chris@49 11300 <ul>
Chris@49 11301 <li>refactored code to eliminate warnings when using the Clang C++ compiler</li>
Chris@49 11302 <li><a href="#Mat">umat</a>, <a href="#Col">uvec</a>, <a href="#min_and_max_member">.min()</a> and <a href="#min_and_max_member">.max()</a>
Chris@49 11303 have been changed to use the <a href="#uword"><i>uword</i></a> type instead of the <i>u32</i> type;
Chris@49 11304 by default the <i>uword</i> and <i>u32</i> types are equivalent (ie. unsigned integer type with a minimum width 32 bits);
Chris@49 11305 however, when the use of 64 bit indices is enabled via ARMA_64BIT_WORD in <i>include/armadillo_bits/config.hpp</i>,
Chris@49 11306 the <i>uword</i> type then has a minimum width of 64 bits
Chris@49 11307 </ul>
Chris@49 11308 </li>
Chris@49 11309 <br>
Chris@49 11310 <li>Added in 2.2:
Chris@49 11311 <ul>
Chris@49 11312 <li><a href="#svd_econ">svd_econ()</a></li>
Chris@49 11313 <li><a href="#toeplitz">circ_toeplitz()</a></li>
Chris@49 11314 <li><a href="#is_vec">.is_colvec()</a> and <a href="#is_vec">.is_rowvec()</a></li>
Chris@49 11315 </ul>
Chris@49 11316 <br>
Chris@49 11317 <li>Added in 2.0:
Chris@49 11318 <ul>
Chris@49 11319 <li><a href="#det">det()</a>, <a href="#inv">inv()</a> and <a href="#solve">solve()</a> can be forced to use more precise algorithms for tiny matrices (&le;&nbsp;4x4)</li>
Chris@49 11320 <li><a href="#syl">syl()</a>, for solving Sylvester's equation</li>
Chris@49 11321 <li><a href="#strans">strans()</a>, for transposing a complex matrix without taking the complex conjugate</li>
Chris@49 11322 <li><a href="#symmat">symmatu()</a> and <a href="#symmat">symmatl()</a></li>
Chris@49 11323 <li>submatrices of <a href="#submat">submatrices</a></li>
Chris@49 11324 <li>faster <a href="#inv">inverse</a> of symmetric positive definite matrices</li>
Chris@49 11325 <li>faster element access for <a href="#adv_constructors_mat_fixed">fixed size</a> matrices</li>
Chris@49 11326 <li>faster multiplication of tiny matrices (eg. 4x4)</li>
Chris@49 11327 <li>faster compound expressions containing <a href="#submat">submatrices</a></li>
Chris@49 11328 <li>handling of arbitrarily sized empty matrices (eg. 5x0)</li>
Chris@49 11329 <li>.count() member function in <a href="#running_stat">running_stat</a> and <a href="#running_stat_vec">running_stat_vec</a></li>
Chris@49 11330 <li><a href="#save_load_mat">loading &amp; saving</a> of matrices as CSV text files</li>
Chris@49 11331 </ul>
Chris@49 11332 <br>
Chris@49 11333 <li>Changed in 2.0:
Chris@49 11334 <ul>
Chris@49 11335 <li><a href="#trans">trans()</a> now takes the complex conjugate when transposing a complex matrix</li>
Chris@49 11336 <li>Forms of
Chris@49 11337 <a href="#chol">chol()</a>, <a href="#eig_sym">eig_sym()</a>, <a href="#eig_gen">eig_gen()</a>,
Chris@49 11338 <a href="#inv">inv()</a>, <a href="#lu">lu()</a>, <a href="#pinv">pinv()</a>, <a href="#princomp">princomp()</a>,
Chris@49 11339 <a href="#qr">qr()</a>, <a href="#solve">solve()</a>, <a href="#svd">svd()</a>, <a href="#syl">syl()</a>
Chris@49 11340 that do not return a bool indicating success now throw <i>std::runtime_error</i> exceptions when failures are detected</li>
Chris@49 11341 <li>princomp_cov() has been removed; <a href="#eig_sym">eig_sym()</a> in conjunction with <a href="#cov">cov()</a> can be used instead</li>
Chris@49 11342 <li><a href="#is_vec">.is_vec()</a> now outputs <i>true</i> for empty vectors (eg. 0x1)</li>
Chris@49 11343 <li>set_log_stream() &amp; get_log_stream() have been replaced by <a href="#logging">set_stream_err1()</a> &amp; <a href="#logging">get_stream_err1()</a></li>
Chris@49 11344 </ul>
Chris@49 11345 <br>
Chris@49 11346 <li>Added in 1.2:
Chris@49 11347 <ul>
Chris@49 11348 <li><a href="#min_and_max_member">.min() &amp; .max()</a> member functions of Mat and Cube</li>
Chris@49 11349 <li><a href="#misc_fns">floor()</a> and <a href="#misc_fns">ceil()</a></li>
Chris@49 11350 <li>representation of &ldquo;not a number&rdquo;: math::nan()</li>
Chris@49 11351 <li>representation of infinity: math::inf()</li>
Chris@49 11352 <li>standalone <a href="#is_finite_standalone">is_finite()</a></li>
Chris@49 11353 <li><a href="#in_range">.in_range()</a> can use <b>span()</b> arguments</li>
Chris@49 11354 <li><a href="#adv_constructors_mat">fixed size</a> matrices and vectors can use auxiliary (external) memory</li>
Chris@49 11355 <li><a href="#submat">submatrices</a> and <a href="#subfield">subfields</a> can be accessed via <i><b>X(</b>&nbsp;<b>span(</b>a,b<b>)</b>,&nbsp;<b>span(</b>c,d<b>)</b>&nbsp;<b>)</b></i></li>
Chris@49 11356 <li><a href="#subcube">subcubes</a> can be accessed via <i><b>X(</b>&nbsp;<b>span(</b>a,b<b>)</b>,&nbsp;<b>span(</b>c,d<b>)</b>,&nbsp;<b>span(</b>e,f<b>)</b>&nbsp;<b>)</b></i></li>
Chris@49 11357 <li>the two argument version of <i><b>span</b></i> can be replaced by
Chris@49 11358 <i><b>span::all</b></i> or <i><b>span()</b></i>, to indicate an entire range
Chris@49 11359 </li>
Chris@49 11360 <li>for cubes, the two argument version of <i><b>span</b></i> can be replaced by
Chris@49 11361 a single argument version, <i><b>span(</b>a<b>)</b></i>, to indicate a single column, row or slice
Chris@49 11362 </li>
Chris@49 11363 <li>arbitrary "flat" subcubes can be interpreted as matrices; for example:
Chris@49 11364 <ul>
Chris@49 11365 <pre>
Chris@49 11366 cube Q = randu&lt;cube&gt;(5,3,4);
Chris@49 11367 mat A = Q(&nbsp;span(1),&nbsp;span(1,2),&nbsp;span::all&nbsp;);
Chris@49 11368 // A has a size of 2x4
Chris@49 11369
Chris@49 11370 vec v = ones&lt;vec&gt;(4);
Chris@49 11371 Q(&nbsp;span(1),&nbsp;span(1),&nbsp;span::all&nbsp;)&nbsp;=&nbsp;v;
Chris@49 11372 </pre>
Chris@49 11373 </ul>
Chris@49 11374 </li>
Chris@49 11375 <li>interpretation of matrices as triangular through <a href="#trimat">trimatu() / trimatl()</a></li>
Chris@49 11376 <li>explicit handling of triangular matrices by <a href="#solve">solve()</a> and <a href="#inv">inv()</a></li>
Chris@49 11377 <li>extended syntax for <a href="#submat">submatrices</a>, including access to elements whose indices are specified in a vector</li>
Chris@49 11378 <li>ability to change the stream used for <a href="#logging">logging</a> of errors and warnings</li>
Chris@49 11379 <li>ability to <a href="#save_load_mat">save/load matrices</a> in raw binary format</li>
Chris@49 11380 <li>cumulative sum function: <a href="#cumsum">cumsum()</a></li>
Chris@49 11381 </ul>
Chris@49 11382 </li>
Chris@49 11383 <br>
Chris@49 11384 <li>
Chris@49 11385 Changed in 1.0 (compared to earlier 0.x development versions):
Chris@49 11386 <ul>
Chris@49 11387 <li>
Chris@49 11388 the 3 argument version of <a href="#lu">lu()</a>,
Chris@49 11389 eg. lu(L,U,X),
Chris@49 11390 provides L and U which should be the same as produced by Octave 3.2
Chris@49 11391 (this was not the case in versions prior to 0.9.90)
Chris@49 11392 </li>
Chris@49 11393 <br>
Chris@49 11394 <li>
Chris@49 11395 rand() has been replaced by <a href="#randu_randn_standalone">randu()</a>;
Chris@49 11396 this has been done to avoid confusion with <a href="http://cplusplus.com/reference/clibrary/cstdlib/rand/">std::rand()</a>,
Chris@49 11397 which generates random numbers in a different interval
Chris@49 11398 </li>
Chris@49 11399 <br>
Chris@49 11400 <li>
Chris@49 11401 In versions earlier than 0.9.0,
Chris@49 11402 some multiplication operations directly converted result matrices with a size of 1x1 into scalars.
Chris@49 11403 This is no longer the case.
Chris@49 11404 If you know the result of an expression will be a 1x1 matrix and wish to treat it as a pure scalar,
Chris@49 11405 use the <a href="#as_scalar">as_scalar()</a> wrapping function
Chris@49 11406 </li>
Chris@49 11407 <br>
Chris@49 11408 <li>
Chris@49 11409 Almost all functions have been placed in the delayed operations framework (for speed purposes).
Chris@49 11410 This may affect code which assumed that the output of some functions was a pure matrix.
Chris@49 11411 The solution is easy, as explained below.
Chris@49 11412 <br>
Chris@49 11413 <br>
Chris@49 11414 In general, Armadillo queues operations before executing them.
Chris@49 11415 As such, the direct output of an operation or function cannot be assumed to be a directly accessible matrix.
Chris@49 11416 The queued operations are executed when the output needs to be stored in a matrix,
Chris@49 11417 eg. <i>mat&nbsp;B&nbsp;=&nbsp;trans(A)</i> or <i>mat&nbsp;B(trans(A))</i>.
Chris@49 11418 If you need to force the execution of the delayed operations,
Chris@49 11419 place the operation or function inside the corresponding Mat constructor.
Chris@49 11420 For example, if your code assumed that the output of some functions was a pure matrix,
Chris@49 11421 eg. <i>chol(m).diag()</i>, change the code to <i>mat(chol(m)).diag()</i>.
Chris@49 11422 Similarly, if you need to pass the result of an operation such as <i>A+B</i> to one of your own functions,
Chris@49 11423 use <i>my_function(&nbsp;mat(A+B)&nbsp;)</i>.
Chris@49 11424 </li>
Chris@49 11425 </ul>
Chris@49 11426 </li>
Chris@49 11427 </ul>
Chris@49 11428 </li>
Chris@49 11429 <br>
Chris@49 11430 <br>
Chris@49 11431 <br>
Chris@49 11432
Chris@49 11433
Chris@49 11434 <!-- END CONTENT -->
Chris@49 11435
Chris@49 11436
Chris@49 11437 <hr>
Chris@49 11438 <br>
Chris@49 11439 <br>
Chris@49 11440
Chris@49 11441 </td>
Chris@49 11442 </tr>
Chris@49 11443 </tbody>
Chris@49 11444 </table>
Chris@49 11445 </center>
Chris@49 11446 </body>
Chris@49 11447 </html>