Hello community,

here is the log from the commit of package armadillo for openSUSE:Factory 
checked in at 2016-10-31 09:56:48
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/armadillo (Old)
 and      /work/SRC/openSUSE:Factory/.armadillo.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "armadillo"

Changes:
--------
--- /work/SRC/openSUSE:Factory/armadillo/armadillo.changes      2016-09-30 
15:33:52.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.armadillo.new/armadillo.changes 2016-10-31 
09:56:50.000000000 +0100
@@ -1,0 +2,8 @@
+Mon Oct 24 13:16:30 UTC 2016 - badshah...@gmail.com
+
+- Update to version 7.500.0:
+  + Expanded qz() to optionally specify ordering of the Schur
+    form.
+  + Expanded .each_slice() to support matrix multiplication.
+
+-------------------------------------------------------------------

Old:
----
  armadillo-7.400.3.tar.xz

New:
----
  armadillo-7.500.0.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ armadillo.spec ++++++
--- /var/tmp/diff_new_pack.96NKpe/_old  2016-10-31 09:56:51.000000000 +0100
+++ /var/tmp/diff_new_pack.96NKpe/_new  2016-10-31 09:56:51.000000000 +0100
@@ -19,7 +19,7 @@
 %define soname libarmadillo7
 
 Name:           armadillo
-Version:        7.400.3
+Version:        7.500.0
 Release:        0
 Summary:        Fast C++ matrix library with interfaces to LAPACK and ATLAS
 License:        MPL-2.0

++++++ armadillo-7.400.3.tar.xz -> armadillo-7.500.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/armadillo-7.400.3/CMakeLists.txt 
new/armadillo-7.500.0/CMakeLists.txt
--- old/armadillo-7.400.3/CMakeLists.txt        2016-06-16 18:16:04.000000000 
+0200
+++ new/armadillo-7.500.0/CMakeLists.txt        2016-06-16 18:16:06.000000000 
+0200
@@ -14,13 +14,9 @@
 
 cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
 
-set(ARMA_MAJOR 7)
-set(ARMA_MINOR 400)
-set(ARMA_PATCH 2)
-set(ARMADILLO_VERSION ${ARMA_MAJOR}.${ARMA_MINOR}.${ARMA_PATCH})
-
-message(STATUS "Configuring Armadillo ${ARMADILLO_VERSION}")
-
+project(armadillo CXX)
+include(CheckIncludeFileCXX)
+include(CheckLibraryExists)
 
 ## Set ARMA_USE_WRAPPER to false if you're getting linking errors when 
compiling your programs,
 ## or if you prefer to directly link with BLAS and/or LAPACK.
@@ -40,12 +36,24 @@
 set(ARMA_USE_EXTERN_CXX11_RNG false)
 set(ARMA_USE_SUPERLU          false)  # Caveat: only SuperLU version 5.x can 
be used!
 
-project(armadillo CXX)
 
-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} 
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_aux/Modules/")
+## extract version from sources
 
-include(CheckIncludeFileCXX)
-include(CheckLibraryExists)
+set(ARMA_VERSION_FILE_NAME 
"${PROJECT_SOURCE_DIR}/include/armadillo_bits/arma_version.hpp")
+
+if(NOT EXISTS ${ARMA_VERSION_FILE_NAME})
+  message(FATAL_ERROR "Can't read ${ARMA_VERSION_FILE_NAME}")
+endif()
+
+file(READ ${ARMA_VERSION_FILE_NAME} ARMA_VERSION_FILE_CONTENTS)
+string(REGEX REPLACE ".*#define ARMA_VERSION_MAJOR ([0-9]+).*" "\\1" 
ARMA_VERSION_MAJOR "${ARMA_VERSION_FILE_CONTENTS}")
+string(REGEX REPLACE ".*#define ARMA_VERSION_MINOR ([0-9]+).*" "\\1" 
ARMA_VERSION_MINOR "${ARMA_VERSION_FILE_CONTENTS}")
+string(REGEX REPLACE ".*#define ARMA_VERSION_PATCH ([0-9]+).*" "\\1" 
ARMA_VERSION_PATCH "${ARMA_VERSION_FILE_CONTENTS}")
+
+message(STATUS "Configuring Armadillo 
${ARMA_VERSION_MAJOR}.${ARMA_VERSION_MINOR}.${ARMA_VERSION_PATCH}")
+
+
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} 
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_aux/Modules/")
 
 
 if(MSVC)
@@ -312,13 +320,13 @@
 
 ## work around a silly limitation in Mac OS X
 if(APPLE)
-  if(${ARMA_MINOR} GREATER 99)
-    math(EXPR ARMA_MINOR_ALT "${ARMA_MINOR} / 10")
+  if(${ARMA_VERSION_MINOR} GREATER 99)
+    math(EXPR ARMA_VERSION_MINOR_ALT "${ARMA_VERSION_MINOR} / 10")
   else()
-    set(ARMA_MINOR_ALT ${ARMA_MINOR})
+    set(ARMA_VERSION_MINOR_ALT ${ARMA_VERSION_MINOR})
   endif()
 else()
-  set(ARMA_MINOR_ALT ${ARMA_MINOR})
+  set(ARMA_VERSION_MINOR_ALT ${ARMA_VERSION_MINOR})
 endif()
 
 
@@ -339,7 +347,7 @@
 
 add_library( armadillo ${PROJECT_SOURCE_DIR}/src/wrapper.cpp )
 target_link_libraries( armadillo ${ARMA_LIBS} )
-set_target_properties(armadillo PROPERTIES VERSION 
${ARMA_MAJOR}.${ARMA_MINOR_ALT}.${ARMA_PATCH} SOVERSION ${ARMA_MAJOR})
+set_target_properties(armadillo PROPERTIES VERSION 
${ARMA_VERSION_MAJOR}.${ARMA_VERSION_MINOR_ALT}.${ARMA_VERSION_PATCH} SOVERSION 
${ARMA_VERSION_MAJOR})
 
 
 
################################################################################
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/armadillo-7.400.3/README.txt 
new/armadillo-7.500.0/README.txt
--- old/armadillo-7.400.3/README.txt    2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/README.txt    2016-06-16 18:16:06.000000000 +0200
@@ -8,33 +8,30 @@
 
  1: Introduction
  2: Citation Details
