changeset 22436:09005ac7d56c

gsvd<T>: add class template support for FloatMatrix and FloatComplexMatrix. * liboctave/numeric/gsvd.h: template class more so that it works with FloatMatrix and ComplexFloatMatrix. * liboctave/numeric/gsvd.cc: add methods FloatMatrix and FloatComplexMatrix. * liboctave/numeric/lo-lapack-proto.h: declare interface to LAPACK's CGGSVD and SGGSVD.
author Carnë Draug <carandraug@octave.org>
date Sun, 04 Sep 2016 17:12:03 +0100
parents de24ca103c21
children 0aee8b620864
files liboctave/numeric/gsvd.cc liboctave/numeric/gsvd.h liboctave/numeric/lo-lapack-proto.h
diffstat 3 files changed, 141 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/numeric/gsvd.cc	Sun Sep 04 16:09:02 2016 +0100
+++ b/liboctave/numeric/gsvd.cc	Sun Sep 04 17:12:03 2016 +0100
@@ -19,14 +19,19 @@
 #  include <config.h>
 #endif
 
+#include <vector>
+
 #include "gsvd.h"
+
 #include "lo-error.h"
 #include "lo-lapack-proto.h"
+#include "dMatrix.h"
+#include "fMatrix.h"
 #include "CMatrix.h"
+#include "fCMatrix.h"
 #include "dDiagMatrix.h"
-#include "dMatrix.h"
+#include "fDiagMatrix.h"
 
-#include <vector>
 
 template <>
 void
@@ -36,7 +41,8 @@
                      double *tmp_dataB, octave_idx_type p1, Matrix& alpha,
                      Matrix& beta, double *u, octave_idx_type nrow_u, double *v,
                      octave_idx_type nrow_v, double *q, octave_idx_type nrow_q,
-                     Matrix& work, octave_idx_type* iwork, octave_idx_type& info)
+                     Matrix& work, octave_idx_type* iwork,
+                     octave_idx_type& info)
 {
   F77_XFCN (dggsvd, DGGSVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
                              F77_CONST_CHAR_ARG2 (&jobv, 1),
@@ -51,6 +57,31 @@
                              F77_CHAR_ARG_LEN (1)));
 }
 
+template <>
+void
+gsvd<FloatMatrix>::ggsvd (char& jobu, char& jobv, char& jobq, octave_idx_type m,
+                          octave_idx_type n, octave_idx_type p,
+                          octave_idx_type& k, octave_idx_type& l,
+                          float *tmp_dataA, octave_idx_type m1,
+                          float *tmp_dataB, octave_idx_type p1,
+                          FloatMatrix& alpha, FloatMatrix& beta, float *u,
+                          octave_idx_type nrow_u, float *v,
+                          octave_idx_type nrow_v, float *q,
+                          octave_idx_type nrow_q, FloatMatrix& work,
+                          octave_idx_type* iwork, octave_idx_type& info)
+{
+  F77_XFCN (sggsvd, SGGSVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
+                             F77_CONST_CHAR_ARG2 (&jobv, 1),
+                             F77_CONST_CHAR_ARG2 (&jobq, 1),
+                             m, n, p, k, l, tmp_dataA, m1,
+                             tmp_dataB, p1, alpha.fortran_vec (),
+                             beta.fortran_vec (), u, nrow_u,
+                             v, nrow_v, q, nrow_q, work.fortran_vec (),
+                             iwork, info
+                             F77_CHAR_ARG_LEN (1)
+                             F77_CHAR_ARG_LEN (1)
+                             F77_CHAR_ARG_LEN (1)));
+}
 
 template <>
 void
@@ -82,6 +113,38 @@
                              F77_CHAR_ARG_LEN (1)));
 }
 
