changeset 21280:ebdf74c15722

better use of templates for qrp classes * liboctave/numeric/qrp.h, liboctave/numeric/qrp.cc: New files for qrp classes generated from CmplxQRP.cc, CmplxQRP.h, dbleQRP.cc, dbleQRP.h, fCmplxQRP.cc, fCmplxQRP.h, floatQRP.cc, and floatQRP.h with classes converted to templates. * liboctave/numeric/module.mk: Update. * qr.cc, mx-defs.h: Use new classes.
author John W. Eaton <jwe@octave.org>
date Wed, 17 Feb 2016 02:54:00 -0500
parents eb1524b07fe3
children b76955e83fe4
files libinterp/dldfcn/qr.cc liboctave/numeric/CmplxQRP.cc liboctave/numeric/CmplxQRP.h liboctave/numeric/dbleQRP.cc liboctave/numeric/dbleQRP.h liboctave/numeric/fCmplxQRP.cc liboctave/numeric/fCmplxQRP.h liboctave/numeric/floatQRP.cc liboctave/numeric/floatQRP.h liboctave/numeric/module.mk liboctave/numeric/qrp.cc liboctave/numeric/qrp.h liboctave/operators/mx-defs.h
diffstat 13 files changed, 411 insertions(+), 751 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/dldfcn/qr.cc	Wed Feb 17 02:57:21 2016 -0500
+++ b/libinterp/dldfcn/qr.cc	Wed Feb 17 02:54:00 2016 -0500
@@ -26,11 +26,8 @@
 #  include <config.h>
 #endif
 
-#include "CmplxQRP.h"
-#include "dbleQRP.h"
-#include "fCmplxQRP.h"
-#include "floatQRP.h"
 #include "qr.h"
+#include "qrp.h"
 #include "sparse-qr.h"
 
 