+ 3: License
 
- 3: Licenses
- 4: Technical Support
+ 4: Requirements
 
- 5: Requirements
+ 5: Linux and Mac OS X: Installation
+ 6: Linux and Mac OS X: Compiling & Linking
 
- 6: Linux and Mac OS X: Installation
- 7: Linux and Mac OS X: Compiling & Linking
+ 7: Windows: Installation
+ 8: Windows: Compiling & Linking
 
- 8: Windows: Installation
- 9: Windows: Compiling & Linking
+ 9: Support for OpenBLAS, Intel MKL and AMD ACML
+10: Support for ATLAS
 
-10: Support for OpenBLAS, Intel MKL and AMD ACML
-11: Support for ATLAS
+11: API Documentation
+12: MEX Interface to Octave/Matlab
 
-12: API Documentation
-13: MEX Interface to Octave/Matlab
-
-14: Bug Reports and Frequently Asked Questions
-15: Related Software
+13: Bug Reports and Frequently Asked Questions
+14: Related Software
 
 
 
 1: Introduction
 ===============
 
-
 Armadillo is a high quality C++ linear algebra library,
 aiming towards a good balance between speed and ease of use.
 
@@ -55,10 +52,7 @@
 The library can be used for machine learning, pattern recognition, computer 
vision,
 signal processing, bioinformatics, statistics, econometrics, etc.
 
-Armadillo is primarily developed at Data61 / NICTA (Australia).
-For information about Data61 see http://data61.csiro.au
-
-Main developers:
+Authors:
   Conrad Sanderson - http://conradsanderson.id.au
   Ryan Curtin      - http://ratml.org
 
@@ -77,30 +71,15 @@
 
 
 
-3: Licenses
-===========
+3: License
+==========
 
-Armadillo is available under 2 licenses:
-
-- Open source, under the restrictions of the Mozilla Public License (MPL) 2.0.
-  See the "LICENSE.txt" file for details.
-  
-- Commercial license (not open source), available for purchase.
-  Please contact Conrad Sanderson for more information:
-  http://conradsanderson.id.au
+Armadillo is available as open source, under the restrictions of the
+Mozilla Public License (MPL) 2.0. See the "LICENSE.txt" file for details.
 
 
 
-4: Technical Support
-====================
-
-Technical support can be obtained by purchasing the commercial license (see 
above).
-Please contact Conrad Sanderson for more information:
-http://conradsanderson.id.au
-
-
-
-5: Requirements
+4: Requirements
 ===============
 
 Armadillo makes extensive use of template meta-programming, recursive templates
@@ -122,7 +101,7 @@
 
 
 
-6: Linux and Mac OS X: Installation
+5: Linux and Mac OS X: Installation
 ===================================
 
 * Step 1:
@@ -195,7 +174,7 @@
 
 
 
-7: Linux and Mac OS X: Compiling & Linking
+6: Linux and Mac OS X: Compiling & Linking
 ==========================================
 
 The "examples" directory contains several quick example programs
@@ -219,7 +198,7 @@
 
 
 
-8: Windows: Installation
+7: Windows: Installation
 ========================
 
 The installation is comprised of 3 steps:
@@ -249,7 +228,7 @@
 
 
 
-9: Windows: Compiling & Linking
+8: Windows: Compiling & Linking
 ===============================
 
 Within the "examples" folder, we have included an MSVC project named 
"example1_win64"
@@ -299,8 +278,8 @@
 
 
 
-10: Support for OpenBLAS, Intel MKL and AMD ACML
-================================================
+9: Support for OpenBLAS, Intel MKL and AMD ACML
+===============================================
 
 Armadillo can use OpenBLAS, or Intel Math Kernel Library (MKL),
 or the AMD Core Math Library (ACML) as high-speed replacements
@@ -357,7 +336,7 @@
 
 
 
-11: Support for ATLAS
+10: Support for ATLAS
 =====================
 
 Armadillo can use the ATLAS library for faster versions of
@@ -374,7 +353,7 @@
 
 
 
-12: API Documentation
+11: API Documentation
 =====================
 
 Documentation of functions and classes is available at:
@@ -386,7 +365,7 @@
 
 
 
-13: MEX Interface to Octave/Matlab
+12: MEX Interface to Octave/Matlab
 ==================================
 
 The "mex_interface" folder contains examples of how to interface
@@ -394,7 +373,7 @@
 
 
 
-14: Bug Reports and Frequently Asked Questions
+13: Bug Reports and Frequently Asked Questions
 ==============================================
 
 Answers to frequently asked questions can be found at:
@@ -416,15 +395,12 @@
 
 
 
-15: Related Software
+14: Related Software
 ====================
 
 * MLPACK: C++ library for machine learning and pattern recognition, built on 
top of Armadillo.
   http://mlpack.org
   
-* Mantella: C++ library for analysing and solving optimisation problems
-  https://github.com/SebastianNiemann/Mantella
-  
 * libpca: C++ library for principal component analysis
   http://sourceforge.net/projects/libpca/
   
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/armadillo-7.400.3/docs.html 
new/armadillo-7.500.0/docs.html
--- old/armadillo-7.400.3/docs.html     2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/docs.html     2016-06-16 18:16:06.000000000 +0200
@@ -144,7 +144,7 @@
 <!--  -->
 <a class="noprint" style="display:scroll; position:fixed; bottom:5px; 
right:5px;" href="#top"><font size=-1>[top]</font></a>
 
-<big><b>API Documentation for Armadillo 7.400</b></big>
+<big><b>API Documentation for Armadillo 7.500</b></big>
 <br>
 <br>
 <br>
@@ -156,7 +156,7 @@
 <table border="0" cellpadding="0" cellspacing="0">
 <tbody>
 <tr>
-<td style="text-align: left; vertical-align: top; width: 50%;">
+<td style="text-align: left; vertical-align: top; width: 45%;">
 <ul>
 <li>
 For converting Matlab/Octave programs,
@@ -182,7 +182,7 @@
 <td class="line" style="vertical-align: top;">
 <br>
 </td>