+template <>
+void
+gsvd<FloatComplexMatrix>::ggsvd (char& jobu, char& jobv, char& jobq,
+                                 octave_idx_type m, octave_idx_type n,
+                                 octave_idx_type p, octave_idx_type& k,
+                                 octave_idx_type& l, FloatComplex *tmp_dataA,
+                                 octave_idx_type m1, FloatComplex *tmp_dataB,
+                                 octave_idx_type p1, FloatMatrix& alpha,
+                                 FloatMatrix& beta, FloatComplex *u,
+                                 octave_idx_type nrow_u, FloatComplex *v,
+                                 octave_idx_type nrow_v, FloatComplex *q,
+                                 octave_idx_type nrow_q,
+                                 FloatComplexMatrix& work,
+                                 octave_idx_type* iwork, octave_idx_type& info)
+{
+  FloatMatrix rwork(2*n, 1);
+  F77_XFCN (cggsvd, CGGSVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
+                             F77_CONST_CHAR_ARG2 (&jobv, 1),
+                             F77_CONST_CHAR_ARG2 (&jobq, 1),
+                             m, n, p, k, l, F77_CMPLX_ARG (tmp_dataA), m1,
+                             F77_CMPLX_ARG (tmp_dataB), p1,
+                             alpha.fortran_vec (), beta.fortran_vec (),
+                             F77_CMPLX_ARG (u), nrow_u,
+                             F77_CMPLX_ARG (v), nrow_v,
+                             F77_CMPLX_ARG (q), nrow_q,
+                             F77_CMPLX_ARG (work.fortran_vec ()),
+                             rwork.fortran_vec (), iwork, info
+                             F77_CHAR_ARG_LEN (1)
+                             F77_CHAR_ARG_LEN (1)
+                             F77_CHAR_ARG_LEN (1)));
+}
+
 template <typename T>
 T
 gsvd<T>::left_singular_matrix_A (void) const
@@ -207,8 +270,8 @@
   lwork = (lwork > p ? lwork : p) + n;
 
   T work (lwork, 1);
-  Matrix alpha (n, 1);
-  Matrix beta (n, 1);
+  real_matrix alpha (n, 1);
+  real_matrix beta (n, 1);
 
   std::vector<octave_idx_type> iwork (n);
 
@@ -288,8 +351,7 @@
 }
 
 // Instantiations we need.
-
 template class gsvd<Matrix>;
-
+template class gsvd<FloatMatrix>;
 template class gsvd<ComplexMatrix>;
-
+template class gsvd<FloatComplexMatrix>;
--- a/liboctave/numeric/gsvd.h	Sun Sep 04 16:09:02 2016 +0100
+++ b/liboctave/numeric/gsvd.h	Sun Sep 04 17:12:03 2016 +0100
@@ -20,9 +20,6 @@
 
 #include "octave-config.h"
 
-#include "dDiagMatrix.h"
-#include "dMatrix.h"
-
 template <typename T>
 class
 gsvd
@@ -64,8 +61,11 @@
 
   ~gsvd (void) { }
 
-  DiagMatrix singular_values_A (void) const { return sigmaA; }
-  DiagMatrix singular_values_B (void) const { return sigmaB; }
+  typename T::real_diag_matrix_type
+  singular_values_A (void) const { return sigmaA; }
+
+  typename T::real_diag_matrix_type
+  singular_values_B (void) const { return sigmaB; }
 
   T left_singular_matrix_A (void) const;
   T left_singular_matrix_B (void) const;
@@ -74,22 +74,21 @@
   T R_matrix (void) const;
 
 private:
+  typedef typename T::value_type P;
+  typedef typename T::real_matrix_type real_matrix;
 
   gsvd::Type type;
