view liboctave/array/CSparse.h @ 30564:796f54d4ddbf stable

update Octave Project Developers copyright for the new year In files that have the "Octave Project Developers" copyright notice, update for 2021. In all .txi and .texi files except gpl.txi and gpl.texi in the doc/liboctave and doc/interpreter directories, change the copyright to "Octave Project Developers", the same as used for other source files. Update copyright notices for 2022 (not done since 2019). For gpl.txi and gpl.texi, change the copyright notice to be "Free Software Foundation, Inc." and leave the date at 2007 only because this file only contains the text of the GPL, not anything created by the Octave Project Developers. Add Paul Thomas to contributors.in.
author John W. Eaton <jwe@octave.org>
date Tue, 28 Dec 2021 18:22:40 -0500
parents 6f07492c9c20
children
line wrap: on
line source

////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 1998-2022 The Octave Project Developers
//
// See the file COPYRIGHT.md in the top-level directory of this
// distribution or <https://octave.org/copyright/>.
//
// 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
// <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////////////

#if ! defined (octave_CSparse_h)
#define octave_CSparse_h 1

#include "octave-config.h"

#include "CColVector.h"
#include "CMatrix.h"
#include "CNDArray.h"
#include "DET.h"
#include "MSparse.h"
#include "MatrixType.h"
#include "Sparse-op-decls.h"
#include "dColVector.h"
#include "dMatrix.h"
#include "dNDArray.h"
#include "oct-cmplx.h"
#include "mx-fwd.h"