-<td style="text-align: left; vertical-align: top; width: 45%;">
+<td style="text-align: left; vertical-align: top; width: 50%;">
 <ul>
 <li>
 Please cite the following article if you use Armadillo in your research and/or 
software.
@@ -195,13 +195,6 @@
 <br>Journal of Open Source Software, Vol.&nbsp;1, pp.&nbsp;26, 2016.
 </font>
 </li>
-<!--
-<br>
-<li>
-If you use Armadillo in products,
-please obtain the <a 
href="http://arma.sourceforge.net/faq.html#licenses";>commercial license</a>
-</li>
--->
 </ul>
 </td>
 </tr>
@@ -3867,11 +3860,11 @@
 </li>
 <br>
 <li>
-Repeat a matrix operation on each slice of a cube
+Repeat a matrix operation on each slice of a cube, with each slice treated as 
a matrix
 </li>
 <br>
 <li>
-Supported operations for <i>.each_slice()</i> and 
<i>.each_slice(vector_of_indices)</i> forms:
+Supported operations for the <i>.each_slice()</i> form:
 <br>
 <br>
 <ul>
@@ -3880,11 +3873,16 @@
 
<tr><td><code><b>-</b></code></td><td>&nbsp;</td><td>subtraction</td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td><code><b>-=</b></code></td><td>&nbsp;</td><td>in-place
 subtraction</td></tr>
 <tr><td><code><b>%</b></code></td><td>&nbsp;</td><td>element-wise 
multiplication</td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td><code><b>%=</b></code></td><td>&nbsp;</td><td>in-place
 element-wise multiplication</td></tr>
 <tr><td><code><b>/</b></code></td><td>&nbsp;</td><td>element-wise 
division</td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td><code><b>/=</b></code></td><td>&nbsp;</td><td>in-place
 element-wise division</td></tr>
+<tr><td><code><b>*</b></code></td><td>&nbsp;</td><td>matrix 
multiplication</td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td><code><b>*=</b></code></td><td>&nbsp;</td><td>in-place
 matrix multiplication</td></tr>
 <tr><td><code><b>=</b></code></td><td>&nbsp;</td><td>assignment 
(copy)</td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
 </table>
 </ul>
 </li>
 <br>
+<li>
+The <i>.each_slice(vector_of_indices)</i> form also supports the above 
operations, except for <code><b>*</b></code> and <code><b>*=</b></code> (ie. 
matrix multiplication)
+</li>
+<br>
 <li>The argument <i>vector_of_indices</i> is optional; by default all slices 
are used</li>
 <br>
 <li>
@@ -7096,9 +7094,7 @@
 </li>
 <br>
 <li>
-If a binary or trinary expression is given (ie. 2 or 3 terms),
-the function will try to exploit the fact that the result is a 1x1 matrix
-by using optimised expression evaluations
+Optimised expression evaluations are automatically used when a binary or 
trinary expression is given (ie. 2 or 3 terms)
 </li>
 <br>
 <li>
@@ -7109,8 +7105,7 @@
 colvec q = randu&lt;colvec&gt;(5);
 mat    X = randu&lt;mat&gt;(5,5);
 
-// examples of some expressions
-// for which optimised implementations exist
+// examples of expressions which have optimised implementations
 
 double a = as_scalar(r*q);
 double b = as_scalar(r*X*q);
@@ -10875,12 +10870,28 @@
 <div class="pagebreak"></div><div class="noprint"><hr 
class="greyline"><br></div>
 <a name="qz"></a>
 <b>qz( AA, BB, Q, Z, A, B )</b>
+<br><b>qz( AA, BB, Q, Z, A, B, select )</b>
 <ul>
 <li>
 Generalised Schur decomposition for pair of general square matrices <i>A</i> 
and <i>B</i> of the same size,
 <br>such that <i>A&nbsp;=&nbsp;Q.t()*AA*Z.t()</i> and 
<i>B&nbsp;=&nbsp;Q.t()*BB*Z.t()</i>
 </li>
 <br>
+<li>The <i>select</i> argument is optional and specifies the ordering of the 
top left of the Schur form; it is one of the following:
+<br>
+<ul>
+<table>
+<tbody>
+<tr><td><code>"none"</code></td><td>&nbsp;&nbsp;&nbsp;</td><td>no selection 
(default operation)</td></tr>
+<tr><td><code>"lhp"</code></td><td>&nbsp;&nbsp;&nbsp;</td><td>left-half-plane: 
eigenvalues with real part &lt; 0</td></tr>
+<tr><td><code>"rhp"</code></td><td>&nbsp;&nbsp;&nbsp;</td><td>right-half-plane:
 eigenvalues with real part &gt; 0</td></tr>
+<tr><td><code>"iuc"</code></td><td>&nbsp;&nbsp;&nbsp;</td><td>inside-unit-circle:
 eigenvalues with absolute value &lt; 1</td></tr>
+<tr><td><code>"ouc"</code></td><td>&nbsp;&nbsp;&nbsp;</td><td>outside-unit-circle:
 eigenvalues with absolute value &gt; 1</td></tr>
+</tbody>
+</table>
+</ul>
+</li>
+<br>
 <li>The left and right Schur vectors are stored in <i>Q</i> and <i>Z</i>, 
respectively</li>
 <br>
 <li>In the complex-valued problem, the generalised eigenvalues are found in 
<i>diagvec(AA) / diagvec(BB)</i></li>
@@ -15121,6 +15132,29 @@
 <tbody>
   <tr>
     <td style="vertical-align: top;">
+<code>ARMA_DONT_USE_WRAPPER</code>
+    </td>
+    <td style="vertical-align: top;">
+      &nbsp;
+    </td>
+    <td style="vertical-align: top;">
+Disable going through the run-time Armadillo wrapper library 
(<i>libarmadillo.so</i>) when calling LAPACK, BLAS, ARPACK, SuperLU and HDF5 
functions.
+You will need to directly link with BLAS, LAPACK, etc (eg. <i>-lblas -llapack 
</i>)
+    </td>
+  </tr>
+  <tr>
+    <td style="vertical-align: top;">
+      &nbsp;
+    </td>
+    <td style="vertical-align: top;">
+      &nbsp;
+    </td>
+    <td style="vertical-align: top;">
+      &nbsp;
+    </td>
+  </tr>
+  <tr>
+    <td style="vertical-align: top;">
 <code>ARMA_USE_LAPACK</code>
     </td>
     <td style="vertical-align: top;">