-
-  typedef typename T::element_type P;
-
-  DiagMatrix sigmaA, sigmaB;
+  typename T::real_diag_matrix_type sigmaA, sigmaB;
   T left_smA, left_smB;
   T right_sm, R;
 
   void ggsvd (char& jobu, char& jobv, char& jobq, octave_idx_type m,
               octave_idx_type n, octave_idx_type p, octave_idx_type& k,
               octave_idx_type& l, P *tmp_dataA, octave_idx_type m1,
-              P *tmp_dataB, octave_idx_type p1, Matrix& alpha, Matrix& beta,
-              P *u, octave_idx_type nrow_u, P *v, octave_idx_type nrow_v, P *q,
-              octave_idx_type nrow_q, T& work, octave_idx_type* iwork,
-              octave_idx_type& info);
+              P *tmp_dataB, octave_idx_type p1, real_matrix& alpha,
+              real_matrix& beta, P *u, octave_idx_type nrow_u, P *v,
+              octave_idx_type nrow_v, P *q, octave_idx_type nrow_q, T& work,
+              octave_idx_type* iwork, octave_idx_type& info);
 };
 
 #endif
--- a/liboctave/numeric/lo-lapack-proto.h	Sun Sep 04 16:09:02 2016 +0100
+++ b/liboctave/numeric/lo-lapack-proto.h	Sun Sep 04 17:12:03 2016 +0100
@@ -839,6 +839,35 @@
      F77_CHAR_ARG_LEN_DECL);
 
   F77_RET_T
+  F77_FUNC (sggsvd, SGGSVD)
+   (F77_CONST_CHAR_ARG_DECL,    // JOBU
+     F77_CONST_CHAR_ARG_DECL,   // JOBV
+     F77_CONST_CHAR_ARG_DECL,   // JOBQ
+     const F77_INT&,            // M
+     const F77_INT&,            // N
+     const F77_INT&,            // P
+     F77_INT &,                 // K
+     F77_INT &,                 // L
+     F77_REAL*,                 // A
+     const F77_INT&,            // LDA
+     F77_REAL*,                 // B
+     const F77_INT&,            // LDB
+     F77_REAL*,                 // ALPHA
+     F77_REAL*,                 // BETA
+     F77_REAL*,                 // U
+     const F77_INT&,            // LDU
+     F77_REAL*,                 // V
+     const F77_INT&,            // LDV
+     F77_REAL*,                 // Q
+     const F77_INT&,            // LDQ
+     F77_REAL*,                 // WORK
+     int*,                      // IWORK
+     F77_INT&                   // INFO
+     F77_CHAR_ARG_LEN_DECL
+     F77_CHAR_ARG_LEN_DECL
+     F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
   F77_FUNC (zggsvd, ZGGSVD)
     (F77_CONST_CHAR_ARG_DECL,   // JOBU
      F77_CONST_CHAR_ARG_DECL,   // JOBV
@@ -868,6 +897,36 @@
      F77_CHAR_ARG_LEN_DECL
      F77_CHAR_ARG_LEN_DECL);
 
+  F77_RET_T
+  F77_FUNC (cggsvd, CGGSVD)
+   (F77_CONST_CHAR_ARG_DECL,    // JOBU
+     F77_CONST_CHAR_ARG_DECL,   // JOBV
+     F77_CONST_CHAR_ARG_DECL,   // JOBQ
+     const F77_INT&,            // M
+     const F77_INT&,            // N
+     const F77_INT&,            // P
+     F77_INT &,                 // K
+     F77_INT &,                 // L
+     F77_CMPLX*,                // A
+     const F77_INT&,            // LDA
+     F77_CMPLX*,                // B
+     const F77_INT&,            // LDB
+     F77_REAL*,                 // ALPHA
+     F77_REAL*,                 // BETA
+     F77_CMPLX*,                // U
+     const F77_INT&,            // LDU
+     F77_CMPLX*,                // V
+     const F77_INT&,            // LDV
+     F77_CMPLX*,                // Q
+     const F77_INT&,            // LDQ
+     F77_CMPLX*,                // WORK
+     F77_REAL*,                 // RWORK
+     int*,                      // IWORK
+     F77_INT&                   // INFO
+     F77_CHAR_ARG_LEN_DECL
+     F77_CHAR_ARG_LEN_DECL
+     F77_CHAR_ARG_LEN_DECL);
+
   // GTSV
 
   F77_RET_T