class
OCTAVE_API
SparseComplexMatrix : public MSparse<Complex>
{
public:

  // Corresponding dense matrix type for this sparse matrix type.
  typedef ComplexMatrix dense_matrix_type;

  typedef void (*solve_singularity_handler) (double rcond);

  SparseComplexMatrix (void) : MSparse<Complex> () { }

  SparseComplexMatrix (octave_idx_type r,
                       octave_idx_type c) : MSparse<Complex> (r, c) { }

  SparseComplexMatrix (const dim_vector& dv, octave_idx_type nz = 0)
    : MSparse<Complex> (dv, nz) { }

  explicit SparseComplexMatrix (octave_idx_type r, octave_idx_type c,
                                Complex val)
    : MSparse<Complex> (r, c, val) { }

  SparseComplexMatrix (octave_idx_type r, octave_idx_type c, double val)
    : MSparse<Complex> (r, c, Complex (val)) { }

  SparseComplexMatrix (const SparseComplexMatrix& a)
    : MSparse<Complex> (a) { }

  SparseComplexMatrix (const SparseComplexMatrix& a, const dim_vector& dv)
    : MSparse<Complex> (a, dv) { }

  SparseComplexMatrix (const MSparse<Complex>& a) : MSparse<Complex> (a) { }

  SparseComplexMatrix (const Sparse<Complex>& a) : MSparse<Complex> (a) { }

  explicit SparseComplexMatrix (const ComplexMatrix& a)
    : MSparse<Complex> (a) { }

  explicit SparseComplexMatrix (const ComplexNDArray& a)
    : MSparse<Complex> (a) { }

  SparseComplexMatrix (const Array<Complex>& a, const octave::idx_vector& r,
                       const octave::idx_vector& c, octave_idx_type nr = -1,
                       octave_idx_type nc = -1, bool sum_terms = true,
                       octave_idx_type nzm = -1)
    : MSparse<Complex> (a, r, c, nr, nc, sum_terms, nzm) { }

  explicit OCTAVE_API SparseComplexMatrix (const SparseMatrix& a);

  explicit OCTAVE_API SparseComplexMatrix (const SparseBoolMatrix& a);

  explicit OCTAVE_API SparseComplexMatrix (const ComplexDiagMatrix& a);

  SparseComplexMatrix (octave_idx_type r, octave_idx_type c,
                       octave_idx_type num_nz)
    : MSparse<Complex> (r, c, num_nz) { }

  SparseComplexMatrix& operator = (const SparseComplexMatrix& a)
  {
    MSparse<Complex>::operator = (a);
    return *this;
  }

  OCTAVE_API bool operator == (const SparseComplexMatrix& a) const;
  OCTAVE_API bool operator != (const SparseComplexMatrix& a) const;

  OCTAVE_API bool ishermitian (void) const;

  OCTAVE_API SparseComplexMatrix max (int dim = -1) const;
  OCTAVE_API SparseComplexMatrix
  max (Array<octave_idx_type>& index, int dim = -1) const;
  OCTAVE_API SparseComplexMatrix min (int dim = -1) const;
  OCTAVE_API SparseComplexMatrix
  min (Array<octave_idx_type>& index, int dim = -1) const;

  OCTAVE_API SparseComplexMatrix&
  insert (const SparseComplexMatrix& a, octave_idx_type r, octave_idx_type c);
  OCTAVE_API SparseComplexMatrix&
  insert (const SparseMatrix& a, octave_idx_type r, octave_idx_type c);
  OCTAVE_API SparseComplexMatrix&
  insert (const SparseComplexMatrix& a, const Array<octave_idx_type>& indx);
  OCTAVE_API SparseComplexMatrix&
  insert (const SparseMatrix& a, const Array<octave_idx_type>& indx);

  OCTAVE_API SparseComplexMatrix
  concat (const SparseComplexMatrix& rb, const Array<octave_idx_type>& ra_idx);
  OCTAVE_API SparseComplexMatrix
  concat (const SparseMatrix& rb, const Array<octave_idx_type>& ra_idx);

  OCTAVE_API ComplexMatrix matrix_value (void) const;

  OCTAVE_API SparseComplexMatrix hermitian (void) const;  // complex conjugate transpose
  SparseComplexMatrix transpose (void) const
  { return MSparse<Complex>::transpose (); }

  friend OCTAVE_API SparseComplexMatrix conj (const SparseComplexMatrix& a);

  // extract row or column i.

  OCTAVE_API ComplexRowVector row (octave_idx_type i) const;

  OCTAVE_API ComplexColumnVector column (octave_idx_type i) const;

private:
  SparseComplexMatrix dinverse (MatrixType& mattype, octave_idx_type& info,
                                double& rcond, const bool force = false,
                                const bool calccond = true) const;

  SparseComplexMatrix tinverse (MatrixType& mattype, octave_idx_type& info,
                                double& rcond, const bool force = false,
                                const bool calccond = true) const;

public:
  OCTAVE_API SparseComplexMatrix inverse (void) const;
  OCTAVE_API SparseComplexMatrix inverse (MatrixType& mattype) const;
  OCTAVE_API SparseComplexMatrix
  inverse (MatrixType& mattype, octave_idx_type& info) const;
  OCTAVE_API SparseComplexMatrix
  inverse (MatrixType& mattype, octave_idx_type& info, double& rcond,
           bool force = false, bool calc_cond = true) const;

  OCTAVE_API ComplexDET determinant (void) const;
  OCTAVE_API ComplexDET determinant (octave_idx_type& info) const;
  OCTAVE_API ComplexDET
  determinant (octave_idx_type& info, double& rcond,
               bool calc_cond = true) const;

private:
  // Diagonal matrix solvers
  ComplexMatrix dsolve (MatrixType& mattype, const Matrix& b,
                        octave_idx_type& info, double& rcond,
                        solve_singularity_handler sing_handler,
                        bool calc_cond = false) const;

  ComplexMatrix dsolve (MatrixType& mattype, const ComplexMatrix& b,
                        octave_idx_type& info, double& rcond,
                        solve_singularity_handler sing_handler,
                        bool calc_cond = false) const;

  SparseComplexMatrix dsolve (MatrixType& mattype, const SparseMatrix& b,
                              octave_idx_type& info, double& rcond,
                              solve_singularity_handler sing_handler,
                              bool calc_cond = false) const;

  SparseComplexMatrix dsolve (MatrixType& mattype, const SparseComplexMatrix& b,
                              octave_idx_type& info, double& rcond,
                              solve_singularity_handler sing_handler,
                              bool calc_cond = false) const;

  // Upper triangular matrix solvers
  ComplexMatrix utsolve (MatrixType& mattype, const Matrix& b,
                         octave_idx_type& info, double& rcond,
                         solve_singularity_handler sing_handler,
                         bool calc_cond = false) const;

  ComplexMatrix utsolve (MatrixType& mattype, const ComplexMatrix& b,
                         octave_idx_type& info, double& rcond,
                         solve_singularity_handler sing_handler,
                         bool calc_cond = false) const;

  SparseComplexMatrix utsolve (MatrixType& mattype, const SparseMatrix& b,
                               octave_idx_type& info, double& rcond,
                               solve_singularity_handler sing_handler,
                               bool calc_cond = false) const;

  SparseComplexMatrix utsolve (MatrixType& mattype, const SparseComplexMatrix& b,
                               octave_idx_type& info, double& rcond,
                               solve_singularity_handler sing_handler,
                               bool calc_cond = false) const;

  // Lower triangular matrix solvers
  ComplexMatrix ltsolve (MatrixType& mattype, const Matrix& b,
                         octave_idx_type& info, double& rcond,
                         solve_singularity_handler sing_handler,
                         bool calc_cond = false) const;

  ComplexMatrix ltsolve (MatrixType& mattype, const ComplexMatrix& b,
                         octave_idx_type& info, double& rcond,
                         solve_singularity_handler sing_handler,
                         bool calc_cond = false) const;

  SparseComplexMatrix ltsolve (MatrixType& mattype, const SparseMatrix& b,
                               octave_idx_type& info, double& rcond,
                               solve_singularity_handler sing_handler,
                               bool calc_cond = false) const;

  SparseComplexMatrix ltsolve (MatrixType& mattype, const SparseComplexMatrix& b,
                               octave_idx_type& info, double& rcond,
                               solve_singularity_handler sing_handler,
                               bool calc_cond = false) const;

  // Tridiagonal matrix solvers
  ComplexMatrix trisolve (MatrixType& mattype, const Matrix& b,
                          octave_idx_type& info, double& rcond,
                          solve_singularity_handler sing_handler,
                          bool calc_cond = false) const;

  ComplexMatrix trisolve (MatrixType& mattype, const ComplexMatrix& b,
                          octave_idx_type& info, double& rcond,
                          solve_singularity_handler sing_handler,
                          bool calc_cond = false) const;

  SparseComplexMatrix trisolve (MatrixType& mattype, const SparseMatrix& b,
                                octave_idx_type& info, double& rcond,
                                solve_singularity_handler sing_handler,
                                bool calc_cond = false) const;

  SparseComplexMatrix trisolve (MatrixType& mattype, const SparseComplexMatrix& b,
                                octave_idx_type& info, double& rcond,
                                solve_singularity_handler sing_handler,
                                bool calc_cond = false) const;

  // Banded matrix solvers (umfpack/cholesky)
  ComplexMatrix bsolve (MatrixType& mattype, const Matrix& b,
                        octave_idx_type& info, double& rcond,
                        solve_singularity_handler sing_handler,
                        bool calc_cond = false) const;

  ComplexMatrix bsolve (MatrixType& mattype, const ComplexMatrix& b,
                        octave_idx_type& info, double& rcond,
                        solve_singularity_handler sing_handler,
                        bool calc_cond = false) const;

  SparseComplexMatrix bsolve (MatrixType& mattype, const SparseMatrix& b,
                              octave_idx_type& info, double& rcond,
                              solve_singularity_handler sing_handler,
                              bool calc_cond = false) const;

  SparseComplexMatrix bsolve (MatrixType& mattype, const SparseComplexMatrix& b,
                              octave_idx_type& info, double& rcond,
                              solve_singularity_handler sing_handler,
                              bool calc_cond = false) const;

  // Full matrix solvers (umfpack/cholesky)
  void * factorize (octave_idx_type& err, double& rcond, Matrix& Control,
                    Matrix& Info, solve_singularity_handler sing_handler,
                    bool calc_cond) const;

  ComplexMatrix fsolve (MatrixType& mattype, const Matrix& b,
                        octave_idx_type& info, double& rcond,
                        solve_singularity_handler sing_handler,
                        bool calc_cond = false) const;

  ComplexMatrix fsolve (MatrixType& mattype, const ComplexMatrix& b,
                        octave_idx_type& info, double& rcond,
                        solve_singularity_handler sing_handler,
                        bool calc_cond = false) const;

  SparseComplexMatrix fsolve (MatrixType& mattype, const SparseMatrix& b,
                              octave_idx_type& info, double& rcond,
                              solve_singularity_handler sing_handler,
                              bool calc_cond = false) const;

  SparseComplexMatrix fsolve (MatrixType& mattype, const SparseComplexMatrix& b,
                              octave_idx_type& info, double& rcond,
                              solve_singularity_handler sing_handler,
                              bool calc_cond = false) const;

public:
  // Generic interface to solver with no probing of type
  OCTAVE_API ComplexMatrix solve (MatrixType& mattype, const Matrix& b) const;
  OCTAVE_API ComplexMatrix
  solve (MatrixType& mattype, const Matrix& b, octave_idx_type& info) const;
  OCTAVE_API ComplexMatrix
  solve (MatrixType& mattype, const Matrix& b, octave_idx_type& info,
         double& rcond) const;
  OCTAVE_API ComplexMatrix
  solve (MatrixType& mattype, const Matrix& b, octave_idx_type& info,
         double& rcond, solve_singularity_handler sing_handler,
         bool singular_fallback = true) const;

  OCTAVE_API ComplexMatrix
  solve (MatrixType& mattype, const ComplexMatrix& b) const;
  OCTAVE_API ComplexMatrix
  solve (MatrixType& mattype, const ComplexMatrix& b,
         octave_idx_type& info) const;
  OCTAVE_API ComplexMatrix
  solve (MatrixType& mattype, const ComplexMatrix& b,
         octave_idx_type& info, double& rcond) const;
  OCTAVE_API ComplexMatrix
  solve (MatrixType& mattype, const ComplexMatrix& b,
         octave_idx_type& info, double& rcond,
         solve_singularity_handler sing_handler,
         bool singular_fallback = true) const;

  OCTAVE_API SparseComplexMatrix
  solve (MatrixType& mattype, const SparseMatrix& b) const;
  OCTAVE_API SparseComplexMatrix
  solve (MatrixType& mattype, const SparseMatrix& b,
         octave_idx_type& info) const;
  OCTAVE_API SparseComplexMatrix
  solve (MatrixType& mattype, const SparseMatrix& b, octave_idx_type& info,
         double& rcond) const;
  OCTAVE_API SparseComplexMatrix
  solve (MatrixType& mattype, const SparseMatrix& b, octave_idx_type& info,
         double& rcond, solve_singularity_handler sing_handler,
         bool singular_fallback = true) const;

  OCTAVE_API SparseComplexMatrix
  solve (MatrixType& mattype, const SparseComplexMatrix& b) const;
  OCTAVE_API SparseComplexMatrix
  solve (MatrixType& mattype, const SparseComplexMatrix& b,
         octave_idx_type& info) const;
  OCTAVE_API SparseComplexMatrix
  solve (MatrixType& mattype, const SparseComplexMatrix& b,
         octave_idx_type& info, double& rcond) const;
  OCTAVE_API SparseComplexMatrix
  solve (MatrixType& mattype, const SparseComplexMatrix& b,
         octave_idx_type& info, double& rcond,
         solve_singularity_handler sing_handler,
         bool singular_fallback = true) const;

  OCTAVE_API ComplexColumnVector
  solve (MatrixType& mattype, const ColumnVector& b) const;
  OCTAVE_API ComplexColumnVector
  solve (MatrixType& mattype, const ColumnVector& b,
         octave_idx_type& info) const;
  OCTAVE_API ComplexColumnVector
  solve (MatrixType& mattype, const ColumnVector& b,
         octave_idx_type& info, double& rcond) const;
  OCTAVE_API ComplexColumnVector
  solve (MatrixType& mattype, const ColumnVector& b,
         octave_idx_type& info, double& rcond,
         solve_singularity_handler sing_handler) const;

  OCTAVE_API ComplexColumnVector
  solve (MatrixType& mattype, const ComplexColumnVector& b) const;
  OCTAVE_API ComplexColumnVector
  solve (MatrixType& mattype, const ComplexColumnVector& b,
         octave_idx_type& info) const;
  OCTAVE_API ComplexColumnVector
  solve (MatrixType& mattype, const ComplexColumnVector& b,
         octave_idx_type& info, double& rcond) const;
  OCTAVE_API ComplexColumnVector
  solve (MatrixType& mattype, const ComplexColumnVector& b,
         octave_idx_type& info, double& rcond,
         solve_singularity_handler sing_handler) const;

  // Generic interface to solver with probing of type
  OCTAVE_API ComplexMatrix solve (const Matrix& b) const;
  OCTAVE_API ComplexMatrix
  solve (const Matrix& b, octave_idx_type& info) const;
  OCTAVE_API ComplexMatrix
  solve (const Matrix& b, octave_idx_type& info, double& rcond) const;
  OCTAVE_API ComplexMatrix
  solve (const Matrix& b, octave_idx_type& info, double& rcond,
         solve_singularity_handler sing_handler) const;

  OCTAVE_API ComplexMatrix solve (const ComplexMatrix& b) const;
  OCTAVE_API ComplexMatrix
  solve (const ComplexMatrix& b, octave_idx_type& info) const;
  OCTAVE_API ComplexMatrix
  solve (const ComplexMatrix& b, octave_idx_type& info, double& rcond) const;
  OCTAVE_API ComplexMatrix
  solve (const ComplexMatrix& b, octave_idx_type& info, double& rcond,
         solve_singularity_handler sing_handler) const;

  OCTAVE_API SparseComplexMatrix solve (const SparseMatrix& b) const;
  OCTAVE_API SparseComplexMatrix
  solve (const SparseMatrix& b, octave_idx_type& info) const;
  OCTAVE_API SparseComplexMatrix
  solve (const SparseMatrix& b, octave_idx_type& info, double& rcond) const;
  OCTAVE_API SparseComplexMatrix
  solve (const SparseMatrix& b, octave_idx_type& info, double& rcond,
         solve_singularity_handler sing_handler) const;

  OCTAVE_API SparseComplexMatrix solve (const SparseComplexMatrix& b) const;
  OCTAVE_API SparseComplexMatrix
  solve (const SparseComplexMatrix& b, octave_idx_type& info) const;
  OCTAVE_API SparseComplexMatrix
  solve (const SparseComplexMatrix& b, octave_idx_type& info,
         double& rcond) const;
  OCTAVE_API SparseComplexMatrix
  solve (const SparseComplexMatrix& b, octave_idx_type& info, double& rcond,
         solve_singularity_handler sing_handler) const;

  OCTAVE_API ComplexColumnVector solve (const ColumnVector& b) const;
  OCTAVE_API ComplexColumnVector
  solve (const ColumnVector& b, octave_idx_type& info) const;
  OCTAVE_API ComplexColumnVector
  solve (const ColumnVector& b, octave_idx_type& info, double& rcond) const;
  OCTAVE_API ComplexColumnVector
  solve (const ColumnVector& b, octave_idx_type& info, double& rcond,
         solve_singularity_handler sing_handler) const;

  OCTAVE_API ComplexColumnVector solve (const ComplexColumnVector& b) const;
  OCTAVE_API ComplexColumnVector
  solve (const ComplexColumnVector& b, octave_idx_type& info) const;
  OCTAVE_API ComplexColumnVector
  solve (const ComplexColumnVector& b, octave_idx_type& info,
         double& rcond) const;
  OCTAVE_API ComplexColumnVector
  solve (const ComplexColumnVector& b, octave_idx_type& info, double& rcond,
         solve_singularity_handler sing_handler) const;

  OCTAVE_API SparseComplexMatrix squeeze (void) const;

  OCTAVE_API SparseComplexMatrix reshape (const dim_vector& new_dims) const;

  OCTAVE_API SparseComplexMatrix
  permute (const Array<octave_idx_type>& vec, bool inv = false) const;

  OCTAVE_API SparseComplexMatrix
  ipermute (const Array<octave_idx_type>& vec) const;

  OCTAVE_API bool any_element_is_nan (void) const;
  OCTAVE_API bool any_element_is_inf_or_nan (void) const;
  OCTAVE_API bool all_elements_are_real (void) const;
  OCTAVE_API bool all_integers (double& max_val, double& min_val) const;
  OCTAVE_API bool too_large_for_float (void) const;

  OCTAVE_API SparseBoolMatrix operator ! (void) const;

  OCTAVE_API SparseBoolMatrix all (int dim = -1) const;
  OCTAVE_API SparseBoolMatrix any (int dim = -1) const;

  OCTAVE_API SparseComplexMatrix cumprod (int dim = -1) const;
  OCTAVE_API SparseComplexMatrix cumsum (int dim = -1) const;
  OCTAVE_API SparseComplexMatrix prod (int dim = -1) const;
  OCTAVE_API SparseComplexMatrix sum (int dim = -1) const;
  OCTAVE_API SparseComplexMatrix sumsq (int dim = -1) const;
  OCTAVE_API SparseMatrix abs (void) const;

  OCTAVE_API SparseComplexMatrix diag (octave_idx_type k = 0) const;

  // i/o
  friend OCTAVE_API std::ostream&
  operator << (std::ostream& os, const SparseComplexMatrix& a);
  friend OCTAVE_API std::istream&
  operator >> (std::istream& is, SparseComplexMatrix& a);
};