@@ -15394,29 +15428,6 @@
   </tr>
   <tr>
     <td style="vertical-align: top;">
-<code>ARMA_DONT_USE_WRAPPER</code>
-    </td>
-    <td style="vertical-align: top;">
-      &nbsp;
-    </td>
-    <td style="vertical-align: top;">
-Disable going through the run-time Armadillo wrapper library 
(<i>libarmadillo.so</i>) when calling LAPACK, BLAS, ARPACK, SuperLU and HDF5 
functions.
-You will need to directly link with LAPACK, BLAS, etc (eg. <i>-llapack 
-lblas</i>)
-    </td>
-  </tr>
-  <tr>
-    <td style="vertical-align: top;">
-      &nbsp;
-    </td>
-    <td style="vertical-align: top;">
-      &nbsp;
-    </td>
-    <td style="vertical-align: top;">
-      &nbsp;
-    </td>
-  </tr>
-  <tr>
-    <td style="vertical-align: top;">
 <a name="config_hpp_arma_use_cxx11"></a>
 <code>ARMA_USE_CXX11</code>
     </td>
@@ -15891,6 +15902,14 @@
 <br>
 <ul>
 
+<a name="version_7500"></a>
+<li>Version 7.500:
+<ul>
+<li>expanded <a href="#qz">qz()</a> to optionally specify ordering of the 
Schur form</li>
+<li>expanded <a href="#each_slice">each_slice()</a> to support matrix 
multiplication</li>
+</ul>
+</li>
+<br>
 <a name="version_7400"></a>
 <li>Version 7.400:
 <ul>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/armadillo-7.400.3/include/armadillo_bits/Mat_meat.hpp 
new/armadillo-7.500.0/include/armadillo_bits/Mat_meat.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/Mat_meat.hpp   2016-06-16 
18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/Mat_meat.hpp   2016-06-16 
18:16:06.000000000 +0200
@@ -3877,7 +3877,7 @@
     
     for(uword ii=0; ii < n_cols; ++ii)
       {
-      const Col<eT> tmp(colptr(ii), n_rows, false, true);
+      const Col<eT> tmp(const_cast<eT*>(colptr(ii)), n_rows, false, true);
       F(tmp);
       }
     
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/armadillo-7.400.3/include/armadillo_bits/arma_version.hpp 
new/armadillo-7.500.0/include/armadillo_bits/arma_version.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/arma_version.hpp       
2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/arma_version.hpp       
2016-06-16 18:16:06.000000000 +0200
@@ -14,9 +14,9 @@
 
 
 #define ARMA_VERSION_MAJOR 7