@@ -304,7 +301,7 @@
 
                 default:
                   {
-                    FloatQRP fact (m, type);
+                    qrp<FloatMatrix> fact (m, type);
 
                     if (type == qr<FloatMatrix>::economy)
                       retval = ovl (fact.Q (), get_qr_r (fact), fact.Pvec ());
@@ -340,7 +337,7 @@
 
                 default:
                   {
-                    FloatComplexQRP fact (m, type);
+                    qrp<FloatComplexMatrix> fact (m, type);
                     if (type == qr<FloatComplexMatrix>::economy)
                       retval = ovl (fact.Q (), get_qr_r (fact), fact.Pvec ());
                     else
@@ -377,7 +374,7 @@
 
                 default:
                   {
-                    QRP fact (m, type);
+                    qrp<Matrix> fact (m, type);
                     if (type == qr<Matrix>::economy)
                       retval = ovl (fact.Q (), get_qr_r (fact), fact.Pvec ());
                     else
@@ -412,7 +409,7 @@
 
                 default:
                   {
-                    ComplexQRP fact (m, type);
+                    qrp<ComplexMatrix> fact (m, type);
                     if (type == qr<ComplexMatrix>::economy)
                       retval = ovl (fact.Q (), get_qr_r (fact), fact.Pvec ());
                     else
--- a/liboctave/numeric/CmplxQRP.cc	Wed Feb 17 02:57:21 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-/*
-
-Copyright (C) 1994-2015 John W. Eaton
-Copyright (C) 2009 VZLU Prague
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <cassert>
-
-#include "CmplxQRP.h"
-#include "f77-fcn.h"
-#include "lo-error.h"
-#include "oct-locbuf.h"
-
-extern "C"
-{
-  F77_RET_T
-  F77_FUNC (zgeqp3, ZGEQP3) (const octave_idx_type&, const octave_idx_type&,
-                             Complex*, const octave_idx_type&,
-                             octave_idx_type*, Complex*, Complex*,
-                             const octave_idx_type&, double*,
-                             octave_idx_type&);
-}
-
-// It would be best to share some of this code with qr<ComplexMatrix> class...
-
-ComplexQRP::ComplexQRP (const ComplexMatrix& a, type qr_type)
-  : qr<ComplexMatrix> (), p ()
-{
-  init (a, qr_type);
-}
-
-void
-ComplexQRP::init (const ComplexMatrix& a, type qr_type)
-{
-  assert (qr_type != qr<ComplexMatrix>::raw);
-
-  octave_idx_type m = a.rows ();
-  octave_idx_type n = a.cols ();
-
-  octave_idx_type min_mn = m < n ? m : n;
-  OCTAVE_LOCAL_BUFFER (Complex, tau, min_mn);
-
-  octave_idx_type info = 0;
-
-  ComplexMatrix afact = a;
-  if (m > n && qr_type == qr<ComplexMatrix>::std)
-    afact.resize (m, m);
-
-  MArray<octave_idx_type> jpvt (dim_vector (n, 1), 0);
-
-  if (m > 0)
-    {
-      OCTAVE_LOCAL_BUFFER (double, rwork, 2*n);
-
-      // workspace query.
-      Complex clwork;
-      F77_XFCN (zgeqp3, ZGEQP3, (m, n, afact.fortran_vec (),
-                                 m, jpvt.fortran_vec (), tau,
-                                 &clwork, -1, rwork, info));
-
-      // allocate buffer and do the job.
-      octave_idx_type lwork = clwork.real ();
-      lwork = std::max (lwork, static_cast<octave_idx_type> (1));
-      OCTAVE_LOCAL_BUFFER (Complex, work, lwork);
-      F77_XFCN (zgeqp3, ZGEQP3, (m, n, afact.fortran_vec (),
-                                 m, jpvt.fortran_vec (), tau,
-                                 work, lwork, rwork, info));
-    }
-  else
-    for (octave_idx_type i = 0; i < n; i++) jpvt(i) = i+1;
-
-  // Form Permutation matrix (if economy is requested, return the
-  // indices only!)
-
-  jpvt -= static_cast<octave_idx_type> (1);
-  p = PermMatrix (jpvt, true);
-
-
-  form (n, afact, tau, qr_type);
-}
-
-RowVector
-ComplexQRP::Pvec (void) const
-{
-  Array<double> pa (p.col_perm_vec ());
-  RowVector pv (MArray<double> (pa) + 1.0);
-  return pv;
-}
--- a/liboctave/numeric/CmplxQRP.h	Wed Feb 17 02:57:21 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/*
-
-Copyright (C) 1994-2015 John W. Eaton
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-#if ! defined (octave_CmplxQRP_h)
-#define octave_CmplxQRP_h 1
-
-#include "octave-config.h"
-
-#include <iosfwd>
-
-#include "PermMatrix.h"
-#include "CColVector.h"
-#include "CMatrix.h"
-#include "CRowVector.h"
-#include "qr.h"
-
-class
-OCTAVE_API
-ComplexQRP : public qr<ComplexMatrix>
-{
-public:
-
-  typedef qr<ComplexMatrix>::type type;
-
-  ComplexQRP (void) : qr<ComplexMatrix> (), p () { }
-
-  ComplexQRP (const ComplexMatrix&, type = qr<ComplexMatrix>::std);
-
-  ComplexQRP (const ComplexQRP& a) : qr<ComplexMatrix> (a), p (a.p) { }
-
-  ComplexQRP& operator = (const ComplexQRP& a)
-  {
-    if (this != &a)
-      {
-        qr<ComplexMatrix>::operator = (a);
-        p = a.p;
-      }
-    return *this;
-  }
-
-  ~ComplexQRP (void) { }
-
-  void init (const ComplexMatrix&, type = qr<ComplexMatrix>::std);
-
-  PermMatrix P (void) const { return p; }
-
-  RowVector Pvec (void) const;
-
-  friend std::ostream&  operator << (std::ostream&, const ComplexQRP&);
-
-private:
-
-  PermMatrix p;
-};
-
-#endif
--- a/liboctave/numeric/dbleQRP.cc	Wed Feb 17 02:57:21 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-/*
-
-Copyright (C) 1994-2015 John W. Eaton
-Copyright (C) 2009 VZLU Prague
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <cassert>
-
-#include "dbleQRP.h"
-#include "f77-fcn.h"
-#include "lo-error.h"
-#include "oct-locbuf.h"
-
-extern "C"
-{
-  F77_RET_T
-  F77_FUNC (dgeqp3, DGEQP3) (const octave_idx_type&, const octave_idx_type&,
-                             double*, const octave_idx_type&,
-                             octave_idx_type*, double*, double*,
-                             const octave_idx_type&, octave_idx_type&);
-}
-
-// It would be best to share some of this code with qr<Matrix> class...
-
-QRP::QRP (const Matrix& a, type qr_type)
-  : qr<Matrix> (), p ()
-{
-  init (a, qr_type);
-}
-
-void
-QRP::init (const Matrix& a, type qr_type)
-{
-  assert (qr_type != qr<Matrix>::raw);
-
-  octave_idx_type m = a.rows ();
-  octave_idx_type n = a.cols ();
-
-  octave_idx_type min_mn = m < n ? m : n;
-  OCTAVE_LOCAL_BUFFER (double, tau, min_mn);
-
-  octave_idx_type info = 0;
-
-  Matrix afact = a;
-  if (m > n && qr_type == qr<Matrix>::std)
-    afact.resize (m, m);
-
-  MArray<octave_idx_type> jpvt (dim_vector (n, 1), 0);
-
-  if (m > 0)
-    {
-      // workspace query.
-      double rlwork;
-      F77_XFCN (dgeqp3, DGEQP3, (m, n, afact.fortran_vec (),
-                                 m, jpvt.fortran_vec (), tau,
-                                 &rlwork, -1, info));
-
-      // allocate buffer and do the job.
-      octave_idx_type lwork = rlwork;
-      lwork = std::max (lwork, static_cast<octave_idx_type> (1));
-      OCTAVE_LOCAL_BUFFER (double, work, lwork);
-      F77_XFCN (dgeqp3, DGEQP3, (m, n, afact.fortran_vec (),
-                                 m, jpvt.fortran_vec (), tau,
-                                 work, lwork, info));
-    }
-  else
-    for (octave_idx_type i = 0; i < n; i++) jpvt(i) = i+1;
-
-  // Form Permutation matrix (if economy is requested, return the
-  // indices only!)
-
-  jpvt -= static_cast<octave_idx_type> (1);
-  p = PermMatrix (jpvt, true);
-
-
-  form (n, afact, tau, qr_type);
-}
-
-RowVector
-QRP::Pvec (void) const
-{
-  Array<double> pa (p.col_perm_vec ());
-  RowVector pv (MArray<double> (pa) + 1.0);
-  return pv;
-}
--- a/liboctave/numeric/dbleQRP.h	Wed Feb 17 02:57:21 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*
-
-Copyright (C) 1994-2015 John W. Eaton
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-#if ! defined (octave_dbleQRP_h)
-#define octave_dbleQRP_h 1
-
-#include "octave-config.h"
-
-#include <iosfwd>
-
-#include "PermMatrix.h"
-#include "dColVector.h"
-#include "dMatrix.h"
-#include "dRowVector.h"
-#include "qr.h"
-
-class
-OCTAVE_API
-QRP : public qr<Matrix>
-{
-public:
-
-  typedef qr<Matrix>::type type;
-
-  QRP (void) : qr<Matrix> (), p () { }
-
-  QRP (const Matrix&, type = qr<Matrix>::std);
-
-  QRP (const QRP& a) : qr<Matrix> (a), p (a.p) { }
-
-  QRP& operator = (const QRP& a)
-  {
-    if (this != &a)
-      {
-        qr<Matrix>::operator = (a);
-        p = a.p;
-      }
-
-    return *this;
-  }
-
-  ~QRP (void) { }
-
-  void init (const Matrix&, type = qr<Matrix>::std);
-
-  PermMatrix P (void) const { return p; }
-
-  RowVector Pvec (void) const;
-
-  friend std::ostream&  operator << (std::ostream&, const QRP&);
-
-protected:
-
-  PermMatrix p;
-};
-
-#endif
--- a/liboctave/numeric/fCmplxQRP.cc	Wed Feb 17 02:57:21 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,108 +0,0 @@
-/*
-
-Copyright (C) 1994-2015 John W. Eaton
-Copyright (C) 2009 VZLU Prague
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <cassert>
-
-#include "fCmplxQRP.h"
-#include "f77-fcn.h"
-#include "lo-error.h"
-#include "oct-locbuf.h"
-
-extern "C"
-{
-  F77_RET_T
-  F77_FUNC (cgeqp3, CGEQP3) (const octave_idx_type&, const octave_idx_type&,
-                             FloatComplex*, const octave_idx_type&,
-                             octave_idx_type*, FloatComplex*, FloatComplex*,
-                             const octave_idx_type&, float*, octave_idx_type&);
-}
-
-// It would be best to share some of this code with qr<FloatComplexMatrix> class...
-
-FloatComplexQRP::FloatComplexQRP (const FloatComplexMatrix& a, type qr_type)
-  : qr<FloatComplexMatrix> (), p ()
-{
-  init (a, qr_type);
-}
-
-void
-FloatComplexQRP::init (const FloatComplexMatrix& a, type qr_type)
-{
-  assert (qr_type != qr<FloatComplexMatrix>::raw);
-
-  octave_idx_type m = a.rows ();
-  octave_idx_type n = a.cols ();
-
-  octave_idx_type min_mn = m < n ? m : n;
-  OCTAVE_LOCAL_BUFFER (FloatComplex, tau, min_mn);
-
-  octave_idx_type info = 0;
-
-  FloatComplexMatrix afact = a;
-  if (m > n && qr_type == qr<FloatComplexMatrix>::std)
-    afact.resize (m, m);
-
-  MArray<octave_idx_type> jpvt (dim_vector (n, 1), 0);
-
-  if (m > 0)
-    {
-      OCTAVE_LOCAL_BUFFER (float, rwork, 2*n);
-
-      // workspace query.
-      FloatComplex clwork;
-      F77_XFCN (cgeqp3, CGEQP3, (m, n, afact.fortran_vec (),
-                                 m, jpvt.fortran_vec (), tau,
-                                 &clwork, -1, rwork, info));
-
-      // allocate buffer and do the job.
-      octave_idx_type lwork = clwork.real ();
-      lwork = std::max (lwork, static_cast<octave_idx_type> (1));
-      OCTAVE_LOCAL_BUFFER (FloatComplex, work, lwork);
-      F77_XFCN (cgeqp3, CGEQP3, (m, n, afact.fortran_vec (),
-                                 m, jpvt.fortran_vec (), tau,
-                                 work, lwork, rwork, info));
-    }
-  else
-    for (octave_idx_type i = 0; i < n; i++) jpvt(i) = i+1;
-
-  // Form Permutation matrix (if economy is requested, return the
-  // indices only!)
-
-  jpvt -= static_cast<octave_idx_type> (1);
-  p = PermMatrix (jpvt, true);
-
-
-  form (n, afact, tau, qr_type);
-}
-
-FloatRowVector
-FloatComplexQRP::Pvec (void) const
-{
-  Array<float> pa (p.col_perm_vec ());
-  FloatRowVector pv (MArray<float> (pa) + 1.0f);
-  return pv;
-}
--- a/liboctave/numeric/fCmplxQRP.h	Wed Feb 17 02:57:21 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/*
-
-Copyright (C) 1994-2015 John W. Eaton
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-#if ! defined (octave_fCmplxQRP_h)
-#define octave_fCmplxQRP_h 1
-
-#include "octave-config.h"
-
-#include <iosfwd>
-
-#include "PermMatrix.h"
-#include "fCColVector.h"
-#include "fCMatrix.h"
-#include "fCRowVector.h"
-#include "qr.h"
-
-class
-OCTAVE_API
-FloatComplexQRP : public qr<FloatComplexMatrix>
-{
-public:
-
-  typedef qr<FloatComplexMatrix>::type type;
-
-  FloatComplexQRP (void) : qr<FloatComplexMatrix> (), p () { }
-
-  FloatComplexQRP (const FloatComplexMatrix&, type = qr<FloatComplexMatrix>::std);
-
-  FloatComplexQRP (const FloatComplexQRP& a) : qr<FloatComplexMatrix> (a), p (a.p) { }
-
-  FloatComplexQRP& operator = (const FloatComplexQRP& a)
-  {
-    if (this != &a)
-      {
-        qr<FloatComplexMatrix>::operator = (a);
-        p = a.p;
-      }
-    return *this;
-  }
-
-  ~FloatComplexQRP (void) { }
-
-  void init (const FloatComplexMatrix&, type = qr<FloatComplexMatrix>::std);
-
-  PermMatrix P (void) const { return p; }
-
-  FloatRowVector Pvec (void) const;
-
-  friend std::ostream&  operator << (std::ostream&, const FloatComplexQRP&);
-
-private:
-
-  PermMatrix p;
-};
-
-#endif
--- a/liboctave/numeric/floatQRP.cc	Wed Feb 17 02:57:21 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-/*
-
-Copyright (C) 1994-2015 John W. Eaton
-Copyright (C) 2009 VZLU Prague
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <cassert>
-
-#include "floatQRP.h"
-#include "f77-fcn.h"
-#include "lo-error.h"
-#include "oct-locbuf.h"
-
-extern "C"
-{
-  F77_RET_T
-  F77_FUNC (sgeqp3, SGEQP3) (const octave_idx_type&, const octave_idx_type&,
-                             float*, const octave_idx_type&, octave_idx_type*,
-                             float*, float*, const octave_idx_type&,
-                             octave_idx_type&);
-}
-
-// It would be best to share some of this code with QR class...
-
-FloatQRP::FloatQRP (const FloatMatrix& a, type qr_type)
-  : qr<FloatMatrix> (), p ()
-{
-  init (a, qr_type);
-}
-
-void
-FloatQRP::init (const FloatMatrix& a, type qr_type)
-{
-  assert (qr_type != qr<FloatMatrix>::raw);
-
-  octave_idx_type m = a.rows ();
-  octave_idx_type n = a.cols ();
-
-  octave_idx_type min_mn = m < n ? m : n;
-  OCTAVE_LOCAL_BUFFER (float, tau, min_mn);
-
-  octave_idx_type info = 0;
-
-  FloatMatrix afact = a;
-  if (m > n && qr_type == qr<FloatMatrix>::std)
-    afact.resize (m, m);
-
-  MArray<octave_idx_type> jpvt (dim_vector (n, 1), 0);
-
-  if (m > 0)
-    {
-      // workspace query.
-      float rlwork;
-      F77_XFCN (sgeqp3, SGEQP3, (m, n, afact.fortran_vec (),
-                                 m, jpvt.fortran_vec (), tau,
-                                 &rlwork, -1, info));
-
-      // allocate buffer and do the job.
-      octave_idx_type lwork = rlwork;
-      lwork = std::max (lwork, static_cast<octave_idx_type> (1));
-      OCTAVE_LOCAL_BUFFER (float, work, lwork);
-      F77_XFCN (sgeqp3, SGEQP3, (m, n, afact.fortran_vec (),
-                                 m, jpvt.fortran_vec (), tau,
-                                 work, lwork, info));
-    }
-  else
-    for (octave_idx_type i = 0; i < n; i++) jpvt(i) = i+1;
-
-  // Form Permutation matrix (if economy is requested, return the
-  // indices only!)
-
-  jpvt -= static_cast<octave_idx_type> (1);
-  p = PermMatrix (jpvt, true);
-
-
-  form (n, afact, tau, qr_type);
-}
-
-FloatRowVector
-FloatQRP::Pvec (void) const
-{
-  Array<float> pa (p.col_perm_vec ());
-  FloatRowVector pv (MArray<float> (pa) + 1.0f);
-  return pv;
-}
--- a/liboctave/numeric/floatQRP.h	Wed Feb 17 02:57:21 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*
-
-Copyright (C) 1994-2015 John W. Eaton
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-#if ! defined (octave_floatQRP_h)
-#define octave_floatQRP_h 1
-
-#include "octave-config.h"
-
-#include <iosfwd>
-
-#include "PermMatrix.h"
-#include "fColVector.h"
-#include "fMatrix.h"
-#include "fRowVector.h"
-#include "qr.h"
-
-class
-OCTAVE_API
-FloatQRP : public qr<FloatMatrix>
-{
-public:
-
-  typedef qr<FloatMatrix>::type type;
-
-  FloatQRP (void) : qr<FloatMatrix> (), p () { }
-
-  FloatQRP (const FloatMatrix&, type = qr<FloatMatrix>::std);
-
-  FloatQRP (const FloatQRP& a) : qr<FloatMatrix> (a), p (a.p) { }
-
-  FloatQRP& operator = (const FloatQRP& a)
-  {
-    if (this != &a)
-      {
-        qr<FloatMatrix>::operator = (a);
-        p = a.p;
-      }
-
-    return *this;
-  }
-
-  ~FloatQRP (void) { }
-
-  void init (const FloatMatrix&, type = qr<FloatMatrix>::std);
-
-  PermMatrix P (void) const { return p; }
-
-  FloatRowVector Pvec (void) const;
-
-  friend std::ostream&  operator << (std::ostream&, const FloatQRP&);
-
-protected:
-
-  PermMatrix p;
-};
-
-#endif
--- a/liboctave/numeric/module.mk	Wed Feb 17 02:57:21 2016 -0500
+++ b/liboctave/numeric/module.mk	Wed Feb 17 02:54:00 2016 -0500
@@ -8,7 +8,6 @@
 LIBOCTAVE_OPT_IN = $(LIBOCTAVE_OPT_INC:.h=.in)
 
 NUMERIC_INC = \
-  liboctave/numeric/CmplxQRP.h \
   liboctave/numeric/CollocWt.h \
   liboctave/numeric/DAE.h \
   liboctave/numeric/DAEFunc.h \
@@ -32,11 +31,8 @@
   liboctave/numeric/bsxfun-decl.h \
   liboctave/numeric/bsxfun.h \
   liboctave/numeric/chol.h \
-  liboctave/numeric/dbleQRP.h \
   liboctave/numeric/eigs-base.h \
-  liboctave/numeric/fCmplxQRP.h \
   liboctave/numeric/fEIG.h \
-  liboctave/numeric/floatQRP.h \
   liboctave/numeric/gepbalance.h \
   liboctave/numeric/hess.h \
   liboctave/numeric/lo-mappers.h \
@@ -48,6 +44,7 @@
   liboctave/numeric/oct-rand.h \
   liboctave/numeric/oct-spparms.h \
   liboctave/numeric/qr.h \
+  liboctave/numeric/qrp.h \
   liboctave/numeric/randgamma.h \
   liboctave/numeric/randmtzig.h \
   liboctave/numeric/randpoisson.h \
@@ -64,7 +61,6 @@
   liboctave/numeric/randpoisson.c
 
 NUMERIC_SRC = \
-  liboctave/numeric/CmplxQRP.cc \
   liboctave/numeric/CollocWt.cc \
   liboctave/numeric/DASPK.cc \
   liboctave/numeric/DASRT.cc \
@@ -75,11 +71,8 @@
   liboctave/numeric/Quad.cc \
   liboctave/numeric/aepbalance.cc \
   liboctave/numeric/chol.cc \
-  liboctave/numeric/dbleQRP.cc \
   liboctave/numeric/eigs-base.cc \
-  liboctave/numeric/fCmplxQRP.cc \
   liboctave/numeric/fEIG.cc \
-  liboctave/numeric/floatQRP.cc \
   liboctave/numeric/gepbalance.cc \
   liboctave/numeric/hess.cc \
   liboctave/numeric/lo-mappers.cc \
@@ -91,6 +84,7 @@
   liboctave/numeric/oct-rand.cc \
   liboctave/numeric/oct-spparms.cc \
   liboctave/numeric/qr.cc \
+  liboctave/numeric/qrp.cc \
   liboctave/numeric/schur.cc \
   liboctave/numeric/sparse-chol.cc \
   liboctave/numeric/sparse-dmsolve.cc \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/numeric/qrp.cc	Wed Feb 17 02:54:00 2016 -0500
@@ -0,0 +1,331 @@
+/*
+
+Copyright (C) 1994-2015 John W. Eatonn
+Copyright (C) 2009 VZLU Prague
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <cassert>
+
+#include "CMatrix.h"
+#include "dMatrix.h"
+#include "dRowVector.h"
+#include "f77-fcn.h"
+#include "fCMatrix.h"
+#include "fMatrix.h"
+#include "fRowVector.h"
+#include "lo-error.h"
+#include "oct-locbuf.h"
+#include "qrp.h"
+
+extern "C"
+{
+  F77_RET_T
+  F77_FUNC (dgeqp3, DGEQP3) (const octave_idx_type&, const octave_idx_type&,
+                             double*, const octave_idx_type&,
+                             octave_idx_type*, double*, double*,
+                             const octave_idx_type&, octave_idx_type&);
+
+  F77_RET_T
+  F77_FUNC (sgeqp3, SGEQP3) (const octave_idx_type&, const octave_idx_type&,
+                             float*, const octave_idx_type&, octave_idx_type*,
+                             float*, float*, const octave_idx_type&,
+                             octave_idx_type&);
+  F77_RET_T
+  F77_FUNC (zgeqp3, ZGEQP3) (const octave_idx_type&, const octave_idx_type&,
+                             Complex*, const octave_idx_type&,
+                             octave_idx_type*, Complex*, Complex*,
+                             const octave_idx_type&, double*,
+                             octave_idx_type&);
+  F77_RET_T
+  F77_FUNC (cgeqp3, CGEQP3) (const octave_idx_type&, const octave_idx_type&,
+                             FloatComplex*, const octave_idx_type&,
+                             octave_idx_type*, FloatComplex*, FloatComplex*,
+                             const octave_idx_type&, float*, octave_idx_type&);
+}
+
+// Specialization.
+
+template <>
+void
+qrp<Matrix>::init (const Matrix& a, type qr_type)
+{
+  assert (qr_type != qr<Matrix>::raw);
+
+  octave_idx_type m = a.rows ();
+  octave_idx_type n = a.cols ();
+
+  octave_idx_type min_mn = m < n ? m : n;
+  OCTAVE_LOCAL_BUFFER (double, tau, min_mn);
+
+  octave_idx_type info = 0;
+
+  Matrix afact = a;
+  if (m > n && qr_type == qr<Matrix>::std)
+    afact.resize (m, m);
+
+  MArray<octave_idx_type> jpvt (dim_vector (n, 1), 0);
+
+  if (m > 0)
+    {
+      // workspace query.
+      double rlwork;
+      F77_XFCN (dgeqp3, DGEQP3, (m, n, afact.fortran_vec (),
+                                 m, jpvt.fortran_vec (), tau,
+                                 &rlwork, -1, info));
+
+      // allocate buffer and do the job.
+      octave_idx_type lwork = rlwork;
+      lwork = std::max (lwork, static_cast<octave_idx_type> (1));
+      OCTAVE_LOCAL_BUFFER (double, work, lwork);
+      F77_XFCN (dgeqp3, DGEQP3, (m, n, afact.fortran_vec (),
+                                 m, jpvt.fortran_vec (), tau,
+                                 work, lwork, info));
+    }
+  else
+    for (octave_idx_type i = 0; i < n; i++) jpvt(i) = i+1;
+
+  // Form Permutation matrix (if economy is requested, return the
+  // indices only!)
+
+  jpvt -= static_cast<octave_idx_type> (1);
+  p = PermMatrix (jpvt, true);
+
+
+  form (n, afact, tau, qr_type);
+}
+
+template <>
+qrp<Matrix>::qrp (const Matrix& a, type qr_type)
+  : qr<Matrix> (), p ()
+{
+  init (a, qr_type);
+}
+
+template <>
+RowVector
+qrp<Matrix>::Pvec (void) const
+{
+  Array<double> pa (p.col_perm_vec ());
+  RowVector pv (MArray<double> (pa) + 1.0);
+  return pv;
+}
+
+template <>
+void
+qrp<FloatMatrix>::init (const FloatMatrix& a, type qr_type)
+{
+  assert (qr_type != qr<FloatMatrix>::raw);
+
+  octave_idx_type m = a.rows ();
+  octave_idx_type n = a.cols ();
+
+  octave_idx_type min_mn = m < n ? m : n;
+  OCTAVE_LOCAL_BUFFER (float, tau, min_mn);
+
+  octave_idx_type info = 0;
+
+  FloatMatrix afact = a;
+  if (m > n && qr_type == qr<FloatMatrix>::std)
+    afact.resize (m, m);
+
+  MArray<octave_idx_type> jpvt (dim_vector (n, 1), 0);
+
+  if (m > 0)
+    {
+      // workspace query.
+      float rlwork;
+      F77_XFCN (sgeqp3, SGEQP3, (m, n, afact.fortran_vec (),
+                                 m, jpvt.fortran_vec (), tau,
+                                 &rlwork, -1, info));
+
+      // allocate buffer and do the job.
+      octave_idx_type lwork = rlwork;
+      lwork = std::max (lwork, static_cast<octave_idx_type> (1));
+      OCTAVE_LOCAL_BUFFER (float, work, lwork);
+      F77_XFCN (sgeqp3, SGEQP3, (m, n, afact.fortran_vec (),
+                                 m, jpvt.fortran_vec (), tau,
+                                 work, lwork, info));
+    }
+  else
+    for (octave_idx_type i = 0; i < n; i++) jpvt(i) = i+1;
+
+  // Form Permutation matrix (if economy is requested, return the
+  // indices only!)
+
+  jpvt -= static_cast<octave_idx_type> (1);
+  p = PermMatrix (jpvt, true);
+
+
+  form (n, afact, tau, qr_type);
+}
+
+template <>
+qrp<FloatMatrix>::qrp (const FloatMatrix& a, type qr_type)
+  : qr<FloatMatrix> (), p ()
+{
+  init (a, qr_type);
+}
+
+template <>
+FloatRowVector
+qrp<FloatMatrix>::Pvec (void) const
+{
+  Array<float> pa (p.col_perm_vec ());
+  FloatRowVector pv (MArray<float> (pa) + 1.0f);
+  return pv;
+}
+
+template <>
+void
+qrp<ComplexMatrix>::init (const ComplexMatrix& a, type qr_type)
+{
+  assert (qr_type != qr<ComplexMatrix>::raw);
+
+  octave_idx_type m = a.rows ();
+  octave_idx_type n = a.cols ();
+
+  octave_idx_type min_mn = m < n ? m : n;
+  OCTAVE_LOCAL_BUFFER (Complex, tau, min_mn);
+
+  octave_idx_type info = 0;
+
+  ComplexMatrix afact = a;
+  if (m > n && qr_type == qr<ComplexMatrix>::std)
+    afact.resize (m, m);
+
+  MArray<octave_idx_type> jpvt (dim_vector (n, 1), 0);
+
+  if (m > 0)
+    {
+      OCTAVE_LOCAL_BUFFER (double, rwork, 2*n);
+
+      // workspace query.
+      Complex clwork;
+      F77_XFCN (zgeqp3, ZGEQP3, (m, n, afact.fortran_vec (),
+                                 m, jpvt.fortran_vec (), tau,
+                                 &clwork, -1, rwork, info));
+
+      // allocate buffer and do the job.
+      octave_idx_type lwork = clwork.real ();
+      lwork = std::max (lwork, static_cast<octave_idx_type> (1));
+      OCTAVE_LOCAL_BUFFER (Complex, work, lwork);
+      F77_XFCN (zgeqp3, ZGEQP3, (m, n, afact.fortran_vec (),
+                                 m, jpvt.fortran_vec (), tau,
+                                 work, lwork, rwork, info));
+    }
+  else
+    for (octave_idx_type i = 0; i < n; i++) jpvt(i) = i+1;
+
+  // Form Permutation matrix (if economy is requested, return the
+  // indices only!)
+
+  jpvt -= static_cast<octave_idx_type> (1);
+  p = PermMatrix (jpvt, true);
+
+
+  form (n, afact, tau, qr_type);
+}
+
+template <>
+qrp<ComplexMatrix>::qrp (const ComplexMatrix& a, type qr_type)
+  : qr<ComplexMatrix> (), p ()
+{
+  init (a, qr_type);
+}
+
+template <>
+RowVector
+qrp<ComplexMatrix>::Pvec (void) const
+{
+  Array<double> pa (p.col_perm_vec ());
+  RowVector pv (MArray<double> (pa) + 1.0);
+  return pv;
+}
+
+template <>
+void
+qrp<FloatComplexMatrix>::init (const FloatComplexMatrix& a, type qr_type)
+{
+  assert (qr_type != qr<FloatComplexMatrix>::raw);
+
+  octave_idx_type m = a.rows ();
+  octave_idx_type n = a.cols ();
+
+  octave_idx_type min_mn = m < n ? m : n;
+  OCTAVE_LOCAL_BUFFER (FloatComplex, tau, min_mn);
+
+  octave_idx_type info = 0;
+
+  FloatComplexMatrix afact = a;
+  if (m > n && qr_type == qr<FloatComplexMatrix>::std)
+    afact.resize (m, m);
+
+  MArray<octave_idx_type> jpvt (dim_vector (n, 1), 0);
+
+  if (m > 0)
+    {
+      OCTAVE_LOCAL_BUFFER (float, rwork, 2*n);
+
+      // workspace query.
+      FloatComplex clwork;
+      F77_XFCN (cgeqp3, CGEQP3, (m, n, afact.fortran_vec (),
+                                 m, jpvt.fortran_vec (), tau,
+                                 &clwork, -1, rwork, info));
+
+      // allocate buffer and do the job.
+      octave_idx_type lwork = clwork.real ();
+      lwork = std::max (lwork, static_cast<octave_idx_type> (1));
+      OCTAVE_LOCAL_BUFFER (FloatComplex, work, lwork);
+      F77_XFCN (cgeqp3, CGEQP3, (m, n, afact.fortran_vec (),
+                                 m, jpvt.fortran_vec (), tau,
+                                 work, lwork, rwork, info));
+    }
+  else
+    for (octave_idx_type i = 0; i < n; i++) jpvt(i) = i+1;
+
+  // Form Permutation matrix (if economy is requested, return the
+  // indices only!)
+
+  jpvt -= static_cast<octave_idx_type> (1);
+  p = PermMatrix (jpvt, true);
+
+
+  form (n, afact, tau, qr_type);
+}
+
+template <>
+qrp<FloatComplexMatrix>::qrp (const FloatComplexMatrix& a, type qr_type)
+  : qr<FloatComplexMatrix> (), p ()
+{
+  init (a, qr_type);
+}
+
+template <>
+FloatRowVector
+qrp<FloatComplexMatrix>::Pvec (void) const
+{
+  Array<float> pa (p.col_perm_vec ());
+  FloatRowVector pv (MArray<float> (pa) + 1.0f);
+  return pv;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/numeric/qrp.h	Wed Feb 17 02:54:00 2016 -0500
@@ -0,0 +1,72 @@
+/*
+
+Copyright (C) 1994-2015 John W. Eaton
+Copyright (C) 2009 VZLU Prague
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#if ! defined (octave_qrp_h)
+#define octave_qrp_h 1
+
+#include "octave-config.h"
+
+#include "PermMatrix.h"
+#include "qr.h"
+
+template <typename T>
+class
+qrp : public qr<T>
+{
+public:
+
+  typedef typename T::real_row_vector_type RV_T;
+
+  typedef typename qr<T>::type type;
+
+  qrp (void) : qr<T> (), p () { }
+
+  qrp (const T&, type = qr<T>::std);
+
+  qrp (const qrp& a) : qr<T> (a), p (a.p) { }
+
+  qrp& operator = (const qrp& a)
+  {
+    if (this != &a)
+      {
+        qr<T>::operator = (a);
+        p = a.p;
+      }
+
+    return *this;
+  }
+
+  ~qrp (void) { }
+
+  void init (const T&, type = qr<T>::std);
+
+  PermMatrix P (void) const { return p; }
+
+  RV_T Pvec (void) const;
+
+private:
+
+  PermMatrix p;
+};
+
+#endif
--- a/liboctave/operators/mx-defs.h	Wed Feb 17 02:57:21 2016 -0500
+++ b/liboctave/operators/mx-defs.h	Wed Feb 17 02:54:00 2016 -0500
@@ -76,10 +76,7 @@
 
 template <typename T> class qr;
 
-class QRP;
-class ComplexQRP;
-class FloatQRP;
-class FloatComplexQRP;
+template <typename T> class qrp;
 
 // Other data types we use but that don't always need to have full
 // declarations.