extern OCTAVE_API SparseComplexMatrix
operator * (const SparseMatrix&, const SparseComplexMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator * (const SparseComplexMatrix&, const SparseMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator * (const SparseComplexMatrix&, const SparseComplexMatrix&);

extern OCTAVE_API ComplexMatrix
operator * (const Matrix&, const SparseComplexMatrix&);
extern OCTAVE_API ComplexMatrix
operator * (const ComplexMatrix&, const SparseMatrix&);
extern OCTAVE_API ComplexMatrix
operator * (const ComplexMatrix&, const SparseComplexMatrix&);
extern OCTAVE_API ComplexMatrix
mul_trans (const ComplexMatrix&, const SparseComplexMatrix&);
extern OCTAVE_API ComplexMatrix
mul_herm (const ComplexMatrix&, const SparseComplexMatrix&);

extern OCTAVE_API ComplexMatrix
operator * (const SparseMatrix&, const ComplexMatrix&);
extern OCTAVE_API ComplexMatrix
operator * (const SparseComplexMatrix&, const Matrix&);
extern OCTAVE_API ComplexMatrix
operator * (const SparseComplexMatrix&, const ComplexMatrix&);
extern OCTAVE_API ComplexMatrix
trans_mul (const SparseComplexMatrix&, const ComplexMatrix&);
extern OCTAVE_API ComplexMatrix
herm_mul (const SparseComplexMatrix&, const ComplexMatrix&);

extern OCTAVE_API SparseComplexMatrix
operator * (const DiagMatrix&, const SparseComplexMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator * (const SparseComplexMatrix&, const DiagMatrix&);

extern OCTAVE_API SparseComplexMatrix
operator * (const ComplexDiagMatrix&, const SparseMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator * (const SparseMatrix&, const ComplexDiagMatrix&);

extern OCTAVE_API SparseComplexMatrix
operator * (const ComplexDiagMatrix&, const SparseComplexMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator * (const SparseComplexMatrix&, const ComplexDiagMatrix&);

extern OCTAVE_API SparseComplexMatrix
operator + (const ComplexDiagMatrix&, const SparseMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator + (const DiagMatrix&, const SparseComplexMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator + (const ComplexDiagMatrix&, const SparseComplexMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator + (const SparseMatrix&, const ComplexDiagMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator + (const SparseComplexMatrix&, const DiagMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator + (const SparseComplexMatrix&, const ComplexDiagMatrix&);

extern OCTAVE_API SparseComplexMatrix
operator - (const ComplexDiagMatrix&, const SparseMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator - (const DiagMatrix&, const SparseComplexMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator - (const ComplexDiagMatrix&, const SparseComplexMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator - (const SparseMatrix&, const ComplexDiagMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator - (const SparseComplexMatrix&, const DiagMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator - (const SparseComplexMatrix&, const ComplexDiagMatrix&);

extern OCTAVE_API SparseComplexMatrix
operator * (const PermMatrix&, const SparseComplexMatrix&);
extern OCTAVE_API SparseComplexMatrix
operator * (const SparseComplexMatrix&, const PermMatrix&);

extern OCTAVE_API SparseComplexMatrix
min (const Complex& c, const SparseComplexMatrix& m);
extern OCTAVE_API SparseComplexMatrix
min (const SparseComplexMatrix& m, const Complex& c);
extern OCTAVE_API SparseComplexMatrix
min (const SparseComplexMatrix& a, const SparseComplexMatrix& b);

extern OCTAVE_API SparseComplexMatrix
max (const Complex& c, const SparseComplexMatrix& m);
extern OCTAVE_API SparseComplexMatrix
max (const SparseComplexMatrix& m, const Complex& c);
extern OCTAVE_API SparseComplexMatrix
max (const SparseComplexMatrix& a, const SparseComplexMatrix& b);

SPARSE_SMS_CMP_OP_DECLS (SparseComplexMatrix, Complex, OCTAVE_API)
SPARSE_SMS_BOOL_OP_DECLS (SparseComplexMatrix, Complex, OCTAVE_API)

SPARSE_SSM_CMP_OP_DECLS (Complex, SparseComplexMatrix, OCTAVE_API)
SPARSE_SSM_BOOL_OP_DECLS (Complex, SparseComplexMatrix, OCTAVE_API)

SPARSE_SMSM_CMP_OP_DECLS (SparseComplexMatrix, SparseComplexMatrix, OCTAVE_API)
SPARSE_SMSM_BOOL_OP_DECLS (SparseComplexMatrix, SparseComplexMatrix, OCTAVE_API)

SPARSE_FORWARD_DEFS (MSparse, SparseComplexMatrix, ComplexMatrix, Complex)

#endif