-#define ARMA_VERSION_MINOR 400
-#define ARMA_VERSION_PATCH 3
-#define ARMA_VERSION_NAME  "Feral Winter Deluxe"
+#define ARMA_VERSION_MINOR 500
+#define ARMA_VERSION_PATCH 0
+#define ARMA_VERSION_NAME  "Coup d'Etat"
 
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/armadillo-7.400.3/include/armadillo_bits/arrayops_meat.hpp 
new/armadillo-7.500.0/include/armadillo_bits/arrayops_meat.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/arrayops_meat.hpp      
2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/arrayops_meat.hpp      
2016-06-16 18:16:06.000000000 +0200
@@ -19,7 +19,7 @@
 void
 arrayops::copy(eT* dest, const eT* src, const uword n_elem)
   {
-  if( (n_elem <= 16) && (is_cx<eT>::no) )
+  if( (n_elem <= 9) && (is_cx<eT>::no) )
     {
     arrayops::copy_small(dest, src, n_elem);
     }
@@ -39,13 +39,6 @@
   {
   switch(n_elem)
     {
-    case 16:  dest[15] = src[15];
-    case 15:  dest[14] = src[14];
-    case 14:  dest[13] = src[13];
-    case 13:  dest[12] = src[12];
-    case 12:  dest[11] = src[11];
-    case 11:  dest[10] = src[10];
-    case 10:  dest[ 9] = src[ 9];
     case  9:  dest[ 8] = src[ 8];
     case  8:  dest[ 7] = src[ 7];
     case  7:  dest[ 6] = src[ 6];
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/armadillo-7.400.3/include/armadillo_bits/auxlib_bones.hpp 
new/armadillo-7.500.0/include/armadillo_bits/auxlib_bones.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/auxlib_bones.hpp       
2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/auxlib_bones.hpp       
2016-06-16 18:16:06.000000000 +0200
@@ -260,10 +260,10 @@
   // QZ decomposition
   
   template<typename T, typename T1, typename T2>
-  inline static bool qz(Mat<T>& A, Mat<T>& B, Mat<T>& vsl, Mat<T>& vsr, const 
Base<T,T1>& X_expr, const Base<T,T2>& Y_expr);
+  inline static bool qz(Mat<T>& A, Mat<T>& B, Mat<T>& vsl, Mat<T>& vsr, const 
Base<T,T1>& X_expr, const Base<T,T2>& Y_expr, const char mode);
   
   template<typename T, typename T1, typename T2>
-  inline static bool qz(Mat< std::complex<T> >& A, Mat< std::complex<T> >& B, 
Mat< std::complex<T> >& vsl, Mat< std::complex<T> >& vsr, const Base< 
std::complex<T>, T1 >& X_expr, const Base< std::complex<T>, T2 >& Y_expr);
+  inline static bool qz(Mat< std::complex<T> >& A, Mat< std::complex<T> >& B, 
Mat< std::complex<T> >& vsl, Mat< std::complex<T> >& vsr, const Base< 
std::complex<T>, T1 >& X_expr, const Base< std::complex<T>, T2 >& Y_expr, const 
char mode);
   
   
   // 
@@ -277,4 +277,22 @@
   };
 
 
+
+namespace qz_helper
+  {
+  template<typename T> inline blas_int select_lhp(const T* x_ptr, const T* 
y_ptr, const T* z_ptr);
+  template<typename T> inline blas_int select_rhp(const T* x_ptr, const T* 
y_ptr, const T* z_ptr);
+  template<typename T> inline blas_int select_iuc(const T* x_ptr, const T* 
y_ptr, const T* z_ptr);
+  template<typename T> inline blas_int select_ouc(const T* x_ptr, const T* 
y_ptr, const T* z_ptr);
+  
+  template<typename T> inline blas_int cx_select_lhp(const std::complex<T>* 
x_ptr, const std::complex<T>* y_ptr);
+  template<typename T> inline blas_int cx_select_rhp(const std::complex<T>* 
x_ptr, const std::complex<T>* y_ptr);
+  template<typename T> inline blas_int cx_select_iuc(const std::complex<T>* 
x_ptr, const std::complex<T>* y_ptr);
+  template<typename T> inline blas_int cx_select_ouc(const std::complex<T>* 
x_ptr, const std::complex<T>* y_ptr);
+  
+  template<typename T> inline void_ptr ptr_cast(blas_int (*function)(const T*, 
const T*, const T*));
+  template<typename T> inline void_ptr ptr_cast(blas_int (*function)(const 
std::complex<T>*, const std::complex<T>*));
+  }
+
+
 //! @}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/armadillo-7.400.3/include/armadillo_bits/auxlib_meat.hpp 
new/armadillo-7.500.0/include/armadillo_bits/auxlib_meat.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/auxlib_meat.hpp        
2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/auxlib_meat.hpp        
2016-06-16 18:16:06.000000000 +0200
@@ -3885,7 +3885,7 @@
 template<typename T, typename T1, typename T2>
 inline
 bool
-auxlib::qz(Mat<T>& A, Mat<T>& B, Mat<T>& vsl, Mat<T>& vsr, const Base<T,T1>& 
X_expr, const Base<T,T2>& Y_expr)
+auxlib::qz(Mat<T>& A, Mat<T>& B, Mat<T>& vsl, Mat<T>& vsr, const Base<T,T1>& 
X_expr, const Base<T,T2>& Y_expr, const char mode)
   {
   arma_extra_debug_sigprint();
   
@@ -3921,6 +3921,11 @@
     blas_int lwork   = 3 * ((std::max)(blas_int(1),8*N+16));
     blas_int info    = 0;
     
+         if(mode == 'l')  { eigsort = 'S'; selctg = 
qz_helper::ptr_cast(&(qz_helper::select_lhp<T>)); }
+    else if(mode == 'r')  { eigsort = 'S'; selctg = 
qz_helper::ptr_cast(&(qz_helper::select_rhp<T>)); }
+    else if(mode == 'i')  { eigsort = 'S'; selctg = 
qz_helper::ptr_cast(&(qz_helper::select_iuc<T>)); }
+    else if(mode == 'o')  { eigsort = 'S'; selctg = 
qz_helper::ptr_cast(&(qz_helper::select_ouc<T>)); }
+    
     podarray<T> alphar(A.n_rows);
     podarray<T> alphai(A.n_rows);
     podarray<T>   beta(A.n_rows);
@@ -3952,6 +3957,7 @@
     arma_ignore(vsr);
     arma_ignore(X_expr);
     arma_ignore(Y_expr);
+    arma_ignore(mode);
     arma_stop_logic_error("qz(): use of LAPACK must be enabled");
     return false;
     }
@@ -3966,7 +3972,7 @@
 template<typename T, typename T1, typename T2>
 inline
 bool
-auxlib::qz(Mat< std::complex<T> >& A, Mat< std::complex<T> >& B, Mat< 
std::complex<T> >& vsl, Mat< std::complex<T> >& vsr, const Base< 
std::complex<T>, T1 >& X_expr, const Base< std::complex<T>, T2 >& Y_expr)
+auxlib::qz(Mat< std::complex<T> >& A, Mat< std::complex<T> >& B, Mat< 
std::complex<T> >& vsl, Mat< std::complex<T> >& vsr, const Base< 
std::complex<T>, T1 >& X_expr, const Base< std::complex<T>, T2 >& Y_expr, const 
char mode)
   {
   arma_extra_debug_sigprint();
   
@@ -4015,6 +4021,11 @@
     blas_int lwork   = 3 * ((std::max)(blas_int(1),2*N));
     blas_int info    = 0;
     
+         if(mode == 'l')  { eigsort = 'S'; selctg = 
qz_helper::ptr_cast(&(qz_helper::cx_select_lhp<T>)); }
+    else if(mode == 'r')  { eigsort = 'S'; selctg = 
qz_helper::ptr_cast(&(qz_helper::cx_select_rhp<T>)); }
+    else if(mode == 'i')  { eigsort = 'S'; selctg = 
qz_helper::ptr_cast(&(qz_helper::cx_select_iuc<T>)); }
+    else if(mode == 'o')  { eigsort = 'S'; selctg = 
qz_helper::ptr_cast(&(qz_helper::cx_select_ouc<T>)); }
+    
     podarray<eT> alpha(A.n_rows);
     podarray<eT>  beta(A.n_rows);
     
@@ -4046,6 +4057,7 @@
     arma_ignore(vsr);
     arma_ignore(X_expr);
     arma_ignore(Y_expr);
+    arma_ignore(mode);
     arma_stop_logic_error("qz(): use of LAPACK must be enabled");
     return false;
     }
@@ -4166,4 +4178,248 @@
 
 
 
+//
+
+
+
+namespace qz_helper
+{
+
+// sgges() and dgges() require an external function with three arguments:
+// select(alpha_real, alpha_imag, beta)
+// where the eigenvalue is defined as complex(alpha_real, alpha_imag) / beta
+
+template<typename T>
+inline
+blas_int
+select_lhp(const T* x_ptr, const T* y_ptr, const T* z_ptr)
+  {
+  arma_extra_debug_sigprint();
+  
+  // cout << "select_lhp(): (*x_ptr) = " << (*x_ptr) << endl;
+  // cout << "select_lhp(): (*y_ptr) = " << (*y_ptr) << endl;
+  // cout << "select_lhp(): (*z_ptr) = " << (*z_ptr) << endl;
+  
+  arma_ignore(y_ptr);  // ignore imaginary part
+  
+  const T x = (*x_ptr);
+  const T z = (*z_ptr);
+  
+  if(z == T(0))  { return blas_int(0); }  // consider an infinite eig value 
not to lie in either lhp or rhp
+  
+  return ((x/z) < T(0)) ? blas_int(1) : blas_int(0);
+  }
+
+
+
+template<typename T>
+inline
+blas_int
+select_rhp(const T* x_ptr, const T* y_ptr, const T* z_ptr)
+  {
+  arma_extra_debug_sigprint();
+  
+  // cout << "select_rhp(): (*x_ptr) = " << (*x_ptr) << endl;
+  // cout << "select_rhp(): (*y_ptr) = " << (*y_ptr) << endl;
+  // cout << "select_rhp(): (*z_ptr) = " << (*z_ptr) << endl;
+  
+  arma_ignore(y_ptr);  // ignore imaginary part
+  
+  const T x = (*x_ptr);
+  const T z = (*z_ptr);
+  
+  if(z == T(0))  { return blas_int(0); }  // consider an infinite eig value 
not to lie in either lhp or rhp
+  
+  return ((x/z) > T(0)) ? blas_int(1) : blas_int(0);
+  }
+
+
+
+template<typename T>
+inline
+blas_int
+select_iuc(const T* x_ptr, const T* y_ptr, const T* z_ptr)
+  {
+  arma_extra_debug_sigprint();
+  
+  // cout << "select_iuc(): (*x_ptr) = " << (*x_ptr) << endl;
+  // cout << "select_iuc(): (*y_ptr) = " << (*y_ptr) << endl;
+  // cout << "select_iuc(): (*z_ptr) = " << (*z_ptr) << endl;
+  
+  const T x = (*x_ptr);
+  const T y = (*y_ptr);
+  const T z = (*z_ptr);
+  
+  if(z == T(0))  { return blas_int(0); }  // consider an infinite eig value to 
be outside of the unit circle 
+  
+  //return (std::abs(std::complex<T>(x,y) / z) < T(1)) ? blas_int(1) : 
blas_int(0);
+  return (std::sqrt(x*x + y*y) < std::abs(z)) ? blas_int(1) : blas_int(0);
+  }
+
+
+
+template<typename T>
+inline
+blas_int
+select_ouc(const T* x_ptr, const T* y_ptr, const T* z_ptr)
+  {
+  arma_extra_debug_sigprint();
+  
+  // cout << "select_ouc(): (*x_ptr) = " << (*x_ptr) << endl;
+  // cout << "select_ouc(): (*y_ptr) = " << (*y_ptr) << endl;
+  // cout << "select_ouc(): (*z_ptr) = " << (*z_ptr) << endl;
+  
+  const T x = (*x_ptr);
+  const T y = (*y_ptr);
+  const T z = (*z_ptr);
+  
+  if(z == T(0))
+    {
+    return (x == T(0)) ? blas_int(0) : blas_int(1);  // consider an infinite 
eig value to be outside of the unit circle 
+    }
+  
+  //return (std::abs(std::complex<T>(x,y) / z) > T(1)) ? blas_int(1) : 
blas_int(0);
+  return (std::sqrt(x*x + y*y) > std::abs(z)) ? blas_int(1) : blas_int(0);
+  }
+
+
+
+// cgges() and zgges() require an external function with two arguments:
+// select(alpha, beta)
+// where the complex eigenvalue is defined as (alpha / beta)
+
+template<typename T>
+inline
+blas_int
+cx_select_lhp(const std::complex<T>* x_ptr, const std::complex<T>* y_ptr)
+  {
+  arma_extra_debug_sigprint();
+  
+  // cout << "cx_select_lhp(): (*x_ptr) = " << (*x_ptr) << endl;
+  // cout << "cx_select_lhp(): (*y_ptr) = " << (*y_ptr) << endl;
+  
+  const std::complex<T>& x = (*x_ptr);
+  const std::complex<T>& y = (*y_ptr);
+  
+  if( (y.real() == T(0)) && (y.imag() == T(0)) )  { return blas_int(0); }  // 
consider an infinite eig value not to lie in either lhp or rhp
+  
+  return (std::real(x / y) < T(0)) ? blas_int(1) : blas_int(0);
+  }
+
+
+
+template<typename T>
+inline
+blas_int
+cx_select_rhp(const std::complex<T>* x_ptr, const std::complex<T>* y_ptr)
+  {
+  arma_extra_debug_sigprint();
+  
+  // cout << "cx_select_rhp(): (*x_ptr) = " << (*x_ptr) << endl;
+  // cout << "cx_select_rhp(): (*y_ptr) = " << (*y_ptr) << endl;
+  
+  const std::complex<T>& x = (*x_ptr);
+  const std::complex<T>& y = (*y_ptr);
+  
+  if( (y.real() == T(0)) && (y.imag() == T(0)) )  { return blas_int(0); }  // 
consider an infinite eig value not to lie in either lhp or rhp
+  
+  return (std::real(x / y) > T(0)) ? blas_int(1) : blas_int(0);
+  }
+
+
+
+template<typename T>
+inline
+blas_int
+cx_select_iuc(const std::complex<T>* x_ptr, const std::complex<T>* y_ptr)
+  {
+  arma_extra_debug_sigprint();
+  
+  // cout << "cx_select_iuc(): (*x_ptr) = " << (*x_ptr) << endl;
+  // cout << "cx_select_iuc(): (*y_ptr) = " << (*y_ptr) << endl;
+  
+  const std::complex<T>& x = (*x_ptr);
+  const std::complex<T>& y = (*y_ptr);
+  
+  if( (y.real() == T(0)) && (y.imag() == T(0)) )  { return blas_int(0); }  // 
consider an infinite eig value to be outside of the unit circle
+  
+  return (std::abs(x / y) < T(1)) ? blas_int(1) : blas_int(0);
+  }
+
+
+
+template<typename T>
+inline
+blas_int
+cx_select_ouc(const std::complex<T>* x_ptr, const std::complex<T>* y_ptr)
+  {
+  arma_extra_debug_sigprint();
+  
+  // cout << "cx_select_ouc(): (*x_ptr) = " << (*x_ptr) << endl;
+  // cout << "cx_select_ouc(): (*y_ptr) = " << (*y_ptr) << endl;
+  
+  const std::complex<T>& x = (*x_ptr);
+  const std::complex<T>& y = (*y_ptr);
+  
+  if( (y.real() == T(0)) && (y.imag() == T(0)) )
+    {
+    return ((x.real() == T(0)) && (x.imag() == T(0))) ? blas_int(0) : 
blas_int(1);  // consider an infinite eig value to be outside of the unit circle
+    }
+  
+  return (std::abs(x / y) > T(1)) ? blas_int(1) : blas_int(0);
+  }
+
+
+
+// need to do shenanigans with pointers due to:
+// - we're using LAPACK ?gges() defined to expect pointer-to-function to be 
passed as pointer-to-object
+// - explicit casting between pointer-to-function and pointer-to-object is a 
non-standard extension in C
+// - the extension is essentially mandatory on POSIX systems
+// - some compilers will complain about the extension in pedantic mode
+
+template<typename T>
+inline
+void_ptr
+ptr_cast(blas_int (*function)(const T*, const T*, const T*))
+  {
+  union converter
+    {
+    blas_int (*fn)(const T*, const T*, const T*);
+    void_ptr obj;
+    };
+  
+  converter tmp;
+  
+  tmp.obj = 0;
+  tmp.fn  = function;
+  
+  return tmp.obj;
+  }
+
+
+
+template<typename T>
+inline
+void_ptr
+ptr_cast(blas_int (*function)(const std::complex<T>*, const std::complex<T>*))
+  {
+  union converter
+    {
+    blas_int (*fn)(const std::complex<T>*, const std::complex<T>*);
+    void_ptr obj;
+    };
+  
+  converter tmp;
+  
+  tmp.obj = 0;
+  tmp.fn  = function;
+  
+  return tmp.obj;
+  }
+
+
+
+}  // end of namespace qz_helper
+
+
 //! @}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/fn_elem.hpp 
new/armadillo-7.500.0/include/armadillo_bits/fn_elem.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/fn_elem.hpp    2016-06-16 
18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/fn_elem.hpp    2016-06-16 
18:16:06.000000000 +0200
@@ -441,6 +441,12 @@
 
 
 //
+//
+// TODO: arg (C++11)
+
+
+
+//
 // square
 
 template<typename T1>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/fn_qz.hpp 
new/armadillo-7.500.0/include/armadillo_bits/fn_qz.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/fn_qz.hpp      2016-06-16 
18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/fn_qz.hpp      2016-06-16 
18:16:06.000000000 +0200
@@ -1,4 +1,4 @@
-// Copyright (C) 2015 National ICT Australia (NICTA)
+// Copyright (C) 2015-2016 National ICT Australia (NICTA)
 // 
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -30,12 +30,17 @@
          Mat<typename T1::elem_type>&    Q,
          Mat<typename T1::elem_type>&    Z,
   const Base<typename T1::elem_type,T1>& A_expr,
-  const Base<typename T1::elem_type,T2>& B_expr
+  const Base<typename T1::elem_type,T2>& B_expr,
+  const char*                            select = "none"
   )
   {
   arma_extra_debug_sigprint();
   
-  const bool status = auxlib::qz(AA, BB, Q, Z, A_expr.get_ref(), 
B_expr.get_ref());
+  const char sig = (select != NULL) ? select[0] : char(0);
+  
+  arma_debug_check( ( (sig != 'n') && (sig != 'l') && (sig != 'r') && (sig != 
'i') && (sig != 'o') ), "qz(): unknown select form" );
+  
+  const bool status = auxlib::qz(AA, BB, Q, Z, A_expr.get_ref(), 
B_expr.get_ref(), sig);
   
   if(status == false)
     {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/armadillo-7.400.3/include/armadillo_bits/operator_cube_times.hpp 
new/armadillo-7.500.0/include/armadillo_bits/operator_cube_times.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/operator_cube_times.hpp        
2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/operator_cube_times.hpp        
2016-06-16 18:16:06.000000000 +0200
@@ -1,4 +1,4 @@
-// Copyright (C) 2008-2010 National ICT Australia (NICTA)
+// Copyright (C) 2008-2016 National ICT Australia (NICTA)
 // 
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -80,5 +80,37 @@
   }
 
 
+
+template<typename eT, typename T2>
+arma_inline
+Cube<eT>
+operator*
+  (
+  const subview_cube_each1<eT>& X,
+  const Base<eT,T2>&            Y
+  )
+  {
+  arma_extra_debug_sigprint();
+  
+  return subview_cube_each1_aux::operator_times(X, Y.get_ref());
+  }
+
+
+
+template<typename T1, typename eT>
+arma_inline
+Cube<eT>
+operator*
+  (
+  const Base<eT,T1>&            X,
+  const subview_cube_each1<eT>& Y
+  )
+  {
+  arma_extra_debug_sigprint();
+  
+  return subview_cube_each1_aux::operator_times(X.get_ref(), Y);
+  }
+
+
 
 //! @}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/armadillo-7.400.3/include/armadillo_bits/subview_cube_each_bones.hpp 
new/armadillo-7.500.0/include/armadillo_bits/subview_cube_each_bones.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/subview_cube_each_bones.hpp    
2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/subview_cube_each_bones.hpp    
2016-06-16 18:16:06.000000000 +0200
@@ -1,4 +1,4 @@
-// Copyright (C) 2015 National ICT Australia (NICTA)
+// Copyright (C) 2015-2016 National ICT Australia (NICTA)
 // 
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -56,6 +56,7 @@
   template<typename T1> inline void operator-= (const Base<eT,T1>& x);
   template<typename T1> inline void operator%= (const Base<eT,T1>& x);
   template<typename T1> inline void operator/= (const Base<eT,T1>& x);
+  template<typename T1> inline void operator*= (const Base<eT,T1>& x);
   
   
   private:
@@ -116,6 +117,12 @@
   
   template<typename T1, typename eT>
   static inline Cube<eT> operator_div(const Base<eT,T1>& X, const 
subview_cube_each1<eT>& Y);
+  
+  template<typename eT, typename T2>
+  static inline Cube<eT> operator_times(const subview_cube_each1<eT>& X,const 
Base<eT,T2>& Y);
+  
+  template<typename T1, typename eT>
+  static inline Cube<eT> operator_times(const Base<eT,T1>& X, const 
subview_cube_each1<eT>& Y);
   };
 
 
@@ -141,6 +148,8 @@
   
   template<typename T1, typename eT, typename TB>
   static inline Cube<eT> operator_div(const Base<eT,T1>& X, const 
subview_cube_each2<eT,TB>& Y);
+  
+  // TODO: operator_times
   };
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/armadillo-7.400.3/include/armadillo_bits/subview_cube_each_meat.hpp 
new/armadillo-7.500.0/include/armadillo_bits/subview_cube_each_meat.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/subview_cube_each_meat.hpp     
2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/subview_cube_each_meat.hpp     
2016-06-16 18:16:06.000000000 +0200
@@ -1,4 +1,4 @@
-// Copyright (C) 2015 National ICT Australia (NICTA)
+// Copyright (C) 2015-2016 National ICT Australia (NICTA)
 // 
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -207,6 +207,21 @@
 
 
 
+template<typename eT>
+template<typename T1>
+inline
+void
+subview_cube_each1<eT>::operator*= (const Base<eT,T1>& in)
+  {
+  arma_extra_debug_sigprint();
+  
+  Cube<eT>& C = access::rw(subview_cube_each_common<eT>::P);
+  
+  C = C.each_slice() * in.get_ref();
+  }
+
+
+
 //
 //
 // subview_cube_each2
@@ -662,6 +677,68 @@
     }
   
   return out;
+  }
+
+
+
+template<typename eT, typename T2>
+inline
+Cube<eT>
+subview_cube_each1_aux::operator_times
+  (
+  const subview_cube_each1<eT>& X,
+  const Base<eT,T2>&            Y
+  )
+  {
+  arma_extra_debug_sigprint();
+  
+  const Cube<eT>& C = X.P;
+  
+  const unwrap<T2>   tmp(Y.get_ref());
+  const Mat<eT>& M = tmp.M;
+  
+  Cube<eT> out(C.n_rows, M.n_cols, C.n_slices);
+  
+  for(uword i=0; i < C.n_slices; ++i)
+    {
+          Mat<eT> out_slice(              out.slice_memptr(i),  C.n_rows, 
M.n_cols, false, true);
+    const Mat<eT>   C_slice(const_cast<eT*>(C.slice_memptr(i)), C.n_rows, 
C.n_cols, false, true);
+    
+    out_slice = C_slice * M;
+    }
+  
+  return out;
+  }
+
+
+
+template<typename T1, typename eT>
+inline
+Cube<eT>
+subview_cube_each1_aux::operator_times
+  (
+  const Base<eT,T1>&            X,
+  const subview_cube_each1<eT>& Y
+  )
+  {
+  arma_extra_debug_sigprint();
+  
+  const unwrap<T1>   tmp(X.get_ref());
+  const Mat<eT>& M = tmp.M;
+  
+  const Cube<eT>& C = Y.P;
+  
+  Cube<eT> out(M.n_rows, C.n_cols, C.n_slices);
+  
+  for(uword i=0; i < C.n_slices; ++i)
+    {
+          Mat<eT> out_slice(              out.slice_memptr(i),  M.n_rows, 
C.n_cols, false, true);
+    const Mat<eT>   C_slice(const_cast<eT*>(C.slice_memptr(i)), C.n_rows, 
C.n_cols, false, true);
+    
+    out_slice = M * C_slice;
+    }
+  
+  return out;
   }
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/armadillo-7.400.3/include/armadillo_bits/subview_elem1_meat.hpp 
new/armadillo-7.500.0/include/armadillo_bits/subview_elem1_meat.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/subview_elem1_meat.hpp 
2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/subview_elem1_meat.hpp 
2016-06-16 18:16:06.000000000 +0200
@@ -27,6 +27,8 @@
   , a(in_a)
   {
   arma_extra_debug_sigprint();
+  
+  // TODO: refactor to unwrap 'in_a' instead of storing a ref to it; this will 
allow removal of carrying T1 around and repetition of size checks
   }
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/armadillo-7.400.3/mex_interface/armaMex.hpp 
new/armadillo-7.500.0/mex_interface/armaMex.hpp
--- old/armadillo-7.400.3/mex_interface/armaMex.hpp     2016-06-16 
18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/mex_interface/armaMex.hpp     2016-06-16 
18:16:06.000000000 +0200
@@ -362,8 +362,8 @@
     return Cube<double>();
     }
   }  
-
-
+  
+  
 // Get complex cube from Matlab/Octave
 inline
 cx_cube
@@ -389,8 +389,7 @@
     return cx_cube();
     }
   }  
-
-
+  
 // return real valued cube to Matlab/Octave
 template<class Type>
 inline
@@ -403,7 +402,7 @@
   std::memcpy(dst_pointer, src_pointer, sizeof(Type)*armaCube.n_elem); 
   }
 
-
+  
 // Return double real valued cube to Matlab/Octave
 inline
 void
@@ -415,7 +414,7 @@
   std::memcpy(dst_pointer, src_pointer, sizeof(double)*armaCube.n_elem); 
   }
 
-
+  
 // Return imaginary valued cube to Matlab/Octave.
 template<class Type>
 inline
@@ -428,7 +427,7 @@
   std::memcpy(dst_pointer, src_pointer, sizeof(Type)*armaCube.n_elem);
   }
 
-
+  
 // Return double imaginary valued matrix to Matlab/Octave
 inline
 void
@@ -574,8 +573,8 @@
     return SpMat<double>(locations, values, m, n, sort_locations);
     }
   }
-
-
+  
+  
 // Get imaginary sparse matrix from Matlab/Octave.
 template<class Type>
 inline
@@ -694,8 +693,8 @@
     return SpMat<double>(locations, values, m, n, sort_locations);
     }
   }  
-
-
+  
+  
 // Return sparse matrix to matlab
 inline
 void


Reply via email to