mirror of
https://asciireactor.com/otho/psdlag-agn.git
synced 2024-11-24 08:25:04 +00:00
5188 lines
204 KiB
C
5188 lines
204 KiB
C
|
/*************************************************************************
|
|||
|
Copyright (c) Sergey Bochkanov (ALGLIB project).
|
|||
|
|
|||
|
>>> SOURCE LICENSE >>>
|
|||
|
This program 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 (www.fsf.org); either version 2 of the
|
|||
|
License, or (at your option) any later version.
|
|||
|
|
|||
|
This program 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.
|
|||
|
|
|||
|
A copy of the GNU General Public License is available at
|
|||
|
http://www.fsf.org/licensing/licenses
|
|||
|
>>> END OF LICENSE >>>
|
|||
|
*************************************************************************/
|
|||
|
#ifndef _linalg_pkg_h
|
|||
|
#define _linalg_pkg_h
|
|||
|
#include "ap.h"
|
|||
|
#include "alglibinternal.h"
|
|||
|
#include "alglibmisc.h"
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// THIS SECTION CONTAINS COMPUTATIONAL CORE DECLARATIONS (DATATYPES)
|
|||
|
//
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
namespace alglib_impl
|
|||
|
{
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
double r1;
|
|||
|
double rinf;
|
|||
|
} matinvreport;
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
ae_vector vals;
|
|||
|
ae_vector idx;
|
|||
|
ae_vector ridx;
|
|||
|
ae_vector didx;
|
|||
|
ae_vector uidx;
|
|||
|
ae_int_t matrixtype;
|
|||
|
ae_int_t m;
|
|||
|
ae_int_t n;
|
|||
|
ae_int_t nfree;
|
|||
|
ae_int_t ninitialized;
|
|||
|
} sparsematrix;
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
double e1;
|
|||
|
double e2;
|
|||
|
ae_vector x;
|
|||
|
ae_vector ax;
|
|||
|
double xax;
|
|||
|
ae_int_t n;
|
|||
|
ae_vector rk;
|
|||
|
ae_vector rk1;
|
|||
|
ae_vector xk;
|
|||
|
ae_vector xk1;
|
|||
|
ae_vector pk;
|
|||
|
ae_vector pk1;
|
|||
|
ae_vector b;
|
|||
|
rcommstate rstate;
|
|||
|
ae_vector tmp2;
|
|||
|
} fblslincgstate;
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
ae_int_t n;
|
|||
|
ae_int_t m;
|
|||
|
ae_int_t nstart;
|
|||
|
ae_int_t nits;
|
|||
|
ae_int_t seedval;
|
|||
|
ae_vector x0;
|
|||
|
ae_vector x1;
|
|||
|
ae_vector t;
|
|||
|
ae_vector xbest;
|
|||
|
hqrndstate r;
|
|||
|
ae_vector x;
|
|||
|
ae_vector mv;
|
|||
|
ae_vector mtv;
|
|||
|
ae_bool needmv;
|
|||
|
ae_bool needmtv;
|
|||
|
double repnorm;
|
|||
|
rcommstate rstate;
|
|||
|
} normestimatorstate;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// THIS SECTION CONTAINS C++ INTERFACE
|
|||
|
//
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
namespace alglib
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Matrix inverse report:
|
|||
|
* R1 reciprocal of condition number in 1-norm
|
|||
|
* RInf reciprocal of condition number in inf-norm
|
|||
|
*************************************************************************/
|
|||
|
class _matinvreport_owner
|
|||
|
{
|
|||
|
public:
|
|||
|
_matinvreport_owner();
|
|||
|
_matinvreport_owner(const _matinvreport_owner &rhs);
|
|||
|
_matinvreport_owner& operator=(const _matinvreport_owner &rhs);
|
|||
|
virtual ~_matinvreport_owner();
|
|||
|
alglib_impl::matinvreport* c_ptr();
|
|||
|
alglib_impl::matinvreport* c_ptr() const;
|
|||
|
protected:
|
|||
|
alglib_impl::matinvreport *p_struct;
|
|||
|
};
|
|||
|
class matinvreport : public _matinvreport_owner
|
|||
|
{
|
|||
|
public:
|
|||
|
matinvreport();
|
|||
|
matinvreport(const matinvreport &rhs);
|
|||
|
matinvreport& operator=(const matinvreport &rhs);
|
|||
|
virtual ~matinvreport();
|
|||
|
double &r1;
|
|||
|
double &rinf;
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Sparse matrix
|
|||
|
|
|||
|
You should use ALGLIB functions to work with sparse matrix.
|
|||
|
Never try to access its fields directly!
|
|||
|
*************************************************************************/
|
|||
|
class _sparsematrix_owner
|
|||
|
{
|
|||
|
public:
|
|||
|
_sparsematrix_owner();
|
|||
|
_sparsematrix_owner(const _sparsematrix_owner &rhs);
|
|||
|
_sparsematrix_owner& operator=(const _sparsematrix_owner &rhs);
|
|||
|
virtual ~_sparsematrix_owner();
|
|||
|
alglib_impl::sparsematrix* c_ptr();
|
|||
|
alglib_impl::sparsematrix* c_ptr() const;
|
|||
|
protected:
|
|||
|
alglib_impl::sparsematrix *p_struct;
|
|||
|
};
|
|||
|
class sparsematrix : public _sparsematrix_owner
|
|||
|
{
|
|||
|
public:
|
|||
|
sparsematrix();
|
|||
|
sparsematrix(const sparsematrix &rhs);
|
|||
|
sparsematrix& operator=(const sparsematrix &rhs);
|
|||
|
virtual ~sparsematrix();
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This object stores state of the iterative norm estimation algorithm.
|
|||
|
|
|||
|
You should use ALGLIB functions to work with this object.
|
|||
|
*************************************************************************/
|
|||
|
class _normestimatorstate_owner
|
|||
|
{
|
|||
|
public:
|
|||
|
_normestimatorstate_owner();
|
|||
|
_normestimatorstate_owner(const _normestimatorstate_owner &rhs);
|
|||
|
_normestimatorstate_owner& operator=(const _normestimatorstate_owner &rhs);
|
|||
|
virtual ~_normestimatorstate_owner();
|
|||
|
alglib_impl::normestimatorstate* c_ptr();
|
|||
|
alglib_impl::normestimatorstate* c_ptr() const;
|
|||
|
protected:
|
|||
|
alglib_impl::normestimatorstate *p_struct;
|
|||
|
};
|
|||
|
class normestimatorstate : public _normestimatorstate_owner
|
|||
|
{
|
|||
|
public:
|
|||
|
normestimatorstate();
|
|||
|
normestimatorstate(const normestimatorstate &rhs);
|
|||
|
normestimatorstate& operator=(const normestimatorstate &rhs);
|
|||
|
virtual ~normestimatorstate();
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Cache-oblivous complex "copy-and-transpose"
|
|||
|
|
|||
|
Input parameters:
|
|||
|
M - number of rows
|
|||
|
N - number of columns
|
|||
|
A - source matrix, MxN submatrix is copied and transposed
|
|||
|
IA - submatrix offset (row index)
|
|||
|
JA - submatrix offset (column index)
|
|||
|
B - destination matrix, must be large enough to store result
|
|||
|
IB - submatrix offset (row index)
|
|||
|
JB - submatrix offset (column index)
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixtranspose(const ae_int_t m, const ae_int_t n, const complex_2d_array &a, const ae_int_t ia, const ae_int_t ja, complex_2d_array &b, const ae_int_t ib, const ae_int_t jb);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Cache-oblivous real "copy-and-transpose"
|
|||
|
|
|||
|
Input parameters:
|
|||
|
M - number of rows
|
|||
|
N - number of columns
|
|||
|
A - source matrix, MxN submatrix is copied and transposed
|
|||
|
IA - submatrix offset (row index)
|
|||
|
JA - submatrix offset (column index)
|
|||
|
B - destination matrix, must be large enough to store result
|
|||
|
IB - submatrix offset (row index)
|
|||
|
JB - submatrix offset (column index)
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixtranspose(const ae_int_t m, const ae_int_t n, const real_2d_array &a, const ae_int_t ia, const ae_int_t ja, real_2d_array &b, const ae_int_t ib, const ae_int_t jb);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This code enforces symmetricy of the matrix by copying Upper part to lower
|
|||
|
one (or vice versa).
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - matrix
|
|||
|
N - number of rows/columns
|
|||
|
IsUpper - whether we want to copy upper triangle to lower one (True)
|
|||
|
or vice versa (False).
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixenforcesymmetricity(const real_2d_array &a, const ae_int_t n, const bool isupper);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Copy
|
|||
|
|
|||
|
Input parameters:
|
|||
|
M - number of rows
|
|||
|
N - number of columns
|
|||
|
A - source matrix, MxN submatrix is copied and transposed
|
|||
|
IA - submatrix offset (row index)
|
|||
|
JA - submatrix offset (column index)
|
|||
|
B - destination matrix, must be large enough to store result
|
|||
|
IB - submatrix offset (row index)
|
|||
|
JB - submatrix offset (column index)
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixcopy(const ae_int_t m, const ae_int_t n, const complex_2d_array &a, const ae_int_t ia, const ae_int_t ja, complex_2d_array &b, const ae_int_t ib, const ae_int_t jb);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Copy
|
|||
|
|
|||
|
Input parameters:
|
|||
|
M - number of rows
|
|||
|
N - number of columns
|
|||
|
A - source matrix, MxN submatrix is copied and transposed
|
|||
|
IA - submatrix offset (row index)
|
|||
|
JA - submatrix offset (column index)
|
|||
|
B - destination matrix, must be large enough to store result
|
|||
|
IB - submatrix offset (row index)
|
|||
|
JB - submatrix offset (column index)
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixcopy(const ae_int_t m, const ae_int_t n, const real_2d_array &a, const ae_int_t ia, const ae_int_t ja, real_2d_array &b, const ae_int_t ib, const ae_int_t jb);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Rank-1 correction: A := A + u*v'
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
M - number of rows
|
|||
|
N - number of columns
|
|||
|
A - target matrix, MxN submatrix is updated
|
|||
|
IA - submatrix offset (row index)
|
|||
|
JA - submatrix offset (column index)
|
|||
|
U - vector #1
|
|||
|
IU - subvector offset
|
|||
|
V - vector #2
|
|||
|
IV - subvector offset
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixrank1(const ae_int_t m, const ae_int_t n, complex_2d_array &a, const ae_int_t ia, const ae_int_t ja, complex_1d_array &u, const ae_int_t iu, complex_1d_array &v, const ae_int_t iv);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Rank-1 correction: A := A + u*v'
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
M - number of rows
|
|||
|
N - number of columns
|
|||
|
A - target matrix, MxN submatrix is updated
|
|||
|
IA - submatrix offset (row index)
|
|||
|
JA - submatrix offset (column index)
|
|||
|
U - vector #1
|
|||
|
IU - subvector offset
|
|||
|
V - vector #2
|
|||
|
IV - subvector offset
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixrank1(const ae_int_t m, const ae_int_t n, real_2d_array &a, const ae_int_t ia, const ae_int_t ja, real_1d_array &u, const ae_int_t iu, real_1d_array &v, const ae_int_t iv);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Matrix-vector product: y := op(A)*x
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
M - number of rows of op(A)
|
|||
|
M>=0
|
|||
|
N - number of columns of op(A)
|
|||
|
N>=0
|
|||
|
A - target matrix
|
|||
|
IA - submatrix offset (row index)
|
|||
|
JA - submatrix offset (column index)
|
|||
|
OpA - operation type:
|
|||
|
* OpA=0 => op(A) = A
|
|||
|
* OpA=1 => op(A) = A^T
|
|||
|
* OpA=2 => op(A) = A^H
|
|||
|
X - input vector
|
|||
|
IX - subvector offset
|
|||
|
IY - subvector offset
|
|||
|
Y - preallocated matrix, must be large enough to store result
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
Y - vector which stores result
|
|||
|
|
|||
|
if M=0, then subroutine does nothing.
|
|||
|
if N=0, Y is filled by zeros.
|
|||
|
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
|
|||
|
28.01.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixmv(const ae_int_t m, const ae_int_t n, const complex_2d_array &a, const ae_int_t ia, const ae_int_t ja, const ae_int_t opa, const complex_1d_array &x, const ae_int_t ix, complex_1d_array &y, const ae_int_t iy);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Matrix-vector product: y := op(A)*x
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
M - number of rows of op(A)
|
|||
|
N - number of columns of op(A)
|
|||
|
A - target matrix
|
|||
|
IA - submatrix offset (row index)
|
|||
|
JA - submatrix offset (column index)
|
|||
|
OpA - operation type:
|
|||
|
* OpA=0 => op(A) = A
|
|||
|
* OpA=1 => op(A) = A^T
|
|||
|
X - input vector
|
|||
|
IX - subvector offset
|
|||
|
IY - subvector offset
|
|||
|
Y - preallocated matrix, must be large enough to store result
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
Y - vector which stores result
|
|||
|
|
|||
|
if M=0, then subroutine does nothing.
|
|||
|
if N=0, Y is filled by zeros.
|
|||
|
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
|
|||
|
28.01.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixmv(const ae_int_t m, const ae_int_t n, const real_2d_array &a, const ae_int_t ia, const ae_int_t ja, const ae_int_t opa, const real_1d_array &x, const ae_int_t ix, real_1d_array &y, const ae_int_t iy);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixrighttrsm(const ae_int_t m, const ae_int_t n, const complex_2d_array &a, const ae_int_t i1, const ae_int_t j1, const bool isupper, const bool isunit, const ae_int_t optype, const complex_2d_array &x, const ae_int_t i2, const ae_int_t j2);
|
|||
|
void smp_cmatrixrighttrsm(const ae_int_t m, const ae_int_t n, const complex_2d_array &a, const ae_int_t i1, const ae_int_t j1, const bool isupper, const bool isunit, const ae_int_t optype, const complex_2d_array &x, const ae_int_t i2, const ae_int_t j2);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixlefttrsm(const ae_int_t m, const ae_int_t n, const complex_2d_array &a, const ae_int_t i1, const ae_int_t j1, const bool isupper, const bool isunit, const ae_int_t optype, const complex_2d_array &x, const ae_int_t i2, const ae_int_t j2);
|
|||
|
void smp_cmatrixlefttrsm(const ae_int_t m, const ae_int_t n, const complex_2d_array &a, const ae_int_t i1, const ae_int_t j1, const bool isupper, const bool isunit, const ae_int_t optype, const complex_2d_array &x, const ae_int_t i2, const ae_int_t j2);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixrighttrsm(const ae_int_t m, const ae_int_t n, const real_2d_array &a, const ae_int_t i1, const ae_int_t j1, const bool isupper, const bool isunit, const ae_int_t optype, const real_2d_array &x, const ae_int_t i2, const ae_int_t j2);
|
|||
|
void smp_rmatrixrighttrsm(const ae_int_t m, const ae_int_t n, const real_2d_array &a, const ae_int_t i1, const ae_int_t j1, const bool isupper, const bool isunit, const ae_int_t optype, const real_2d_array &x, const ae_int_t i2, const ae_int_t j2);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixlefttrsm(const ae_int_t m, const ae_int_t n, const real_2d_array &a, const ae_int_t i1, const ae_int_t j1, const bool isupper, const bool isunit, const ae_int_t optype, const real_2d_array &x, const ae_int_t i2, const ae_int_t j2);
|
|||
|
void smp_rmatrixlefttrsm(const ae_int_t m, const ae_int_t n, const real_2d_array &a, const ae_int_t i1, const ae_int_t j1, const bool isupper, const bool isunit, const ae_int_t optype, const real_2d_array &x, const ae_int_t i2, const ae_int_t j2);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixsyrk(const ae_int_t n, const ae_int_t k, const double alpha, const complex_2d_array &a, const ae_int_t ia, const ae_int_t ja, const ae_int_t optypea, const double beta, const complex_2d_array &c, const ae_int_t ic, const ae_int_t jc, const bool isupper);
|
|||
|
void smp_cmatrixsyrk(const ae_int_t n, const ae_int_t k, const double alpha, const complex_2d_array &a, const ae_int_t ia, const ae_int_t ja, const ae_int_t optypea, const double beta, const complex_2d_array &c, const ae_int_t ic, const ae_int_t jc, const bool isupper);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixsyrk(const ae_int_t n, const ae_int_t k, const double alpha, const real_2d_array &a, const ae_int_t ia, const ae_int_t ja, const ae_int_t optypea, const double beta, const real_2d_array &c, const ae_int_t ic, const ae_int_t jc, const bool isupper);
|
|||
|
void smp_rmatrixsyrk(const ae_int_t n, const ae_int_t k, const double alpha, const real_2d_array &a, const ae_int_t ia, const ae_int_t ja, const ae_int_t optypea, const double beta, const real_2d_array &c, const ae_int_t ic, const ae_int_t jc, const bool isupper);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixgemm(const ae_int_t m, const ae_int_t n, const ae_int_t k, const alglib::complex alpha, const complex_2d_array &a, const ae_int_t ia, const ae_int_t ja, const ae_int_t optypea, const complex_2d_array &b, const ae_int_t ib, const ae_int_t jb, const ae_int_t optypeb, const alglib::complex beta, const complex_2d_array &c, const ae_int_t ic, const ae_int_t jc);
|
|||
|
void smp_cmatrixgemm(const ae_int_t m, const ae_int_t n, const ae_int_t k, const alglib::complex alpha, const complex_2d_array &a, const ae_int_t ia, const ae_int_t ja, const ae_int_t optypea, const complex_2d_array &b, const ae_int_t ib, const ae_int_t jb, const ae_int_t optypeb, const alglib::complex beta, const complex_2d_array &c, const ae_int_t ic, const ae_int_t jc);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixgemm(const ae_int_t m, const ae_int_t n, const ae_int_t k, const double alpha, const real_2d_array &a, const ae_int_t ia, const ae_int_t ja, const ae_int_t optypea, const real_2d_array &b, const ae_int_t ib, const ae_int_t jb, const ae_int_t optypeb, const double beta, const real_2d_array &c, const ae_int_t ic, const ae_int_t jc);
|
|||
|
void smp_rmatrixgemm(const ae_int_t m, const ae_int_t n, const ae_int_t k, const double alpha, const real_2d_array &a, const ae_int_t ia, const ae_int_t ja, const ae_int_t optypea, const real_2d_array &b, const ae_int_t ib, const ae_int_t jb, const ae_int_t optypeb, const double beta, const real_2d_array &c, const ae_int_t ic, const ae_int_t jc);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
QR decomposition of a rectangular matrix of size MxN
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix A whose indexes range within [0..M-1, 0..N-1].
|
|||
|
M - number of rows in matrix A.
|
|||
|
N - number of columns in matrix A.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
A - matrices Q and R in compact form (see below).
|
|||
|
Tau - array of scalar factors which are used to form
|
|||
|
matrix Q. Array whose index ranges within [0.. Min(M-1,N-1)].
|
|||
|
|
|||
|
Matrix A is represented as A = QR, where Q is an orthogonal matrix of size
|
|||
|
MxM, R - upper triangular (or upper trapezoid) matrix of size M x N.
|
|||
|
|
|||
|
The elements of matrix R are located on and above the main diagonal of
|
|||
|
matrix A. The elements which are located in Tau array and below the main
|
|||
|
diagonal of matrix A are used to form matrix Q as follows:
|
|||
|
|
|||
|
Matrix Q is represented as a product of elementary reflections
|
|||
|
|
|||
|
Q = H(0)*H(2)*...*H(k-1),
|
|||
|
|
|||
|
where k = min(m,n), and each H(i) is in the form
|
|||
|
|
|||
|
H(i) = 1 - tau * v * (v^T)
|
|||
|
|
|||
|
where tau is a scalar stored in Tau[I]; v - real vector,
|
|||
|
so that v(0:i-1) = 0, v(i) = 1, v(i+1:m-1) stored in A(i+1:m-1,i).
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
17.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixqr(real_2d_array &a, const ae_int_t m, const ae_int_t n, real_1d_array &tau);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
LQ decomposition of a rectangular matrix of size MxN
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix A whose indexes range within [0..M-1, 0..N-1].
|
|||
|
M - number of rows in matrix A.
|
|||
|
N - number of columns in matrix A.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
A - matrices L and Q in compact form (see below)
|
|||
|
Tau - array of scalar factors which are used to form
|
|||
|
matrix Q. Array whose index ranges within [0..Min(M,N)-1].
|
|||
|
|
|||
|
Matrix A is represented as A = LQ, where Q is an orthogonal matrix of size
|
|||
|
MxM, L - lower triangular (or lower trapezoid) matrix of size M x N.
|
|||
|
|
|||
|
The elements of matrix L are located on and below the main diagonal of
|
|||
|
matrix A. The elements which are located in Tau array and above the main
|
|||
|
diagonal of matrix A are used to form matrix Q as follows:
|
|||
|
|
|||
|
Matrix Q is represented as a product of elementary reflections
|
|||
|
|
|||
|
Q = H(k-1)*H(k-2)*...*H(1)*H(0),
|
|||
|
|
|||
|
where k = min(m,n), and each H(i) is of the form
|
|||
|
|
|||
|
H(i) = 1 - tau * v * (v^T)
|
|||
|
|
|||
|
where tau is a scalar stored in Tau[I]; v - real vector, so that v(0:i-1)=0,
|
|||
|
v(i) = 1, v(i+1:n-1) stored in A(i,i+1:n-1).
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
17.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixlq(real_2d_array &a, const ae_int_t m, const ae_int_t n, real_1d_array &tau);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
QR decomposition of a rectangular complex matrix of size MxN
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix A whose indexes range within [0..M-1, 0..N-1]
|
|||
|
M - number of rows in matrix A.
|
|||
|
N - number of columns in matrix A.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
A - matrices Q and R in compact form
|
|||
|
Tau - array of scalar factors which are used to form matrix Q. Array
|
|||
|
whose indexes range within [0.. Min(M,N)-1]
|
|||
|
|
|||
|
Matrix A is represented as A = QR, where Q is an orthogonal matrix of size
|
|||
|
MxM, R - upper triangular (or upper trapezoid) matrix of size MxN.
|
|||
|
|
|||
|
-- LAPACK routine (version 3.0) --
|
|||
|
Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
|
|||
|
Courant Institute, Argonne National Lab, and Rice University
|
|||
|
September 30, 1994
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixqr(complex_2d_array &a, const ae_int_t m, const ae_int_t n, complex_1d_array &tau);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
LQ decomposition of a rectangular complex matrix of size MxN
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix A whose indexes range within [0..M-1, 0..N-1]
|
|||
|
M - number of rows in matrix A.
|
|||
|
N - number of columns in matrix A.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
A - matrices Q and L in compact form
|
|||
|
Tau - array of scalar factors which are used to form matrix Q. Array
|
|||
|
whose indexes range within [0.. Min(M,N)-1]
|
|||
|
|
|||
|
Matrix A is represented as A = LQ, where Q is an orthogonal matrix of size
|
|||
|
MxM, L - lower triangular (or lower trapezoid) matrix of size MxN.
|
|||
|
|
|||
|
-- LAPACK routine (version 3.0) --
|
|||
|
Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
|
|||
|
Courant Institute, Argonne National Lab, and Rice University
|
|||
|
September 30, 1994
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixlq(complex_2d_array &a, const ae_int_t m, const ae_int_t n, complex_1d_array &tau);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Partial unpacking of matrix Q from the QR decomposition of a matrix A
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrices Q and R in compact form.
|
|||
|
Output of RMatrixQR subroutine.
|
|||
|
M - number of rows in given matrix A. M>=0.
|
|||
|
N - number of columns in given matrix A. N>=0.
|
|||
|
Tau - scalar factors which are used to form Q.
|
|||
|
Output of the RMatrixQR subroutine.
|
|||
|
QColumns - required number of columns of matrix Q. M>=QColumns>=0.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Q - first QColumns columns of matrix Q.
|
|||
|
Array whose indexes range within [0..M-1, 0..QColumns-1].
|
|||
|
If QColumns=0, the array remains unchanged.
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
17.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixqrunpackq(const real_2d_array &a, const ae_int_t m, const ae_int_t n, const real_1d_array &tau, const ae_int_t qcolumns, real_2d_array &q);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Unpacking of matrix R from the QR decomposition of a matrix A
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrices Q and R in compact form.
|
|||
|
Output of RMatrixQR subroutine.
|
|||
|
M - number of rows in given matrix A. M>=0.
|
|||
|
N - number of columns in given matrix A. N>=0.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
R - matrix R, array[0..M-1, 0..N-1].
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
17.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixqrunpackr(const real_2d_array &a, const ae_int_t m, const ae_int_t n, real_2d_array &r);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Partial unpacking of matrix Q from the LQ decomposition of a matrix A
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrices L and Q in compact form.
|
|||
|
Output of RMatrixLQ subroutine.
|
|||
|
M - number of rows in given matrix A. M>=0.
|
|||
|
N - number of columns in given matrix A. N>=0.
|
|||
|
Tau - scalar factors which are used to form Q.
|
|||
|
Output of the RMatrixLQ subroutine.
|
|||
|
QRows - required number of rows in matrix Q. N>=QRows>=0.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Q - first QRows rows of matrix Q. Array whose indexes range
|
|||
|
within [0..QRows-1, 0..N-1]. If QRows=0, the array remains
|
|||
|
unchanged.
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
17.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixlqunpackq(const real_2d_array &a, const ae_int_t m, const ae_int_t n, const real_1d_array &tau, const ae_int_t qrows, real_2d_array &q);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Unpacking of matrix L from the LQ decomposition of a matrix A
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrices Q and L in compact form.
|
|||
|
Output of RMatrixLQ subroutine.
|
|||
|
M - number of rows in given matrix A. M>=0.
|
|||
|
N - number of columns in given matrix A. N>=0.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
L - matrix L, array[0..M-1, 0..N-1].
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
17.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixlqunpackl(const real_2d_array &a, const ae_int_t m, const ae_int_t n, real_2d_array &l);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Partial unpacking of matrix Q from QR decomposition of a complex matrix A.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrices Q and R in compact form.
|
|||
|
Output of CMatrixQR subroutine .
|
|||
|
M - number of rows in matrix A. M>=0.
|
|||
|
N - number of columns in matrix A. N>=0.
|
|||
|
Tau - scalar factors which are used to form Q.
|
|||
|
Output of CMatrixQR subroutine .
|
|||
|
QColumns - required number of columns in matrix Q. M>=QColumns>=0.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Q - first QColumns columns of matrix Q.
|
|||
|
Array whose index ranges within [0..M-1, 0..QColumns-1].
|
|||
|
If QColumns=0, array isn't changed.
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
17.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixqrunpackq(const complex_2d_array &a, const ae_int_t m, const ae_int_t n, const complex_1d_array &tau, const ae_int_t qcolumns, complex_2d_array &q);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Unpacking of matrix R from the QR decomposition of a matrix A
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrices Q and R in compact form.
|
|||
|
Output of CMatrixQR subroutine.
|
|||
|
M - number of rows in given matrix A. M>=0.
|
|||
|
N - number of columns in given matrix A. N>=0.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
R - matrix R, array[0..M-1, 0..N-1].
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
17.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixqrunpackr(const complex_2d_array &a, const ae_int_t m, const ae_int_t n, complex_2d_array &r);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Partial unpacking of matrix Q from LQ decomposition of a complex matrix A.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrices Q and R in compact form.
|
|||
|
Output of CMatrixLQ subroutine .
|
|||
|
M - number of rows in matrix A. M>=0.
|
|||
|
N - number of columns in matrix A. N>=0.
|
|||
|
Tau - scalar factors which are used to form Q.
|
|||
|
Output of CMatrixLQ subroutine .
|
|||
|
QRows - required number of rows in matrix Q. N>=QColumns>=0.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Q - first QRows rows of matrix Q.
|
|||
|
Array whose index ranges within [0..QRows-1, 0..N-1].
|
|||
|
If QRows=0, array isn't changed.
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
17.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixlqunpackq(const complex_2d_array &a, const ae_int_t m, const ae_int_t n, const complex_1d_array &tau, const ae_int_t qrows, complex_2d_array &q);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Unpacking of matrix L from the LQ decomposition of a matrix A
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrices Q and L in compact form.
|
|||
|
Output of CMatrixLQ subroutine.
|
|||
|
M - number of rows in given matrix A. M>=0.
|
|||
|
N - number of columns in given matrix A. N>=0.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
L - matrix L, array[0..M-1, 0..N-1].
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
17.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixlqunpackl(const complex_2d_array &a, const ae_int_t m, const ae_int_t n, complex_2d_array &l);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Reduction of a rectangular matrix to bidiagonal form
|
|||
|
|
|||
|
The algorithm reduces the rectangular matrix A to bidiagonal form by
|
|||
|
orthogonal transformations P and Q: A = Q*B*P.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - source matrix. array[0..M-1, 0..N-1]
|
|||
|
M - number of rows in matrix A.
|
|||
|
N - number of columns in matrix A.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
A - matrices Q, B, P in compact form (see below).
|
|||
|
TauQ - scalar factors which are used to form matrix Q.
|
|||
|
TauP - scalar factors which are used to form matrix P.
|
|||
|
|
|||
|
The main diagonal and one of the secondary diagonals of matrix A are
|
|||
|
replaced with bidiagonal matrix B. Other elements contain elementary
|
|||
|
reflections which form MxM matrix Q and NxN matrix P, respectively.
|
|||
|
|
|||
|
If M>=N, B is the upper bidiagonal MxN matrix and is stored in the
|
|||
|
corresponding elements of matrix A. Matrix Q is represented as a
|
|||
|
product of elementary reflections Q = H(0)*H(1)*...*H(n-1), where
|
|||
|
H(i) = 1-tau*v*v'. Here tau is a scalar which is stored in TauQ[i], and
|
|||
|
vector v has the following structure: v(0:i-1)=0, v(i)=1, v(i+1:m-1) is
|
|||
|
stored in elements A(i+1:m-1,i). Matrix P is as follows: P =
|
|||
|
G(0)*G(1)*...*G(n-2), where G(i) = 1 - tau*u*u'. Tau is stored in TauP[i],
|
|||
|
u(0:i)=0, u(i+1)=1, u(i+2:n-1) is stored in elements A(i,i+2:n-1).
|
|||
|
|
|||
|
If M<N, B is the lower bidiagonal MxN matrix and is stored in the
|
|||
|
corresponding elements of matrix A. Q = H(0)*H(1)*...*H(m-2), where
|
|||
|
H(i) = 1 - tau*v*v', tau is stored in TauQ, v(0:i)=0, v(i+1)=1, v(i+2:m-1)
|
|||
|
is stored in elements A(i+2:m-1,i). P = G(0)*G(1)*...*G(m-1),
|
|||
|
G(i) = 1-tau*u*u', tau is stored in TauP, u(0:i-1)=0, u(i)=1, u(i+1:n-1)
|
|||
|
is stored in A(i,i+1:n-1).
|
|||
|
|
|||
|
EXAMPLE:
|
|||
|
|
|||
|
m=6, n=5 (m > n): m=5, n=6 (m < n):
|
|||
|
|
|||
|
( d e u1 u1 u1 ) ( d u1 u1 u1 u1 u1 )
|
|||
|
( v1 d e u2 u2 ) ( e d u2 u2 u2 u2 )
|
|||
|
( v1 v2 d e u3 ) ( v1 e d u3 u3 u3 )
|
|||
|
( v1 v2 v3 d e ) ( v1 v2 e d u4 u4 )
|
|||
|
( v1 v2 v3 v4 d ) ( v1 v2 v3 e d u5 )
|
|||
|
( v1 v2 v3 v4 v5 )
|
|||
|
|
|||
|
Here vi and ui are vectors which form H(i) and G(i), and d and e -
|
|||
|
are the diagonal and off-diagonal elements of matrix B.
|
|||
|
|
|||
|
-- LAPACK routine (version 3.0) --
|
|||
|
Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
|
|||
|
Courant Institute, Argonne National Lab, and Rice University
|
|||
|
September 30, 1994.
|
|||
|
Sergey Bochkanov, ALGLIB project, translation from FORTRAN to
|
|||
|
pseudocode, 2007-2010.
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixbd(real_2d_array &a, const ae_int_t m, const ae_int_t n, real_1d_array &tauq, real_1d_array &taup);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Unpacking matrix Q which reduces a matrix to bidiagonal form.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
QP - matrices Q and P in compact form.
|
|||
|
Output of ToBidiagonal subroutine.
|
|||
|
M - number of rows in matrix A.
|
|||
|
N - number of columns in matrix A.
|
|||
|
TAUQ - scalar factors which are used to form Q.
|
|||
|
Output of ToBidiagonal subroutine.
|
|||
|
QColumns - required number of columns in matrix Q.
|
|||
|
M>=QColumns>=0.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Q - first QColumns columns of matrix Q.
|
|||
|
Array[0..M-1, 0..QColumns-1]
|
|||
|
If QColumns=0, the array is not modified.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
2005-2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixbdunpackq(const real_2d_array &qp, const ae_int_t m, const ae_int_t n, const real_1d_array &tauq, const ae_int_t qcolumns, real_2d_array &q);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Multiplication by matrix Q which reduces matrix A to bidiagonal form.
|
|||
|
|
|||
|
The algorithm allows pre- or post-multiply by Q or Q'.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
QP - matrices Q and P in compact form.
|
|||
|
Output of ToBidiagonal subroutine.
|
|||
|
M - number of rows in matrix A.
|
|||
|
N - number of columns in matrix A.
|
|||
|
TAUQ - scalar factors which are used to form Q.
|
|||
|
Output of ToBidiagonal subroutine.
|
|||
|
Z - multiplied matrix.
|
|||
|
array[0..ZRows-1,0..ZColumns-1]
|
|||
|
ZRows - number of rows in matrix Z. If FromTheRight=False,
|
|||
|
ZRows=M, otherwise ZRows can be arbitrary.
|
|||
|
ZColumns - number of columns in matrix Z. If FromTheRight=True,
|
|||
|
ZColumns=M, otherwise ZColumns can be arbitrary.
|
|||
|
FromTheRight - pre- or post-multiply.
|
|||
|
DoTranspose - multiply by Q or Q'.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Z - product of Z and Q.
|
|||
|
Array[0..ZRows-1,0..ZColumns-1]
|
|||
|
If ZRows=0 or ZColumns=0, the array is not modified.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
2005-2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixbdmultiplybyq(const real_2d_array &qp, const ae_int_t m, const ae_int_t n, const real_1d_array &tauq, real_2d_array &z, const ae_int_t zrows, const ae_int_t zcolumns, const bool fromtheright, const bool dotranspose);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Unpacking matrix P which reduces matrix A to bidiagonal form.
|
|||
|
The subroutine returns transposed matrix P.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
QP - matrices Q and P in compact form.
|
|||
|
Output of ToBidiagonal subroutine.
|
|||
|
M - number of rows in matrix A.
|
|||
|
N - number of columns in matrix A.
|
|||
|
TAUP - scalar factors which are used to form P.
|
|||
|
Output of ToBidiagonal subroutine.
|
|||
|
PTRows - required number of rows of matrix P^T. N >= PTRows >= 0.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
PT - first PTRows columns of matrix P^T
|
|||
|
Array[0..PTRows-1, 0..N-1]
|
|||
|
If PTRows=0, the array is not modified.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
2005-2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixbdunpackpt(const real_2d_array &qp, const ae_int_t m, const ae_int_t n, const real_1d_array &taup, const ae_int_t ptrows, real_2d_array &pt);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Multiplication by matrix P which reduces matrix A to bidiagonal form.
|
|||
|
|
|||
|
The algorithm allows pre- or post-multiply by P or P'.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
QP - matrices Q and P in compact form.
|
|||
|
Output of RMatrixBD subroutine.
|
|||
|
M - number of rows in matrix A.
|
|||
|
N - number of columns in matrix A.
|
|||
|
TAUP - scalar factors which are used to form P.
|
|||
|
Output of RMatrixBD subroutine.
|
|||
|
Z - multiplied matrix.
|
|||
|
Array whose indexes range within [0..ZRows-1,0..ZColumns-1].
|
|||
|
ZRows - number of rows in matrix Z. If FromTheRight=False,
|
|||
|
ZRows=N, otherwise ZRows can be arbitrary.
|
|||
|
ZColumns - number of columns in matrix Z. If FromTheRight=True,
|
|||
|
ZColumns=N, otherwise ZColumns can be arbitrary.
|
|||
|
FromTheRight - pre- or post-multiply.
|
|||
|
DoTranspose - multiply by P or P'.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Z - product of Z and P.
|
|||
|
Array whose indexes range within [0..ZRows-1,0..ZColumns-1].
|
|||
|
If ZRows=0 or ZColumns=0, the array is not modified.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
2005-2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixbdmultiplybyp(const real_2d_array &qp, const ae_int_t m, const ae_int_t n, const real_1d_array &taup, real_2d_array &z, const ae_int_t zrows, const ae_int_t zcolumns, const bool fromtheright, const bool dotranspose);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Unpacking of the main and secondary diagonals of bidiagonal decomposition
|
|||
|
of matrix A.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
B - output of RMatrixBD subroutine.
|
|||
|
M - number of rows in matrix B.
|
|||
|
N - number of columns in matrix B.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
IsUpper - True, if the matrix is upper bidiagonal.
|
|||
|
otherwise IsUpper is False.
|
|||
|
D - the main diagonal.
|
|||
|
Array whose index ranges within [0..Min(M,N)-1].
|
|||
|
E - the secondary diagonal (upper or lower, depending on
|
|||
|
the value of IsUpper).
|
|||
|
Array index ranges within [0..Min(M,N)-1], the last
|
|||
|
element is not used.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
2005-2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixbdunpackdiagonals(const real_2d_array &b, const ae_int_t m, const ae_int_t n, bool &isupper, real_1d_array &d, real_1d_array &e);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Reduction of a square matrix to upper Hessenberg form: Q'*A*Q = H,
|
|||
|
where Q is an orthogonal matrix, H - Hessenberg matrix.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix A with elements [0..N-1, 0..N-1]
|
|||
|
N - size of matrix A.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
A - matrices Q and P in compact form (see below).
|
|||
|
Tau - array of scalar factors which are used to form matrix Q.
|
|||
|
Array whose index ranges within [0..N-2]
|
|||
|
|
|||
|
Matrix H is located on the main diagonal, on the lower secondary diagonal
|
|||
|
and above the main diagonal of matrix A. The elements which are used to
|
|||
|
form matrix Q are situated in array Tau and below the lower secondary
|
|||
|
diagonal of matrix A as follows:
|
|||
|
|
|||
|
Matrix Q is represented as a product of elementary reflections
|
|||
|
|
|||
|
Q = H(0)*H(2)*...*H(n-2),
|
|||
|
|
|||
|
where each H(i) is given by
|
|||
|
|
|||
|
H(i) = 1 - tau * v * (v^T)
|
|||
|
|
|||
|
where tau is a scalar stored in Tau[I]; v - is a real vector,
|
|||
|
so that v(0:i) = 0, v(i+1) = 1, v(i+2:n-1) stored in A(i+2:n-1,i).
|
|||
|
|
|||
|
-- LAPACK routine (version 3.0) --
|
|||
|
Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
|
|||
|
Courant Institute, Argonne National Lab, and Rice University
|
|||
|
October 31, 1992
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixhessenberg(real_2d_array &a, const ae_int_t n, real_1d_array &tau);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Unpacking matrix Q which reduces matrix A to upper Hessenberg form
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - output of RMatrixHessenberg subroutine.
|
|||
|
N - size of matrix A.
|
|||
|
Tau - scalar factors which are used to form Q.
|
|||
|
Output of RMatrixHessenberg subroutine.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Q - matrix Q.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
2005-2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixhessenbergunpackq(const real_2d_array &a, const ae_int_t n, const real_1d_array &tau, real_2d_array &q);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Unpacking matrix H (the result of matrix A reduction to upper Hessenberg form)
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - output of RMatrixHessenberg subroutine.
|
|||
|
N - size of matrix A.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
H - matrix H. Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
2005-2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixhessenbergunpackh(const real_2d_array &a, const ae_int_t n, real_2d_array &h);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Reduction of a symmetric matrix which is given by its higher or lower
|
|||
|
triangular part to a tridiagonal matrix using orthogonal similarity
|
|||
|
transformation: Q'*A*Q=T.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix to be transformed
|
|||
|
array with elements [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
IsUpper - storage format. If IsUpper = True, then matrix A is given
|
|||
|
by its upper triangle, and the lower triangle is not used
|
|||
|
and not modified by the algorithm, and vice versa
|
|||
|
if IsUpper = False.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
A - matrices T and Q in compact form (see lower)
|
|||
|
Tau - array of factors which are forming matrices H(i)
|
|||
|
array with elements [0..N-2].
|
|||
|
D - main diagonal of symmetric matrix T.
|
|||
|
array with elements [0..N-1].
|
|||
|
E - secondary diagonal of symmetric matrix T.
|
|||
|
array with elements [0..N-2].
|
|||
|
|
|||
|
|
|||
|
If IsUpper=True, the matrix Q is represented as a product of elementary
|
|||
|
reflectors
|
|||
|
|
|||
|
Q = H(n-2) . . . H(2) H(0).
|
|||
|
|
|||
|
Each H(i) has the form
|
|||
|
|
|||
|
H(i) = I - tau * v * v'
|
|||
|
|
|||
|
where tau is a real scalar, and v is a real vector with
|
|||
|
v(i+1:n-1) = 0, v(i) = 1, v(0:i-1) is stored on exit in
|
|||
|
A(0:i-1,i+1), and tau in TAU(i).
|
|||
|
|
|||
|
If IsUpper=False, the matrix Q is represented as a product of elementary
|
|||
|
reflectors
|
|||
|
|
|||
|
Q = H(0) H(2) . . . H(n-2).
|
|||
|
|
|||
|
Each H(i) has the form
|
|||
|
|
|||
|
H(i) = I - tau * v * v'
|
|||
|
|
|||
|
where tau is a real scalar, and v is a real vector with
|
|||
|
v(0:i) = 0, v(i+1) = 1, v(i+2:n-1) is stored on exit in A(i+2:n-1,i),
|
|||
|
and tau in TAU(i).
|
|||
|
|
|||
|
The contents of A on exit are illustrated by the following examples
|
|||
|
with n = 5:
|
|||
|
|
|||
|
if UPLO = 'U': if UPLO = 'L':
|
|||
|
|
|||
|
( d e v1 v2 v3 ) ( d )
|
|||
|
( d e v2 v3 ) ( e d )
|
|||
|
( d e v3 ) ( v0 e d )
|
|||
|
( d e ) ( v0 v1 e d )
|
|||
|
( d ) ( v0 v1 v2 e d )
|
|||
|
|
|||
|
where d and e denote diagonal and off-diagonal elements of T, and vi
|
|||
|
denotes an element of the vector defining H(i).
|
|||
|
|
|||
|
-- LAPACK routine (version 3.0) --
|
|||
|
Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
|
|||
|
Courant Institute, Argonne National Lab, and Rice University
|
|||
|
October 31, 1992
|
|||
|
*************************************************************************/
|
|||
|
void smatrixtd(real_2d_array &a, const ae_int_t n, const bool isupper, real_1d_array &tau, real_1d_array &d, real_1d_array &e);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Unpacking matrix Q which reduces symmetric matrix to a tridiagonal
|
|||
|
form.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - the result of a SMatrixTD subroutine
|
|||
|
N - size of matrix A.
|
|||
|
IsUpper - storage format (a parameter of SMatrixTD subroutine)
|
|||
|
Tau - the result of a SMatrixTD subroutine
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Q - transformation matrix.
|
|||
|
array with elements [0..N-1, 0..N-1].
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005-2010 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void smatrixtdunpackq(const real_2d_array &a, const ae_int_t n, const bool isupper, const real_1d_array &tau, real_2d_array &q);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Reduction of a Hermitian matrix which is given by its higher or lower
|
|||
|
triangular part to a real tridiagonal matrix using unitary similarity
|
|||
|
transformation: Q'*A*Q = T.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix to be transformed
|
|||
|
array with elements [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
IsUpper - storage format. If IsUpper = True, then matrix A is given
|
|||
|
by its upper triangle, and the lower triangle is not used
|
|||
|
and not modified by the algorithm, and vice versa
|
|||
|
if IsUpper = False.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
A - matrices T and Q in compact form (see lower)
|
|||
|
Tau - array of factors which are forming matrices H(i)
|
|||
|
array with elements [0..N-2].
|
|||
|
D - main diagonal of real symmetric matrix T.
|
|||
|
array with elements [0..N-1].
|
|||
|
E - secondary diagonal of real symmetric matrix T.
|
|||
|
array with elements [0..N-2].
|
|||
|
|
|||
|
|
|||
|
If IsUpper=True, the matrix Q is represented as a product of elementary
|
|||
|
reflectors
|
|||
|
|
|||
|
Q = H(n-2) . . . H(2) H(0).
|
|||
|
|
|||
|
Each H(i) has the form
|
|||
|
|
|||
|
H(i) = I - tau * v * v'
|
|||
|
|
|||
|
where tau is a complex scalar, and v is a complex vector with
|
|||
|
v(i+1:n-1) = 0, v(i) = 1, v(0:i-1) is stored on exit in
|
|||
|
A(0:i-1,i+1), and tau in TAU(i).
|
|||
|
|
|||
|
If IsUpper=False, the matrix Q is represented as a product of elementary
|
|||
|
reflectors
|
|||
|
|
|||
|
Q = H(0) H(2) . . . H(n-2).
|
|||
|
|
|||
|
Each H(i) has the form
|
|||
|
|
|||
|
H(i) = I - tau * v * v'
|
|||
|
|
|||
|
where tau is a complex scalar, and v is a complex vector with
|
|||
|
v(0:i) = 0, v(i+1) = 1, v(i+2:n-1) is stored on exit in A(i+2:n-1,i),
|
|||
|
and tau in TAU(i).
|
|||
|
|
|||
|
The contents of A on exit are illustrated by the following examples
|
|||
|
with n = 5:
|
|||
|
|
|||
|
if UPLO = 'U': if UPLO = 'L':
|
|||
|
|
|||
|
( d e v1 v2 v3 ) ( d )
|
|||
|
( d e v2 v3 ) ( e d )
|
|||
|
( d e v3 ) ( v0 e d )
|
|||
|
( d e ) ( v0 v1 e d )
|
|||
|
( d ) ( v0 v1 v2 e d )
|
|||
|
|
|||
|
where d and e denote diagonal and off-diagonal elements of T, and vi
|
|||
|
denotes an element of the vector defining H(i).
|
|||
|
|
|||
|
-- LAPACK routine (version 3.0) --
|
|||
|
Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
|
|||
|
Courant Institute, Argonne National Lab, and Rice University
|
|||
|
October 31, 1992
|
|||
|
*************************************************************************/
|
|||
|
void hmatrixtd(complex_2d_array &a, const ae_int_t n, const bool isupper, complex_1d_array &tau, real_1d_array &d, real_1d_array &e);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Unpacking matrix Q which reduces a Hermitian matrix to a real tridiagonal
|
|||
|
form.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - the result of a HMatrixTD subroutine
|
|||
|
N - size of matrix A.
|
|||
|
IsUpper - storage format (a parameter of HMatrixTD subroutine)
|
|||
|
Tau - the result of a HMatrixTD subroutine
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Q - transformation matrix.
|
|||
|
array with elements [0..N-1, 0..N-1].
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005-2010 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void hmatrixtdunpackq(const complex_2d_array &a, const ae_int_t n, const bool isupper, const complex_1d_array &tau, complex_2d_array &q);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Singular value decomposition of a bidiagonal matrix (extended algorithm)
|
|||
|
|
|||
|
The algorithm performs the singular value decomposition of a bidiagonal
|
|||
|
matrix B (upper or lower) representing it as B = Q*S*P^T, where Q and P -
|
|||
|
orthogonal matrices, S - diagonal matrix with non-negative elements on the
|
|||
|
main diagonal, in descending order.
|
|||
|
|
|||
|
The algorithm finds singular values. In addition, the algorithm can
|
|||
|
calculate matrices Q and P (more precisely, not the matrices, but their
|
|||
|
product with given matrices U and VT - U*Q and (P^T)*VT)). Of course,
|
|||
|
matrices U and VT can be of any type, including identity. Furthermore, the
|
|||
|
algorithm can calculate Q'*C (this product is calculated more effectively
|
|||
|
than U*Q, because this calculation operates with rows instead of matrix
|
|||
|
columns).
|
|||
|
|
|||
|
The feature of the algorithm is its ability to find all singular values
|
|||
|
including those which are arbitrarily close to 0 with relative accuracy
|
|||
|
close to machine precision. If the parameter IsFractionalAccuracyRequired
|
|||
|
is set to True, all singular values will have high relative accuracy close
|
|||
|
to machine precision. If the parameter is set to False, only the biggest
|
|||
|
singular value will have relative accuracy close to machine precision.
|
|||
|
The absolute error of other singular values is equal to the absolute error
|
|||
|
of the biggest singular value.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
D - main diagonal of matrix B.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
E - superdiagonal (or subdiagonal) of matrix B.
|
|||
|
Array whose index ranges within [0..N-2].
|
|||
|
N - size of matrix B.
|
|||
|
IsUpper - True, if the matrix is upper bidiagonal.
|
|||
|
IsFractionalAccuracyRequired -
|
|||
|
THIS PARAMETER IS IGNORED SINCE ALGLIB 3.5.0
|
|||
|
SINGULAR VALUES ARE ALWAYS SEARCHED WITH HIGH ACCURACY.
|
|||
|
U - matrix to be multiplied by Q.
|
|||
|
Array whose indexes range within [0..NRU-1, 0..N-1].
|
|||
|
The matrix can be bigger, in that case only the submatrix
|
|||
|
[0..NRU-1, 0..N-1] will be multiplied by Q.
|
|||
|
NRU - number of rows in matrix U.
|
|||
|
C - matrix to be multiplied by Q'.
|
|||
|
Array whose indexes range within [0..N-1, 0..NCC-1].
|
|||
|
The matrix can be bigger, in that case only the submatrix
|
|||
|
[0..N-1, 0..NCC-1] will be multiplied by Q'.
|
|||
|
NCC - number of columns in matrix C.
|
|||
|
VT - matrix to be multiplied by P^T.
|
|||
|
Array whose indexes range within [0..N-1, 0..NCVT-1].
|
|||
|
The matrix can be bigger, in that case only the submatrix
|
|||
|
[0..N-1, 0..NCVT-1] will be multiplied by P^T.
|
|||
|
NCVT - number of columns in matrix VT.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
D - singular values of matrix B in descending order.
|
|||
|
U - if NRU>0, contains matrix U*Q.
|
|||
|
VT - if NCVT>0, contains matrix (P^T)*VT.
|
|||
|
C - if NCC>0, contains matrix Q'*C.
|
|||
|
|
|||
|
Result:
|
|||
|
True, if the algorithm has converged.
|
|||
|
False, if the algorithm hasn't converged (rare case).
|
|||
|
|
|||
|
Additional information:
|
|||
|
The type of convergence is controlled by the internal parameter TOL.
|
|||
|
If the parameter is greater than 0, the singular values will have
|
|||
|
relative accuracy TOL. If TOL<0, the singular values will have
|
|||
|
absolute accuracy ABS(TOL)*norm(B).
|
|||
|
By default, |TOL| falls within the range of 10*Epsilon and 100*Epsilon,
|
|||
|
where Epsilon is the machine precision. It is not recommended to use
|
|||
|
TOL less than 10*Epsilon since this will considerably slow down the
|
|||
|
algorithm and may not lead to error decreasing.
|
|||
|
History:
|
|||
|
* 31 March, 2007.
|
|||
|
changed MAXITR from 6 to 12.
|
|||
|
|
|||
|
-- LAPACK routine (version 3.0) --
|
|||
|
Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
|
|||
|
Courant Institute, Argonne National Lab, and Rice University
|
|||
|
October 31, 1999.
|
|||
|
*************************************************************************/
|
|||
|
bool rmatrixbdsvd(real_1d_array &d, const real_1d_array &e, const ae_int_t n, const bool isupper, const bool isfractionalaccuracyrequired, real_2d_array &u, const ae_int_t nru, real_2d_array &c, const ae_int_t ncc, real_2d_array &vt, const ae_int_t ncvt);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Singular value decomposition of a rectangular matrix.
|
|||
|
|
|||
|
The algorithm calculates the singular value decomposition of a matrix of
|
|||
|
size MxN: A = U * S * V^T
|
|||
|
|
|||
|
The algorithm finds the singular values and, optionally, matrices U and V^T.
|
|||
|
The algorithm can find both first min(M,N) columns of matrix U and rows of
|
|||
|
matrix V^T (singular vectors), and matrices U and V^T wholly (of sizes MxM
|
|||
|
and NxN respectively).
|
|||
|
|
|||
|
Take into account that the subroutine does not return matrix V but V^T.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix to be decomposed.
|
|||
|
Array whose indexes range within [0..M-1, 0..N-1].
|
|||
|
M - number of rows in matrix A.
|
|||
|
N - number of columns in matrix A.
|
|||
|
UNeeded - 0, 1 or 2. See the description of the parameter U.
|
|||
|
VTNeeded - 0, 1 or 2. See the description of the parameter VT.
|
|||
|
AdditionalMemory -
|
|||
|
If the parameter:
|
|||
|
* equals 0, the algorithm doesn<EFBFBD>t use additional
|
|||
|
memory (lower requirements, lower performance).
|
|||
|
* equals 1, the algorithm uses additional
|
|||
|
memory of size min(M,N)*min(M,N) of real numbers.
|
|||
|
It often speeds up the algorithm.
|
|||
|
* equals 2, the algorithm uses additional
|
|||
|
memory of size M*min(M,N) of real numbers.
|
|||
|
It allows to get a maximum performance.
|
|||
|
The recommended value of the parameter is 2.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
W - contains singular values in descending order.
|
|||
|
U - if UNeeded=0, U isn't changed, the left singular vectors
|
|||
|
are not calculated.
|
|||
|
if Uneeded=1, U contains left singular vectors (first
|
|||
|
min(M,N) columns of matrix U). Array whose indexes range
|
|||
|
within [0..M-1, 0..Min(M,N)-1].
|
|||
|
if UNeeded=2, U contains matrix U wholly. Array whose
|
|||
|
indexes range within [0..M-1, 0..M-1].
|
|||
|
VT - if VTNeeded=0, VT isn<EFBFBD>t changed, the right singular vectors
|
|||
|
are not calculated.
|
|||
|
if VTNeeded=1, VT contains right singular vectors (first
|
|||
|
min(M,N) rows of matrix V^T). Array whose indexes range
|
|||
|
within [0..min(M,N)-1, 0..N-1].
|
|||
|
if VTNeeded=2, VT contains matrix V^T wholly. Array whose
|
|||
|
indexes range within [0..N-1, 0..N-1].
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool rmatrixsvd(const real_2d_array &a, const ae_int_t m, const ae_int_t n, const ae_int_t uneeded, const ae_int_t vtneeded, const ae_int_t additionalmemory, real_1d_array &w, real_2d_array &u, real_2d_array &vt);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Finding the eigenvalues and eigenvectors of a symmetric matrix
|
|||
|
|
|||
|
The algorithm finds eigen pairs of a symmetric matrix by reducing it to
|
|||
|
tridiagonal form and using the QL/QR algorithm.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - symmetric matrix which is given by its upper or lower
|
|||
|
triangular part.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
ZNeeded - flag controlling whether the eigenvectors are needed or not.
|
|||
|
If ZNeeded is equal to:
|
|||
|
* 0, the eigenvectors are not returned;
|
|||
|
* 1, the eigenvectors are returned.
|
|||
|
IsUpper - storage format.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
D - eigenvalues in ascending order.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
Z - if ZNeeded is equal to:
|
|||
|
* 0, Z hasn<EFBFBD>t changed;
|
|||
|
* 1, Z contains the eigenvectors.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
The eigenvectors are stored in the matrix columns.
|
|||
|
|
|||
|
Result:
|
|||
|
True, if the algorithm has converged.
|
|||
|
False, if the algorithm hasn't converged (rare case).
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005-2008 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool smatrixevd(const real_2d_array &a, const ae_int_t n, const ae_int_t zneeded, const bool isupper, real_1d_array &d, real_2d_array &z);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Subroutine for finding the eigenvalues (and eigenvectors) of a symmetric
|
|||
|
matrix in a given half open interval (A, B] by using a bisection and
|
|||
|
inverse iteration
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - symmetric matrix which is given by its upper or lower
|
|||
|
triangular part. Array [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
ZNeeded - flag controlling whether the eigenvectors are needed or not.
|
|||
|
If ZNeeded is equal to:
|
|||
|
* 0, the eigenvectors are not returned;
|
|||
|
* 1, the eigenvectors are returned.
|
|||
|
IsUpperA - storage format of matrix A.
|
|||
|
B1, B2 - half open interval (B1, B2] to search eigenvalues in.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
M - number of eigenvalues found in a given half-interval (M>=0).
|
|||
|
W - array of the eigenvalues found.
|
|||
|
Array whose index ranges within [0..M-1].
|
|||
|
Z - if ZNeeded is equal to:
|
|||
|
* 0, Z hasn<EFBFBD>t changed;
|
|||
|
* 1, Z contains eigenvectors.
|
|||
|
Array whose indexes range within [0..N-1, 0..M-1].
|
|||
|
The eigenvectors are stored in the matrix columns.
|
|||
|
|
|||
|
Result:
|
|||
|
True, if successful. M contains the number of eigenvalues in the given
|
|||
|
half-interval (could be equal to 0), W contains the eigenvalues,
|
|||
|
Z contains the eigenvectors (if needed).
|
|||
|
|
|||
|
False, if the bisection method subroutine wasn't able to find the
|
|||
|
eigenvalues in the given interval or if the inverse iteration subroutine
|
|||
|
wasn't able to find all the corresponding eigenvectors.
|
|||
|
In that case, the eigenvalues and eigenvectors are not returned,
|
|||
|
M is equal to 0.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 07.01.2006 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool smatrixevdr(const real_2d_array &a, const ae_int_t n, const ae_int_t zneeded, const bool isupper, const double b1, const double b2, ae_int_t &m, real_1d_array &w, real_2d_array &z);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Subroutine for finding the eigenvalues and eigenvectors of a symmetric
|
|||
|
matrix with given indexes by using bisection and inverse iteration methods.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - symmetric matrix which is given by its upper or lower
|
|||
|
triangular part. Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
ZNeeded - flag controlling whether the eigenvectors are needed or not.
|
|||
|
If ZNeeded is equal to:
|
|||
|
* 0, the eigenvectors are not returned;
|
|||
|
* 1, the eigenvectors are returned.
|
|||
|
IsUpperA - storage format of matrix A.
|
|||
|
I1, I2 - index interval for searching (from I1 to I2).
|
|||
|
0 <= I1 <= I2 <= N-1.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
W - array of the eigenvalues found.
|
|||
|
Array whose index ranges within [0..I2-I1].
|
|||
|
Z - if ZNeeded is equal to:
|
|||
|
* 0, Z hasn<EFBFBD>t changed;
|
|||
|
* 1, Z contains eigenvectors.
|
|||
|
Array whose indexes range within [0..N-1, 0..I2-I1].
|
|||
|
In that case, the eigenvectors are stored in the matrix columns.
|
|||
|
|
|||
|
Result:
|
|||
|
True, if successful. W contains the eigenvalues, Z contains the
|
|||
|
eigenvectors (if needed).
|
|||
|
|
|||
|
False, if the bisection method subroutine wasn't able to find the
|
|||
|
eigenvalues in the given interval or if the inverse iteration subroutine
|
|||
|
wasn't able to find all the corresponding eigenvectors.
|
|||
|
In that case, the eigenvalues and eigenvectors are not returned.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 07.01.2006 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool smatrixevdi(const real_2d_array &a, const ae_int_t n, const ae_int_t zneeded, const bool isupper, const ae_int_t i1, const ae_int_t i2, real_1d_array &w, real_2d_array &z);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Finding the eigenvalues and eigenvectors of a Hermitian matrix
|
|||
|
|
|||
|
The algorithm finds eigen pairs of a Hermitian matrix by reducing it to
|
|||
|
real tridiagonal form and using the QL/QR algorithm.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - Hermitian matrix which is given by its upper or lower
|
|||
|
triangular part.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
IsUpper - storage format.
|
|||
|
ZNeeded - flag controlling whether the eigenvectors are needed or
|
|||
|
not. If ZNeeded is equal to:
|
|||
|
* 0, the eigenvectors are not returned;
|
|||
|
* 1, the eigenvectors are returned.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
D - eigenvalues in ascending order.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
Z - if ZNeeded is equal to:
|
|||
|
* 0, Z hasn<EFBFBD>t changed;
|
|||
|
* 1, Z contains the eigenvectors.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
The eigenvectors are stored in the matrix columns.
|
|||
|
|
|||
|
Result:
|
|||
|
True, if the algorithm has converged.
|
|||
|
False, if the algorithm hasn't converged (rare case).
|
|||
|
|
|||
|
Note:
|
|||
|
eigenvectors of Hermitian matrix are defined up to multiplication by
|
|||
|
a complex number L, such that |L|=1.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005, 23 March 2007 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool hmatrixevd(const complex_2d_array &a, const ae_int_t n, const ae_int_t zneeded, const bool isupper, real_1d_array &d, complex_2d_array &z);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Subroutine for finding the eigenvalues (and eigenvectors) of a Hermitian
|
|||
|
matrix in a given half-interval (A, B] by using a bisection and inverse
|
|||
|
iteration
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - Hermitian matrix which is given by its upper or lower
|
|||
|
triangular part. Array whose indexes range within
|
|||
|
[0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
ZNeeded - flag controlling whether the eigenvectors are needed or
|
|||
|
not. If ZNeeded is equal to:
|
|||
|
* 0, the eigenvectors are not returned;
|
|||
|
* 1, the eigenvectors are returned.
|
|||
|
IsUpperA - storage format of matrix A.
|
|||
|
B1, B2 - half-interval (B1, B2] to search eigenvalues in.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
M - number of eigenvalues found in a given half-interval, M>=0
|
|||
|
W - array of the eigenvalues found.
|
|||
|
Array whose index ranges within [0..M-1].
|
|||
|
Z - if ZNeeded is equal to:
|
|||
|
* 0, Z hasn<EFBFBD>t changed;
|
|||
|
* 1, Z contains eigenvectors.
|
|||
|
Array whose indexes range within [0..N-1, 0..M-1].
|
|||
|
The eigenvectors are stored in the matrix columns.
|
|||
|
|
|||
|
Result:
|
|||
|
True, if successful. M contains the number of eigenvalues in the given
|
|||
|
half-interval (could be equal to 0), W contains the eigenvalues,
|
|||
|
Z contains the eigenvectors (if needed).
|
|||
|
|
|||
|
False, if the bisection method subroutine wasn't able to find the
|
|||
|
eigenvalues in the given interval or if the inverse iteration
|
|||
|
subroutine wasn't able to find all the corresponding eigenvectors.
|
|||
|
In that case, the eigenvalues and eigenvectors are not returned, M is
|
|||
|
equal to 0.
|
|||
|
|
|||
|
Note:
|
|||
|
eigen vectors of Hermitian matrix are defined up to multiplication by
|
|||
|
a complex number L, such as |L|=1.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 07.01.2006, 24.03.2007 by Bochkanov Sergey.
|
|||
|
*************************************************************************/
|
|||
|
bool hmatrixevdr(const complex_2d_array &a, const ae_int_t n, const ae_int_t zneeded, const bool isupper, const double b1, const double b2, ae_int_t &m, real_1d_array &w, complex_2d_array &z);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Subroutine for finding the eigenvalues and eigenvectors of a Hermitian
|
|||
|
matrix with given indexes by using bisection and inverse iteration methods
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - Hermitian matrix which is given by its upper or lower
|
|||
|
triangular part.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
ZNeeded - flag controlling whether the eigenvectors are needed or
|
|||
|
not. If ZNeeded is equal to:
|
|||
|
* 0, the eigenvectors are not returned;
|
|||
|
* 1, the eigenvectors are returned.
|
|||
|
IsUpperA - storage format of matrix A.
|
|||
|
I1, I2 - index interval for searching (from I1 to I2).
|
|||
|
0 <= I1 <= I2 <= N-1.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
W - array of the eigenvalues found.
|
|||
|
Array whose index ranges within [0..I2-I1].
|
|||
|
Z - if ZNeeded is equal to:
|
|||
|
* 0, Z hasn<EFBFBD>t changed;
|
|||
|
* 1, Z contains eigenvectors.
|
|||
|
Array whose indexes range within [0..N-1, 0..I2-I1].
|
|||
|
In that case, the eigenvectors are stored in the matrix
|
|||
|
columns.
|
|||
|
|
|||
|
Result:
|
|||
|
True, if successful. W contains the eigenvalues, Z contains the
|
|||
|
eigenvectors (if needed).
|
|||
|
|
|||
|
False, if the bisection method subroutine wasn't able to find the
|
|||
|
eigenvalues in the given interval or if the inverse iteration
|
|||
|
subroutine wasn't able to find all the corresponding eigenvectors.
|
|||
|
In that case, the eigenvalues and eigenvectors are not returned.
|
|||
|
|
|||
|
Note:
|
|||
|
eigen vectors of Hermitian matrix are defined up to multiplication by
|
|||
|
a complex number L, such as |L|=1.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 07.01.2006, 24.03.2007 by Bochkanov Sergey.
|
|||
|
*************************************************************************/
|
|||
|
bool hmatrixevdi(const complex_2d_array &a, const ae_int_t n, const ae_int_t zneeded, const bool isupper, const ae_int_t i1, const ae_int_t i2, real_1d_array &w, complex_2d_array &z);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Finding the eigenvalues and eigenvectors of a tridiagonal symmetric matrix
|
|||
|
|
|||
|
The algorithm finds the eigen pairs of a tridiagonal symmetric matrix by
|
|||
|
using an QL/QR algorithm with implicit shifts.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
D - the main diagonal of a tridiagonal matrix.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
E - the secondary diagonal of a tridiagonal matrix.
|
|||
|
Array whose index ranges within [0..N-2].
|
|||
|
N - size of matrix A.
|
|||
|
ZNeeded - flag controlling whether the eigenvectors are needed or not.
|
|||
|
If ZNeeded is equal to:
|
|||
|
* 0, the eigenvectors are not needed;
|
|||
|
* 1, the eigenvectors of a tridiagonal matrix
|
|||
|
are multiplied by the square matrix Z. It is used if the
|
|||
|
tridiagonal matrix is obtained by the similarity
|
|||
|
transformation of a symmetric matrix;
|
|||
|
* 2, the eigenvectors of a tridiagonal matrix replace the
|
|||
|
square matrix Z;
|
|||
|
* 3, matrix Z contains the first row of the eigenvectors
|
|||
|
matrix.
|
|||
|
Z - if ZNeeded=1, Z contains the square matrix by which the
|
|||
|
eigenvectors are multiplied.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
|
|||
|
Output parameters:
|
|||
|
D - eigenvalues in ascending order.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
Z - if ZNeeded is equal to:
|
|||
|
* 0, Z hasn<EFBFBD>t changed;
|
|||
|
* 1, Z contains the product of a given matrix (from the left)
|
|||
|
and the eigenvectors matrix (from the right);
|
|||
|
* 2, Z contains the eigenvectors.
|
|||
|
* 3, Z contains the first row of the eigenvectors matrix.
|
|||
|
If ZNeeded<3, Z is the array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
In that case, the eigenvectors are stored in the matrix columns.
|
|||
|
If ZNeeded=3, Z is the array whose indexes range within [0..0, 0..N-1].
|
|||
|
|
|||
|
Result:
|
|||
|
True, if the algorithm has converged.
|
|||
|
False, if the algorithm hasn't converged.
|
|||
|
|
|||
|
-- LAPACK routine (version 3.0) --
|
|||
|
Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
|
|||
|
Courant Institute, Argonne National Lab, and Rice University
|
|||
|
September 30, 1994
|
|||
|
*************************************************************************/
|
|||
|
bool smatrixtdevd(real_1d_array &d, const real_1d_array &e, const ae_int_t n, const ae_int_t zneeded, real_2d_array &z);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Subroutine for finding the tridiagonal matrix eigenvalues/vectors in a
|
|||
|
given half-interval (A, B] by using bisection and inverse iteration.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
D - the main diagonal of a tridiagonal matrix.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
E - the secondary diagonal of a tridiagonal matrix.
|
|||
|
Array whose index ranges within [0..N-2].
|
|||
|
N - size of matrix, N>=0.
|
|||
|
ZNeeded - flag controlling whether the eigenvectors are needed or not.
|
|||
|
If ZNeeded is equal to:
|
|||
|
* 0, the eigenvectors are not needed;
|
|||
|
* 1, the eigenvectors of a tridiagonal matrix are multiplied
|
|||
|
by the square matrix Z. It is used if the tridiagonal
|
|||
|
matrix is obtained by the similarity transformation
|
|||
|
of a symmetric matrix.
|
|||
|
* 2, the eigenvectors of a tridiagonal matrix replace matrix Z.
|
|||
|
A, B - half-interval (A, B] to search eigenvalues in.
|
|||
|
Z - if ZNeeded is equal to:
|
|||
|
* 0, Z isn't used and remains unchanged;
|
|||
|
* 1, Z contains the square matrix (array whose indexes range
|
|||
|
within [0..N-1, 0..N-1]) which reduces the given symmetric
|
|||
|
matrix to tridiagonal form;
|
|||
|
* 2, Z isn't used (but changed on the exit).
|
|||
|
|
|||
|
Output parameters:
|
|||
|
D - array of the eigenvalues found.
|
|||
|
Array whose index ranges within [0..M-1].
|
|||
|
M - number of eigenvalues found in the given half-interval (M>=0).
|
|||
|
Z - if ZNeeded is equal to:
|
|||
|
* 0, doesn't contain any information;
|
|||
|
* 1, contains the product of a given NxN matrix Z (from the
|
|||
|
left) and NxM matrix of the eigenvectors found (from the
|
|||
|
right). Array whose indexes range within [0..N-1, 0..M-1].
|
|||
|
* 2, contains the matrix of the eigenvectors found.
|
|||
|
Array whose indexes range within [0..N-1, 0..M-1].
|
|||
|
|
|||
|
Result:
|
|||
|
|
|||
|
True, if successful. In that case, M contains the number of eigenvalues
|
|||
|
in the given half-interval (could be equal to 0), D contains the eigenvalues,
|
|||
|
Z contains the eigenvectors (if needed).
|
|||
|
It should be noted that the subroutine changes the size of arrays D and Z.
|
|||
|
|
|||
|
False, if the bisection method subroutine wasn't able to find the
|
|||
|
eigenvalues in the given interval or if the inverse iteration subroutine
|
|||
|
wasn't able to find all the corresponding eigenvectors. In that case,
|
|||
|
the eigenvalues and eigenvectors are not returned, M is equal to 0.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 31.03.2008 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool smatrixtdevdr(real_1d_array &d, const real_1d_array &e, const ae_int_t n, const ae_int_t zneeded, const double a, const double b, ae_int_t &m, real_2d_array &z);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Subroutine for finding tridiagonal matrix eigenvalues/vectors with given
|
|||
|
indexes (in ascending order) by using the bisection and inverse iteraion.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
D - the main diagonal of a tridiagonal matrix.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
E - the secondary diagonal of a tridiagonal matrix.
|
|||
|
Array whose index ranges within [0..N-2].
|
|||
|
N - size of matrix. N>=0.
|
|||
|
ZNeeded - flag controlling whether the eigenvectors are needed or not.
|
|||
|
If ZNeeded is equal to:
|
|||
|
* 0, the eigenvectors are not needed;
|
|||
|
* 1, the eigenvectors of a tridiagonal matrix are multiplied
|
|||
|
by the square matrix Z. It is used if the
|
|||
|
tridiagonal matrix is obtained by the similarity transformation
|
|||
|
of a symmetric matrix.
|
|||
|
* 2, the eigenvectors of a tridiagonal matrix replace
|
|||
|
matrix Z.
|
|||
|
I1, I2 - index interval for searching (from I1 to I2).
|
|||
|
0 <= I1 <= I2 <= N-1.
|
|||
|
Z - if ZNeeded is equal to:
|
|||
|
* 0, Z isn't used and remains unchanged;
|
|||
|
* 1, Z contains the square matrix (array whose indexes range within [0..N-1, 0..N-1])
|
|||
|
which reduces the given symmetric matrix to tridiagonal form;
|
|||
|
* 2, Z isn't used (but changed on the exit).
|
|||
|
|
|||
|
Output parameters:
|
|||
|
D - array of the eigenvalues found.
|
|||
|
Array whose index ranges within [0..I2-I1].
|
|||
|
Z - if ZNeeded is equal to:
|
|||
|
* 0, doesn't contain any information;
|
|||
|
* 1, contains the product of a given NxN matrix Z (from the left) and
|
|||
|
Nx(I2-I1) matrix of the eigenvectors found (from the right).
|
|||
|
Array whose indexes range within [0..N-1, 0..I2-I1].
|
|||
|
* 2, contains the matrix of the eigenvalues found.
|
|||
|
Array whose indexes range within [0..N-1, 0..I2-I1].
|
|||
|
|
|||
|
|
|||
|
Result:
|
|||
|
|
|||
|
True, if successful. In that case, D contains the eigenvalues,
|
|||
|
Z contains the eigenvectors (if needed).
|
|||
|
It should be noted that the subroutine changes the size of arrays D and Z.
|
|||
|
|
|||
|
False, if the bisection method subroutine wasn't able to find the eigenvalues
|
|||
|
in the given interval or if the inverse iteration subroutine wasn't able
|
|||
|
to find all the corresponding eigenvectors. In that case, the eigenvalues
|
|||
|
and eigenvectors are not returned.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 25.12.2005 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool smatrixtdevdi(real_1d_array &d, const real_1d_array &e, const ae_int_t n, const ae_int_t zneeded, const ae_int_t i1, const ae_int_t i2, real_2d_array &z);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Finding eigenvalues and eigenvectors of a general matrix
|
|||
|
|
|||
|
The algorithm finds eigenvalues and eigenvectors of a general matrix by
|
|||
|
using the QR algorithm with multiple shifts. The algorithm can find
|
|||
|
eigenvalues and both left and right eigenvectors.
|
|||
|
|
|||
|
The right eigenvector is a vector x such that A*x = w*x, and the left
|
|||
|
eigenvector is a vector y such that y'*A = w*y' (here y' implies a complex
|
|||
|
conjugate transposition of vector y).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix. Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
VNeeded - flag controlling whether eigenvectors are needed or not.
|
|||
|
If VNeeded is equal to:
|
|||
|
* 0, eigenvectors are not returned;
|
|||
|
* 1, right eigenvectors are returned;
|
|||
|
* 2, left eigenvectors are returned;
|
|||
|
* 3, both left and right eigenvectors are returned.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
WR - real parts of eigenvalues.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
WR - imaginary parts of eigenvalues.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
VL, VR - arrays of left and right eigenvectors (if they are needed).
|
|||
|
If WI[i]=0, the respective eigenvalue is a real number,
|
|||
|
and it corresponds to the column number I of matrices VL/VR.
|
|||
|
If WI[i]>0, we have a pair of complex conjugate numbers with
|
|||
|
positive and negative imaginary parts:
|
|||
|
the first eigenvalue WR[i] + sqrt(-1)*WI[i];
|
|||
|
the second eigenvalue WR[i+1] + sqrt(-1)*WI[i+1];
|
|||
|
WI[i]>0
|
|||
|
WI[i+1] = -WI[i] < 0
|
|||
|
In that case, the eigenvector corresponding to the first
|
|||
|
eigenvalue is located in i and i+1 columns of matrices
|
|||
|
VL/VR (the column number i contains the real part, and the
|
|||
|
column number i+1 contains the imaginary part), and the vector
|
|||
|
corresponding to the second eigenvalue is a complex conjugate to
|
|||
|
the first vector.
|
|||
|
Arrays whose indexes range within [0..N-1, 0..N-1].
|
|||
|
|
|||
|
Result:
|
|||
|
True, if the algorithm has converged.
|
|||
|
False, if the algorithm has not converged.
|
|||
|
|
|||
|
Note 1:
|
|||
|
Some users may ask the following question: what if WI[N-1]>0?
|
|||
|
WI[N] must contain an eigenvalue which is complex conjugate to the
|
|||
|
N-th eigenvalue, but the array has only size N?
|
|||
|
The answer is as follows: such a situation cannot occur because the
|
|||
|
algorithm finds a pairs of eigenvalues, therefore, if WI[i]>0, I is
|
|||
|
strictly less than N-1.
|
|||
|
|
|||
|
Note 2:
|
|||
|
The algorithm performance depends on the value of the internal parameter
|
|||
|
NS of the InternalSchurDecomposition subroutine which defines the number
|
|||
|
of shifts in the QR algorithm (similarly to the block width in block-matrix
|
|||
|
algorithms of linear algebra). If you require maximum performance
|
|||
|
on your machine, it is recommended to adjust this parameter manually.
|
|||
|
|
|||
|
|
|||
|
See also the InternalTREVC subroutine.
|
|||
|
|
|||
|
The algorithm is based on the LAPACK 3.0 library.
|
|||
|
*************************************************************************/
|
|||
|
bool rmatrixevd(const real_2d_array &a, const ae_int_t n, const ae_int_t vneeded, real_1d_array &wr, real_1d_array &wi, real_2d_array &vl, real_2d_array &vr);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Generation of a random uniformly distributed (Haar) orthogonal matrix
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
N - matrix size, N>=1
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - orthogonal NxN matrix, array[0..N-1,0..N-1]
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixrndorthogonal(const ae_int_t n, real_2d_array &a);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Generation of random NxN matrix with given condition number and norm2(A)=1
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
N - matrix size
|
|||
|
C - condition number (in 2-norm)
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - random matrix with norm2(A)=1 and cond(A)=C
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixrndcond(const ae_int_t n, const double c, real_2d_array &a);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Generation of a random Haar distributed orthogonal complex matrix
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
N - matrix size, N>=1
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - orthogonal NxN matrix, array[0..N-1,0..N-1]
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixrndorthogonal(const ae_int_t n, complex_2d_array &a);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Generation of random NxN complex matrix with given condition number C and
|
|||
|
norm2(A)=1
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
N - matrix size
|
|||
|
C - condition number (in 2-norm)
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - random matrix with norm2(A)=1 and cond(A)=C
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixrndcond(const ae_int_t n, const double c, complex_2d_array &a);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Generation of random NxN symmetric matrix with given condition number and
|
|||
|
norm2(A)=1
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
N - matrix size
|
|||
|
C - condition number (in 2-norm)
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - random matrix with norm2(A)=1 and cond(A)=C
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void smatrixrndcond(const ae_int_t n, const double c, real_2d_array &a);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Generation of random NxN symmetric positive definite matrix with given
|
|||
|
condition number and norm2(A)=1
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
N - matrix size
|
|||
|
C - condition number (in 2-norm)
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - random SPD matrix with norm2(A)=1 and cond(A)=C
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void spdmatrixrndcond(const ae_int_t n, const double c, real_2d_array &a);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Generation of random NxN Hermitian matrix with given condition number and
|
|||
|
norm2(A)=1
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
N - matrix size
|
|||
|
C - condition number (in 2-norm)
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - random matrix with norm2(A)=1 and cond(A)=C
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void hmatrixrndcond(const ae_int_t n, const double c, complex_2d_array &a);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Generation of random NxN Hermitian positive definite matrix with given
|
|||
|
condition number and norm2(A)=1
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
N - matrix size
|
|||
|
C - condition number (in 2-norm)
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - random HPD matrix with norm2(A)=1 and cond(A)=C
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void hpdmatrixrndcond(const ae_int_t n, const double c, complex_2d_array &a);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Multiplication of MxN matrix by NxN random Haar distributed orthogonal matrix
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - matrix, array[0..M-1, 0..N-1]
|
|||
|
M, N- matrix size
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - A*Q, where Q is random NxN orthogonal matrix
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixrndorthogonalfromtheright(real_2d_array &a, const ae_int_t m, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Multiplication of MxN matrix by MxM random Haar distributed orthogonal matrix
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - matrix, array[0..M-1, 0..N-1]
|
|||
|
M, N- matrix size
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - Q*A, where Q is random MxM orthogonal matrix
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixrndorthogonalfromtheleft(real_2d_array &a, const ae_int_t m, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Multiplication of MxN complex matrix by NxN random Haar distributed
|
|||
|
complex orthogonal matrix
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - matrix, array[0..M-1, 0..N-1]
|
|||
|
M, N- matrix size
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - A*Q, where Q is random NxN orthogonal matrix
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixrndorthogonalfromtheright(complex_2d_array &a, const ae_int_t m, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Multiplication of MxN complex matrix by MxM random Haar distributed
|
|||
|
complex orthogonal matrix
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - matrix, array[0..M-1, 0..N-1]
|
|||
|
M, N- matrix size
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - Q*A, where Q is random MxM orthogonal matrix
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixrndorthogonalfromtheleft(complex_2d_array &a, const ae_int_t m, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Symmetric multiplication of NxN matrix by random Haar distributed
|
|||
|
orthogonal matrix
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - matrix, array[0..N-1, 0..N-1]
|
|||
|
N - matrix size
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - Q'*A*Q, where Q is random NxN orthogonal matrix
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void smatrixrndmultiply(real_2d_array &a, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Hermitian multiplication of NxN matrix by random Haar distributed
|
|||
|
complex orthogonal matrix
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - matrix, array[0..N-1, 0..N-1]
|
|||
|
N - matrix size
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - Q^H*A*Q, where Q is random NxN orthogonal matrix
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
04.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void hmatrixrndmultiply(complex_2d_array &a, const ae_int_t n);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
LU decomposition of a general real matrix with row pivoting
|
|||
|
|
|||
|
A is represented as A = P*L*U, where:
|
|||
|
* L is lower unitriangular matrix
|
|||
|
* U is upper triangular matrix
|
|||
|
* P = P0*P1*...*PK, K=min(M,N)-1,
|
|||
|
Pi - permutation matrix for I and Pivots[I]
|
|||
|
|
|||
|
This is cache-oblivous implementation of LU decomposition.
|
|||
|
It is optimized for square matrices. As for rectangular matrices:
|
|||
|
* best case - M>>N
|
|||
|
* worst case - N>>M, small M, large N, matrix does not fit in CPU cache
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - array[0..M-1, 0..N-1].
|
|||
|
M - number of rows in matrix A.
|
|||
|
N - number of columns in matrix A.
|
|||
|
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - matrices L and U in compact form:
|
|||
|
* L is stored under main diagonal
|
|||
|
* U is stored on and above main diagonal
|
|||
|
Pivots - permutation matrix in compact form.
|
|||
|
array[0..Min(M-1,N-1)].
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
10.01.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixlu(real_2d_array &a, const ae_int_t m, const ae_int_t n, integer_1d_array &pivots);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
LU decomposition of a general complex matrix with row pivoting
|
|||
|
|
|||
|
A is represented as A = P*L*U, where:
|
|||
|
* L is lower unitriangular matrix
|
|||
|
* U is upper triangular matrix
|
|||
|
* P = P0*P1*...*PK, K=min(M,N)-1,
|
|||
|
Pi - permutation matrix for I and Pivots[I]
|
|||
|
|
|||
|
This is cache-oblivous implementation of LU decomposition. It is optimized
|
|||
|
for square matrices. As for rectangular matrices:
|
|||
|
* best case - M>>N
|
|||
|
* worst case - N>>M, small M, large N, matrix does not fit in CPU cache
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - array[0..M-1, 0..N-1].
|
|||
|
M - number of rows in matrix A.
|
|||
|
N - number of columns in matrix A.
|
|||
|
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - matrices L and U in compact form:
|
|||
|
* L is stored under main diagonal
|
|||
|
* U is stored on and above main diagonal
|
|||
|
Pivots - permutation matrix in compact form.
|
|||
|
array[0..Min(M-1,N-1)].
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
10.01.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixlu(complex_2d_array &a, const ae_int_t m, const ae_int_t n, integer_1d_array &pivots);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Cache-oblivious Cholesky decomposition
|
|||
|
|
|||
|
The algorithm computes Cholesky decomposition of a Hermitian positive-
|
|||
|
definite matrix. The result of an algorithm is a representation of A as
|
|||
|
A=U'*U or A=L*L' (here X' detones conj(X^T)).
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - upper or lower triangle of a factorized matrix.
|
|||
|
array with elements [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
IsUpper - if IsUpper=True, then A contains an upper triangle of
|
|||
|
a symmetric matrix, otherwise A contains a lower one.
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - the result of factorization. If IsUpper=True, then
|
|||
|
the upper triangle contains matrix U, so that A = U'*U,
|
|||
|
and the elements below the main diagonal are not modified.
|
|||
|
Similarly, if IsUpper = False.
|
|||
|
|
|||
|
RESULT:
|
|||
|
If the matrix is positive-definite, the function returns True.
|
|||
|
Otherwise, the function returns False. Contents of A is not determined
|
|||
|
in such case.
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
15.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool hpdmatrixcholesky(complex_2d_array &a, const ae_int_t n, const bool isupper);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Cache-oblivious Cholesky decomposition
|
|||
|
|
|||
|
The algorithm computes Cholesky decomposition of a symmetric positive-
|
|||
|
definite matrix. The result of an algorithm is a representation of A as
|
|||
|
A=U^T*U or A=L*L^T
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - upper or lower triangle of a factorized matrix.
|
|||
|
array with elements [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
IsUpper - if IsUpper=True, then A contains an upper triangle of
|
|||
|
a symmetric matrix, otherwise A contains a lower one.
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
A - the result of factorization. If IsUpper=True, then
|
|||
|
the upper triangle contains matrix U, so that A = U^T*U,
|
|||
|
and the elements below the main diagonal are not modified.
|
|||
|
Similarly, if IsUpper = False.
|
|||
|
|
|||
|
RESULT:
|
|||
|
If the matrix is positive-definite, the function returns True.
|
|||
|
Otherwise, the function returns False. Contents of A is not determined
|
|||
|
in such case.
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
15.12.2009
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool spdmatrixcholesky(real_2d_array &a, const ae_int_t n, const bool isupper);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Estimate of a matrix condition number (1-norm)
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix. Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double rmatrixrcond1(const real_2d_array &a, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Estimate of a matrix condition number (infinity-norm).
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix. Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double rmatrixrcondinf(const real_2d_array &a, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Condition number estimate of a symmetric positive definite matrix.
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
It should be noted that 1-norm and inf-norm of condition numbers of symmetric
|
|||
|
matrices are equal, so the algorithm doesn't take into account the
|
|||
|
differences between these types of norms.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - symmetric positive definite matrix which is given by its
|
|||
|
upper or lower triangle depending on the value of
|
|||
|
IsUpper. Array with elements [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
IsUpper - storage format.
|
|||
|
|
|||
|
Result:
|
|||
|
1/LowerBound(cond(A)), if matrix A is positive definite,
|
|||
|
-1, if matrix A is not positive definite, and its condition number
|
|||
|
could not be found by this algorithm.
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double spdmatrixrcond(const real_2d_array &a, const ae_int_t n, const bool isupper);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Triangular matrix: estimate of a condition number (1-norm)
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix. Array[0..N-1, 0..N-1].
|
|||
|
N - size of A.
|
|||
|
IsUpper - True, if the matrix is upper triangular.
|
|||
|
IsUnit - True, if the matrix has a unit diagonal.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double rmatrixtrrcond1(const real_2d_array &a, const ae_int_t n, const bool isupper, const bool isunit);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Triangular matrix: estimate of a matrix condition number (infinity-norm).
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix. Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
IsUpper - True, if the matrix is upper triangular.
|
|||
|
IsUnit - True, if the matrix has a unit diagonal.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double rmatrixtrrcondinf(const real_2d_array &a, const ae_int_t n, const bool isupper, const bool isunit);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Condition number estimate of a Hermitian positive definite matrix.
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
It should be noted that 1-norm and inf-norm of condition numbers of symmetric
|
|||
|
matrices are equal, so the algorithm doesn't take into account the
|
|||
|
differences between these types of norms.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - Hermitian positive definite matrix which is given by its
|
|||
|
upper or lower triangle depending on the value of
|
|||
|
IsUpper. Array with elements [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
IsUpper - storage format.
|
|||
|
|
|||
|
Result:
|
|||
|
1/LowerBound(cond(A)), if matrix A is positive definite,
|
|||
|
-1, if matrix A is not positive definite, and its condition number
|
|||
|
could not be found by this algorithm.
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double hpdmatrixrcond(const complex_2d_array &a, const ae_int_t n, const bool isupper);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Estimate of a matrix condition number (1-norm)
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix. Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double cmatrixrcond1(const complex_2d_array &a, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Estimate of a matrix condition number (infinity-norm).
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix. Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double cmatrixrcondinf(const complex_2d_array &a, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Estimate of the condition number of a matrix given by its LU decomposition (1-norm)
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
LUA - LU decomposition of a matrix in compact form. Output of
|
|||
|
the RMatrixLU subroutine.
|
|||
|
N - size of matrix A.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double rmatrixlurcond1(const real_2d_array &lua, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Estimate of the condition number of a matrix given by its LU decomposition
|
|||
|
(infinity norm).
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
LUA - LU decomposition of a matrix in compact form. Output of
|
|||
|
the RMatrixLU subroutine.
|
|||
|
N - size of matrix A.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double rmatrixlurcondinf(const real_2d_array &lua, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Condition number estimate of a symmetric positive definite matrix given by
|
|||
|
Cholesky decomposition.
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this
|
|||
|
case, the algorithm does not return a lower bound of the condition number,
|
|||
|
but an inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
It should be noted that 1-norm and inf-norm condition numbers of symmetric
|
|||
|
matrices are equal, so the algorithm doesn't take into account the
|
|||
|
differences between these types of norms.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
CD - Cholesky decomposition of matrix A,
|
|||
|
output of SMatrixCholesky subroutine.
|
|||
|
N - size of matrix A.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double spdmatrixcholeskyrcond(const real_2d_array &a, const ae_int_t n, const bool isupper);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Condition number estimate of a Hermitian positive definite matrix given by
|
|||
|
Cholesky decomposition.
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this
|
|||
|
case, the algorithm does not return a lower bound of the condition number,
|
|||
|
but an inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
It should be noted that 1-norm and inf-norm condition numbers of symmetric
|
|||
|
matrices are equal, so the algorithm doesn't take into account the
|
|||
|
differences between these types of norms.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
CD - Cholesky decomposition of matrix A,
|
|||
|
output of SMatrixCholesky subroutine.
|
|||
|
N - size of matrix A.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double hpdmatrixcholeskyrcond(const complex_2d_array &a, const ae_int_t n, const bool isupper);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Estimate of the condition number of a matrix given by its LU decomposition (1-norm)
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
LUA - LU decomposition of a matrix in compact form. Output of
|
|||
|
the CMatrixLU subroutine.
|
|||
|
N - size of matrix A.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double cmatrixlurcond1(const complex_2d_array &lua, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Estimate of the condition number of a matrix given by its LU decomposition
|
|||
|
(infinity norm).
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
LUA - LU decomposition of a matrix in compact form. Output of
|
|||
|
the CMatrixLU subroutine.
|
|||
|
N - size of matrix A.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double cmatrixlurcondinf(const complex_2d_array &lua, const ae_int_t n);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Triangular matrix: estimate of a condition number (1-norm)
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix. Array[0..N-1, 0..N-1].
|
|||
|
N - size of A.
|
|||
|
IsUpper - True, if the matrix is upper triangular.
|
|||
|
IsUnit - True, if the matrix has a unit diagonal.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double cmatrixtrrcond1(const complex_2d_array &a, const ae_int_t n, const bool isupper, const bool isunit);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Triangular matrix: estimate of a matrix condition number (infinity-norm).
|
|||
|
|
|||
|
The algorithm calculates a lower bound of the condition number. In this case,
|
|||
|
the algorithm does not return a lower bound of the condition number, but an
|
|||
|
inverse number (to avoid an overflow in case of a singular matrix).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix. Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
IsUpper - True, if the matrix is upper triangular.
|
|||
|
IsUnit - True, if the matrix has a unit diagonal.
|
|||
|
|
|||
|
Result: 1/LowerBound(cond(A))
|
|||
|
|
|||
|
NOTE:
|
|||
|
if k(A) is very large, then matrix is assumed degenerate, k(A)=INF,
|
|||
|
0.0 is returned in such cases.
|
|||
|
*************************************************************************/
|
|||
|
double cmatrixtrrcondinf(const complex_2d_array &a, const ae_int_t n, const bool isupper, const bool isunit);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Inversion of a matrix given by its LU decomposition.
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - LU decomposition of the matrix
|
|||
|
(output of RMatrixLU subroutine).
|
|||
|
Pivots - table of permutations
|
|||
|
(the output of RMatrixLU subroutine).
|
|||
|
N - size of matrix A (optional) :
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, size is automatically determined from
|
|||
|
matrix size (A must be square matrix)
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
Info - return code:
|
|||
|
* -3 A is singular, or VERY close to singular.
|
|||
|
it is filled by zeros in such cases.
|
|||
|
* 1 task is solved (but matrix A may be ill-conditioned,
|
|||
|
check R1/RInf parameters for condition numbers).
|
|||
|
Rep - solver report, see below for more info
|
|||
|
A - inverse of matrix A.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
|
|||
|
SOLVER REPORT
|
|||
|
|
|||
|
Subroutine sets following fields of the Rep structure:
|
|||
|
* R1 reciprocal of condition number: 1/cond(A), 1-norm.
|
|||
|
* RInf reciprocal of condition number: 1/cond(A), inf-norm.
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
05.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixluinverse(real_2d_array &a, const integer_1d_array &pivots, const ae_int_t n, ae_int_t &info, matinvreport &rep);
|
|||
|
void rmatrixluinverse(real_2d_array &a, const integer_1d_array &pivots, ae_int_t &info, matinvreport &rep);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Inversion of a general matrix.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix.
|
|||
|
N - size of matrix A (optional) :
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, size is automatically determined from
|
|||
|
matrix size (A must be square matrix)
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Info - return code, same as in RMatrixLUInverse
|
|||
|
Rep - solver report, same as in RMatrixLUInverse
|
|||
|
A - inverse of matrix A, same as in RMatrixLUInverse
|
|||
|
|
|||
|
Result:
|
|||
|
True, if the matrix is not singular.
|
|||
|
False, if the matrix is singular.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005-2010 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixinverse(real_2d_array &a, const ae_int_t n, ae_int_t &info, matinvreport &rep);
|
|||
|
void rmatrixinverse(real_2d_array &a, ae_int_t &info, matinvreport &rep);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Inversion of a matrix given by its LU decomposition.
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
A - LU decomposition of the matrix
|
|||
|
(output of CMatrixLU subroutine).
|
|||
|
Pivots - table of permutations
|
|||
|
(the output of CMatrixLU subroutine).
|
|||
|
N - size of matrix A (optional) :
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, size is automatically determined from
|
|||
|
matrix size (A must be square matrix)
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
Info - return code, same as in RMatrixLUInverse
|
|||
|
Rep - solver report, same as in RMatrixLUInverse
|
|||
|
A - inverse of matrix A, same as in RMatrixLUInverse
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
05.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixluinverse(complex_2d_array &a, const integer_1d_array &pivots, const ae_int_t n, ae_int_t &info, matinvreport &rep);
|
|||
|
void cmatrixluinverse(complex_2d_array &a, const integer_1d_array &pivots, ae_int_t &info, matinvreport &rep);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Inversion of a general matrix.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix
|
|||
|
N - size of matrix A (optional) :
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, size is automatically determined from
|
|||
|
matrix size (A must be square matrix)
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Info - return code, same as in RMatrixLUInverse
|
|||
|
Rep - solver report, same as in RMatrixLUInverse
|
|||
|
A - inverse of matrix A, same as in RMatrixLUInverse
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixinverse(complex_2d_array &a, const ae_int_t n, ae_int_t &info, matinvreport &rep);
|
|||
|
void cmatrixinverse(complex_2d_array &a, ae_int_t &info, matinvreport &rep);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Inversion of a symmetric positive definite matrix which is given
|
|||
|
by Cholesky decomposition.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - Cholesky decomposition of the matrix to be inverted:
|
|||
|
A=U<EFBFBD>*U or A = L*L'.
|
|||
|
Output of SPDMatrixCholesky subroutine.
|
|||
|
N - size of matrix A (optional) :
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, size is automatically determined from
|
|||
|
matrix size (A must be square matrix)
|
|||
|
IsUpper - storage type (optional):
|
|||
|
* if True, symmetric matrix A is given by its upper
|
|||
|
triangle, and the lower triangle isn<EFBFBD>t used/changed by
|
|||
|
function
|
|||
|
* if False, symmetric matrix A is given by its lower
|
|||
|
triangle, and the upper triangle isn<EFBFBD>t used/changed by
|
|||
|
function
|
|||
|
* if not given, lower half is used.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Info - return code, same as in RMatrixLUInverse
|
|||
|
Rep - solver report, same as in RMatrixLUInverse
|
|||
|
A - inverse of matrix A, same as in RMatrixLUInverse
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
10.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void spdmatrixcholeskyinverse(real_2d_array &a, const ae_int_t n, const bool isupper, ae_int_t &info, matinvreport &rep);
|
|||
|
void spdmatrixcholeskyinverse(real_2d_array &a, ae_int_t &info, matinvreport &rep);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Inversion of a symmetric positive definite matrix.
|
|||
|
|
|||
|
Given an upper or lower triangle of a symmetric positive definite matrix,
|
|||
|
the algorithm generates matrix A^-1 and saves the upper or lower triangle
|
|||
|
depending on the input.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix to be inverted (upper or lower triangle).
|
|||
|
Array with elements [0..N-1,0..N-1].
|
|||
|
N - size of matrix A (optional) :
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, size is automatically determined from
|
|||
|
matrix size (A must be square matrix)
|
|||
|
IsUpper - storage type (optional):
|
|||
|
* if True, symmetric matrix A is given by its upper
|
|||
|
triangle, and the lower triangle isn<EFBFBD>t used/changed by
|
|||
|
function
|
|||
|
* if False, symmetric matrix A is given by its lower
|
|||
|
triangle, and the upper triangle isn<EFBFBD>t used/changed by
|
|||
|
function
|
|||
|
* if not given, both lower and upper triangles must be
|
|||
|
filled.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Info - return code, same as in RMatrixLUInverse
|
|||
|
Rep - solver report, same as in RMatrixLUInverse
|
|||
|
A - inverse of matrix A, same as in RMatrixLUInverse
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
10.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void spdmatrixinverse(real_2d_array &a, const ae_int_t n, const bool isupper, ae_int_t &info, matinvreport &rep);
|
|||
|
void spdmatrixinverse(real_2d_array &a, ae_int_t &info, matinvreport &rep);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Inversion of a Hermitian positive definite matrix which is given
|
|||
|
by Cholesky decomposition.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - Cholesky decomposition of the matrix to be inverted:
|
|||
|
A=U<EFBFBD>*U or A = L*L'.
|
|||
|
Output of HPDMatrixCholesky subroutine.
|
|||
|
N - size of matrix A (optional) :
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, size is automatically determined from
|
|||
|
matrix size (A must be square matrix)
|
|||
|
IsUpper - storage type (optional):
|
|||
|
* if True, symmetric matrix A is given by its upper
|
|||
|
triangle, and the lower triangle isn<EFBFBD>t used/changed by
|
|||
|
function
|
|||
|
* if False, symmetric matrix A is given by its lower
|
|||
|
triangle, and the upper triangle isn<EFBFBD>t used/changed by
|
|||
|
function
|
|||
|
* if not given, lower half is used.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Info - return code, same as in RMatrixLUInverse
|
|||
|
Rep - solver report, same as in RMatrixLUInverse
|
|||
|
A - inverse of matrix A, same as in RMatrixLUInverse
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
10.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void hpdmatrixcholeskyinverse(complex_2d_array &a, const ae_int_t n, const bool isupper, ae_int_t &info, matinvreport &rep);
|
|||
|
void hpdmatrixcholeskyinverse(complex_2d_array &a, ae_int_t &info, matinvreport &rep);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Inversion of a Hermitian positive definite matrix.
|
|||
|
|
|||
|
Given an upper or lower triangle of a Hermitian positive definite matrix,
|
|||
|
the algorithm generates matrix A^-1 and saves the upper or lower triangle
|
|||
|
depending on the input.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix to be inverted (upper or lower triangle).
|
|||
|
Array with elements [0..N-1,0..N-1].
|
|||
|
N - size of matrix A (optional) :
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, size is automatically determined from
|
|||
|
matrix size (A must be square matrix)
|
|||
|
IsUpper - storage type (optional):
|
|||
|
* if True, symmetric matrix A is given by its upper
|
|||
|
triangle, and the lower triangle isn<EFBFBD>t used/changed by
|
|||
|
function
|
|||
|
* if False, symmetric matrix A is given by its lower
|
|||
|
triangle, and the upper triangle isn<EFBFBD>t used/changed by
|
|||
|
function
|
|||
|
* if not given, both lower and upper triangles must be
|
|||
|
filled.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Info - return code, same as in RMatrixLUInverse
|
|||
|
Rep - solver report, same as in RMatrixLUInverse
|
|||
|
A - inverse of matrix A, same as in RMatrixLUInverse
|
|||
|
|
|||
|
-- ALGLIB routine --
|
|||
|
10.02.2010
|
|||
|
Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void hpdmatrixinverse(complex_2d_array &a, const ae_int_t n, const bool isupper, ae_int_t &info, matinvreport &rep);
|
|||
|
void hpdmatrixinverse(complex_2d_array &a, ae_int_t &info, matinvreport &rep);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Triangular matrix inverse (real)
|
|||
|
|
|||
|
The subroutine inverts the following types of matrices:
|
|||
|
* upper triangular
|
|||
|
* upper triangular with unit diagonal
|
|||
|
* lower triangular
|
|||
|
* lower triangular with unit diagonal
|
|||
|
|
|||
|
In case of an upper (lower) triangular matrix, the inverse matrix will
|
|||
|
also be upper (lower) triangular, and after the end of the algorithm, the
|
|||
|
inverse matrix replaces the source matrix. The elements below (above) the
|
|||
|
main diagonal are not changed by the algorithm.
|
|||
|
|
|||
|
If the matrix has a unit diagonal, the inverse matrix also has a unit
|
|||
|
diagonal, and the diagonal elements are not passed to the algorithm.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix, array[0..N-1, 0..N-1].
|
|||
|
N - size of matrix A (optional) :
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, size is automatically determined from
|
|||
|
matrix size (A must be square matrix)
|
|||
|
IsUpper - True, if the matrix is upper triangular.
|
|||
|
IsUnit - diagonal type (optional):
|
|||
|
* if True, matrix has unit diagonal (a[i,i] are NOT used)
|
|||
|
* if False, matrix diagonal is arbitrary
|
|||
|
* if not given, False is assumed
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Info - same as for RMatrixLUInverse
|
|||
|
Rep - same as for RMatrixLUInverse
|
|||
|
A - same as for RMatrixLUInverse.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 05.02.2010 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixtrinverse(real_2d_array &a, const ae_int_t n, const bool isupper, const bool isunit, ae_int_t &info, matinvreport &rep);
|
|||
|
void rmatrixtrinverse(real_2d_array &a, const bool isupper, ae_int_t &info, matinvreport &rep);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Triangular matrix inverse (complex)
|
|||
|
|
|||
|
The subroutine inverts the following types of matrices:
|
|||
|
* upper triangular
|
|||
|
* upper triangular with unit diagonal
|
|||
|
* lower triangular
|
|||
|
* lower triangular with unit diagonal
|
|||
|
|
|||
|
In case of an upper (lower) triangular matrix, the inverse matrix will
|
|||
|
also be upper (lower) triangular, and after the end of the algorithm, the
|
|||
|
inverse matrix replaces the source matrix. The elements below (above) the
|
|||
|
main diagonal are not changed by the algorithm.
|
|||
|
|
|||
|
If the matrix has a unit diagonal, the inverse matrix also has a unit
|
|||
|
diagonal, and the diagonal elements are not passed to the algorithm.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix, array[0..N-1, 0..N-1].
|
|||
|
N - size of matrix A (optional) :
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, size is automatically determined from
|
|||
|
matrix size (A must be square matrix)
|
|||
|
IsUpper - True, if the matrix is upper triangular.
|
|||
|
IsUnit - diagonal type (optional):
|
|||
|
* if True, matrix has unit diagonal (a[i,i] are NOT used)
|
|||
|
* if False, matrix diagonal is arbitrary
|
|||
|
* if not given, False is assumed
|
|||
|
|
|||
|
Output parameters:
|
|||
|
Info - same as for RMatrixLUInverse
|
|||
|
Rep - same as for RMatrixLUInverse
|
|||
|
A - same as for RMatrixLUInverse.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 05.02.2010 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void cmatrixtrinverse(complex_2d_array &a, const ae_int_t n, const bool isupper, const bool isunit, ae_int_t &info, matinvreport &rep);
|
|||
|
void cmatrixtrinverse(complex_2d_array &a, const bool isupper, ae_int_t &info, matinvreport &rep);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function creates sparse matrix in a Hash-Table format.
|
|||
|
|
|||
|
This function creates Hast-Table matrix, which can be converted to CRS
|
|||
|
format after its initialization is over. Typical usage scenario for a
|
|||
|
sparse matrix is:
|
|||
|
1. creation in a Hash-Table format
|
|||
|
2. insertion of the matrix elements
|
|||
|
3. conversion to the CRS representation
|
|||
|
4. matrix is passed to some linear algebra algorithm
|
|||
|
|
|||
|
Some information about different matrix formats can be found below, in
|
|||
|
the "NOTES" section.
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
M - number of rows in a matrix, M>=1
|
|||
|
N - number of columns in a matrix, N>=1
|
|||
|
K - K>=0, expected number of non-zero elements in a matrix.
|
|||
|
K can be inexact approximation, can be less than actual
|
|||
|
number of elements (table will grow when needed) or
|
|||
|
even zero).
|
|||
|
It is important to understand that although hash-table
|
|||
|
may grow automatically, it is better to provide good
|
|||
|
estimate of data size.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in Hash-Table representation.
|
|||
|
All elements of the matrix are zero.
|
|||
|
|
|||
|
NOTE 1.
|
|||
|
|
|||
|
Sparse matrices can be stored using either Hash-Table representation or
|
|||
|
Compressed Row Storage representation. Hast-table is better suited for
|
|||
|
querying and dynamic operations (thus, it is used for matrix
|
|||
|
initialization), but it is inefficient when you want to make some linear
|
|||
|
algebra operations.
|
|||
|
|
|||
|
From the other side, CRS is better suited for linear algebra operations,
|
|||
|
but initialization is less convenient - you have to tell row sizes at the
|
|||
|
initialization, and you can fill matrix only row by row, from left to
|
|||
|
right. CRS is also very inefficient when you want to find matrix element
|
|||
|
by its index.
|
|||
|
|
|||
|
Thus, Hash-Table representation does not support linear algebra
|
|||
|
operations, while CRS format does not support modification of the table.
|
|||
|
Tables below outline information about these two formats:
|
|||
|
|
|||
|
OPERATIONS WITH MATRIX HASH CRS
|
|||
|
create + +
|
|||
|
read element + +
|
|||
|
modify element +
|
|||
|
add value to element +
|
|||
|
A*x (dense vector) +
|
|||
|
A'*x (dense vector) +
|
|||
|
A*X (dense matrix) +
|
|||
|
A'*X (dense matrix) +
|
|||
|
|
|||
|
NOTE 2.
|
|||
|
|
|||
|
Hash-tables use memory inefficiently, and they have to keep some amount
|
|||
|
of the "spare memory" in order to have good performance. Hash table for
|
|||
|
matrix with K non-zero elements will need C*K*(8+2*sizeof(int)) bytes,
|
|||
|
where C is a small constant, about 1.5-2 in magnitude.
|
|||
|
|
|||
|
CRS storage, from the other side, is more memory-efficient, and needs
|
|||
|
just K*(8+sizeof(int))+M*sizeof(int) bytes, where M is a number of rows
|
|||
|
in a matrix.
|
|||
|
|
|||
|
When you convert from the Hash-Table to CRS representation, all unneeded
|
|||
|
memory will be freed.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsecreate(const ae_int_t m, const ae_int_t n, const ae_int_t k, sparsematrix &s);
|
|||
|
void sparsecreate(const ae_int_t m, const ae_int_t n, sparsematrix &s);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function creates sparse matrix in a CRS format (expert function for
|
|||
|
situations when you are running out of memory).
|
|||
|
|
|||
|
This function creates CRS matrix. Typical usage scenario for a CRS matrix
|
|||
|
is:
|
|||
|
1. creation (you have to tell number of non-zero elements at each row at
|
|||
|
this moment)
|
|||
|
2. insertion of the matrix elements (row by row, from left to right)
|
|||
|
3. matrix is passed to some linear algebra algorithm
|
|||
|
|
|||
|
This function is a memory-efficient alternative to SparseCreate(), but it
|
|||
|
is more complex because it requires you to know in advance how large your
|
|||
|
matrix is. Some information about different matrix formats can be found
|
|||
|
below, in the "NOTES" section.
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
M - number of rows in a matrix, M>=1
|
|||
|
N - number of columns in a matrix, N>=1
|
|||
|
NER - number of elements at each row, array[M], NER[I]>=0
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in CRS representation.
|
|||
|
You have to fill ALL non-zero elements by calling
|
|||
|
SparseSet() BEFORE you try to use this matrix.
|
|||
|
|
|||
|
NOTE 1.
|
|||
|
|
|||
|
Sparse matrices can be stored using either Hash-Table representation or
|
|||
|
Compressed Row Storage representation. Hast-table is better suited for
|
|||
|
querying and dynamic operations (thus, it is used for matrix
|
|||
|
initialization), but it is inefficient when you want to make some linear
|
|||
|
algebra operations.
|
|||
|
|
|||
|
From the other side, CRS is better suited for linear algebra operations,
|
|||
|
but initialization is less convenient - you have to tell row sizes at the
|
|||
|
initialization, and you can fill matrix only row by row, from left to
|
|||
|
right. CRS is also very inefficient when you want to find matrix element
|
|||
|
by its index.
|
|||
|
|
|||
|
Thus, Hash-Table representation does not support linear algebra
|
|||
|
operations, while CRS format does not support modification of the table.
|
|||
|
Tables below outline information about these two formats:
|
|||
|
|
|||
|
OPERATIONS WITH MATRIX HASH CRS
|
|||
|
create + +
|
|||
|
read element + +
|
|||
|
modify element +
|
|||
|
add value to element +
|
|||
|
A*x (dense vector) +
|
|||
|
A'*x (dense vector) +
|
|||
|
A*X (dense matrix) +
|
|||
|
A'*X (dense matrix) +
|
|||
|
|
|||
|
NOTE 2.
|
|||
|
|
|||
|
Hash-tables use memory inefficiently, and they have to keep some amount
|
|||
|
of the "spare memory" in order to have good performance. Hash table for
|
|||
|
matrix with K non-zero elements will need C*K*(8+2*sizeof(int)) bytes,
|
|||
|
where C is a small constant, about 1.5-2 in magnitude.
|
|||
|
|
|||
|
CRS storage, from the other side, is more memory-efficient, and needs
|
|||
|
just K*(8+sizeof(int))+M*sizeof(int) bytes, where M is a number of rows
|
|||
|
in a matrix.
|
|||
|
|
|||
|
When you convert from the Hash-Table to CRS representation, all unneeded
|
|||
|
memory will be freed.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsecreatecrs(const ae_int_t m, const ae_int_t n, const integer_1d_array &ner, sparsematrix &s);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function copies S0 to S1.
|
|||
|
|
|||
|
NOTE: this function does not verify its arguments, it just copies all
|
|||
|
fields of the structure.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsecopy(const sparsematrix &s0, sparsematrix &s1);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function adds value to S[i,j] - element of the sparse matrix. Matrix
|
|||
|
must be in a Hash-Table mode.
|
|||
|
|
|||
|
In case S[i,j] already exists in the table, V i added to its value. In
|
|||
|
case S[i,j] is non-existent, it is inserted in the table. Table
|
|||
|
automatically grows when necessary.
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in Hash-Table representation.
|
|||
|
Exception will be thrown for CRS matrix.
|
|||
|
I - row index of the element to modify, 0<=I<M
|
|||
|
J - column index of the element to modify, 0<=J<N
|
|||
|
V - value to add, must be finite number
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
S - modified matrix
|
|||
|
|
|||
|
NOTE 1: when S[i,j] is exactly zero after modification, it is deleted
|
|||
|
from the table.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparseadd(const sparsematrix &s, const ae_int_t i, const ae_int_t j, const double v);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function modifies S[i,j] - element of the sparse matrix.
|
|||
|
|
|||
|
For Hash-based storage format:
|
|||
|
* new value can be zero or non-zero. In case new value of S[i,j] is zero,
|
|||
|
this element is deleted from the table.
|
|||
|
* this function has no effect when called with zero V for non-existent
|
|||
|
element.
|
|||
|
|
|||
|
For CRS-bases storage format:
|
|||
|
* new value MUST be non-zero. Exception will be thrown for zero V.
|
|||
|
* elements must be initialized in correct order - from top row to bottom,
|
|||
|
within row - from left to right.
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in Hash-Table or CRS representation.
|
|||
|
I - row index of the element to modify, 0<=I<M
|
|||
|
J - column index of the element to modify, 0<=J<N
|
|||
|
V - value to set, must be finite number, can be zero
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
S - modified matrix
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparseset(const sparsematrix &s, const ae_int_t i, const ae_int_t j, const double v);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function returns S[i,j] - element of the sparse matrix. Matrix can
|
|||
|
be in any mode (Hash-Table or CRS), but this function is less efficient
|
|||
|
for CRS matrices. Hash-Table matrices can find element in O(1) time,
|
|||
|
while CRS matrices need O(log(RS)) time, where RS is an number of non-
|
|||
|
zero elements in a row.
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in Hash-Table representation.
|
|||
|
Exception will be thrown for CRS matrix.
|
|||
|
I - row index of the element to modify, 0<=I<M
|
|||
|
J - column index of the element to modify, 0<=J<N
|
|||
|
|
|||
|
RESULT
|
|||
|
value of S[I,J] or zero (in case no element with such index is found)
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
double sparseget(const sparsematrix &s, const ae_int_t i, const ae_int_t j);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function returns I-th diagonal element of the sparse matrix.
|
|||
|
|
|||
|
Matrix can be in any mode (Hash-Table or CRS storage), but this function
|
|||
|
is most efficient for CRS matrices - it requires less than 50 CPU cycles
|
|||
|
to extract diagonal element. For Hash-Table matrices we still have O(1)
|
|||
|
query time, but function is many times slower.
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in Hash-Table representation.
|
|||
|
Exception will be thrown for CRS matrix.
|
|||
|
I - index of the element to modify, 0<=I<min(M,N)
|
|||
|
|
|||
|
RESULT
|
|||
|
value of S[I,I] or zero (in case no element with such index is found)
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
double sparsegetdiagonal(const sparsematrix &s, const ae_int_t i);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function converts matrix to CRS format.
|
|||
|
|
|||
|
Some algorithms (linear algebra ones, for example) require matrices in
|
|||
|
CRS format.
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in any format
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
S - matrix in CRS format
|
|||
|
|
|||
|
NOTE: this function has no effect when called with matrix which is
|
|||
|
already in CRS mode.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparseconverttocrs(const sparsematrix &s);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function calculates matrix-vector product S*x. Matrix S must be
|
|||
|
stored in CRS format (exception will be thrown otherwise).
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in CRS format (you MUST convert it
|
|||
|
to CRS before calling this function).
|
|||
|
X - array[N], input vector. For performance reasons we
|
|||
|
make only quick checks - we check that array size is
|
|||
|
at least N, but we do not check for NAN's or INF's.
|
|||
|
Y - output buffer, possibly preallocated. In case buffer
|
|||
|
size is too small to store result, this buffer is
|
|||
|
automatically resized.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
Y - array[M], S*x
|
|||
|
|
|||
|
NOTE: this function throws exception when called for non-CRS matrix. You
|
|||
|
must convert your matrix with SparseConvertToCRS() before using this
|
|||
|
function.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsemv(const sparsematrix &s, const real_1d_array &x, real_1d_array &y);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function calculates matrix-vector product S^T*x. Matrix S must be
|
|||
|
stored in CRS format (exception will be thrown otherwise).
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in CRS format (you MUST convert it
|
|||
|
to CRS before calling this function).
|
|||
|
X - array[M], input vector. For performance reasons we
|
|||
|
make only quick checks - we check that array size is
|
|||
|
at least M, but we do not check for NAN's or INF's.
|
|||
|
Y - output buffer, possibly preallocated. In case buffer
|
|||
|
size is too small to store result, this buffer is
|
|||
|
automatically resized.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
Y - array[N], S^T*x
|
|||
|
|
|||
|
NOTE: this function throws exception when called for non-CRS matrix. You
|
|||
|
must convert your matrix with SparseConvertToCRS() before using this
|
|||
|
function.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsemtv(const sparsematrix &s, const real_1d_array &x, real_1d_array &y);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function simultaneously calculates two matrix-vector products:
|
|||
|
S*x and S^T*x.
|
|||
|
S must be square (non-rectangular) matrix stored in CRS format (exception
|
|||
|
will be thrown otherwise).
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse N*N matrix in CRS format (you MUST convert it
|
|||
|
to CRS before calling this function).
|
|||
|
X - array[N], input vector. For performance reasons we
|
|||
|
make only quick checks - we check that array size is
|
|||
|
at least N, but we do not check for NAN's or INF's.
|
|||
|
Y0 - output buffer, possibly preallocated. In case buffer
|
|||
|
size is too small to store result, this buffer is
|
|||
|
automatically resized.
|
|||
|
Y1 - output buffer, possibly preallocated. In case buffer
|
|||
|
size is too small to store result, this buffer is
|
|||
|
automatically resized.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
Y0 - array[N], S*x
|
|||
|
Y1 - array[N], S^T*x
|
|||
|
|
|||
|
NOTE: this function throws exception when called for non-CRS matrix. You
|
|||
|
must convert your matrix with SparseConvertToCRS() before using this
|
|||
|
function. It also throws exception when S is non-square.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsemv2(const sparsematrix &s, const real_1d_array &x, real_1d_array &y0, real_1d_array &y1);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function calculates matrix-vector product S*x, when S is symmetric
|
|||
|
matrix. Matrix S must be stored in CRS format (exception will be
|
|||
|
thrown otherwise).
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*M matrix in CRS format (you MUST convert it
|
|||
|
to CRS before calling this function).
|
|||
|
IsUpper - whether upper or lower triangle of S is given:
|
|||
|
* if upper triangle is given, only S[i,j] for j>=i
|
|||
|
are used, and lower triangle is ignored (it can be
|
|||
|
empty - these elements are not referenced at all).
|
|||
|
* if lower triangle is given, only S[i,j] for j<=i
|
|||
|
are used, and upper triangle is ignored.
|
|||
|
X - array[N], input vector. For performance reasons we
|
|||
|
make only quick checks - we check that array size is
|
|||
|
at least N, but we do not check for NAN's or INF's.
|
|||
|
Y - output buffer, possibly preallocated. In case buffer
|
|||
|
size is too small to store result, this buffer is
|
|||
|
automatically resized.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
Y - array[M], S*x
|
|||
|
|
|||
|
NOTE: this function throws exception when called for non-CRS matrix. You
|
|||
|
must convert your matrix with SparseConvertToCRS() before using this
|
|||
|
function.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsesmv(const sparsematrix &s, const bool isupper, const real_1d_array &x, real_1d_array &y);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function calculates matrix-matrix product S*A. Matrix S must be
|
|||
|
stored in CRS format (exception will be thrown otherwise).
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in CRS format (you MUST convert it
|
|||
|
to CRS before calling this function).
|
|||
|
A - array[N][K], input dense matrix. For performance reasons
|
|||
|
we make only quick checks - we check that array size
|
|||
|
is at least N, but we do not check for NAN's or INF's.
|
|||
|
K - number of columns of matrix (A).
|
|||
|
B - output buffer, possibly preallocated. In case buffer
|
|||
|
size is too small to store result, this buffer is
|
|||
|
automatically resized.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
B - array[M][K], S*A
|
|||
|
|
|||
|
NOTE: this function throws exception when called for non-CRS matrix. You
|
|||
|
must convert your matrix with SparseConvertToCRS() before using this
|
|||
|
function.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsemm(const sparsematrix &s, const real_2d_array &a, const ae_int_t k, real_2d_array &b);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function calculates matrix-matrix product S^T*A. Matrix S must be
|
|||
|
stored in CRS format (exception will be thrown otherwise).
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in CRS format (you MUST convert it
|
|||
|
to CRS before calling this function).
|
|||
|
A - array[M][K], input dense matrix. For performance reasons
|
|||
|
we make only quick checks - we check that array size is
|
|||
|
at least M, but we do not check for NAN's or INF's.
|
|||
|
K - number of columns of matrix (A).
|
|||
|
B - output buffer, possibly preallocated. In case buffer
|
|||
|
size is too small to store result, this buffer is
|
|||
|
automatically resized.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
B - array[N][K], S^T*A
|
|||
|
|
|||
|
NOTE: this function throws exception when called for non-CRS matrix. You
|
|||
|
must convert your matrix with SparseConvertToCRS() before using this
|
|||
|
function.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsemtm(const sparsematrix &s, const real_2d_array &a, const ae_int_t k, real_2d_array &b);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function simultaneously calculates two matrix-matrix products:
|
|||
|
S*A and S^T*A.
|
|||
|
S must be square (non-rectangular) matrix stored in CRS format (exception
|
|||
|
will be thrown otherwise).
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse N*N matrix in CRS format (you MUST convert it
|
|||
|
to CRS before calling this function).
|
|||
|
A - array[N][K], input dense matrix. For performance reasons
|
|||
|
we make only quick checks - we check that array size is
|
|||
|
at least N, but we do not check for NAN's or INF's.
|
|||
|
K - number of columns of matrix (A).
|
|||
|
B0 - output buffer, possibly preallocated. In case buffer
|
|||
|
size is too small to store result, this buffer is
|
|||
|
automatically resized.
|
|||
|
B1 - output buffer, possibly preallocated. In case buffer
|
|||
|
size is too small to store result, this buffer is
|
|||
|
automatically resized.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
B0 - array[N][K], S*A
|
|||
|
B1 - array[N][K], S^T*A
|
|||
|
|
|||
|
NOTE: this function throws exception when called for non-CRS matrix. You
|
|||
|
must convert your matrix with SparseConvertToCRS() before using this
|
|||
|
function. It also throws exception when S is non-square.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsemm2(const sparsematrix &s, const real_2d_array &a, const ae_int_t k, real_2d_array &b0, real_2d_array &b1);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function calculates matrix-matrix product S*A, when S is symmetric
|
|||
|
matrix. Matrix S must be stored in CRS format (exception will be
|
|||
|
thrown otherwise).
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*M matrix in CRS format (you MUST convert it
|
|||
|
to CRS before calling this function).
|
|||
|
IsUpper - whether upper or lower triangle of S is given:
|
|||
|
* if upper triangle is given, only S[i,j] for j>=i
|
|||
|
are used, and lower triangle is ignored (it can be
|
|||
|
empty - these elements are not referenced at all).
|
|||
|
* if lower triangle is given, only S[i,j] for j<=i
|
|||
|
are used, and upper triangle is ignored.
|
|||
|
A - array[N][K], input dense matrix. For performance reasons
|
|||
|
we make only quick checks - we check that array size is
|
|||
|
at least N, but we do not check for NAN's or INF's.
|
|||
|
K - number of columns of matrix (A).
|
|||
|
B - output buffer, possibly preallocated. In case buffer
|
|||
|
size is too small to store result, this buffer is
|
|||
|
automatically resized.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
B - array[M][K], S*A
|
|||
|
|
|||
|
NOTE: this function throws exception when called for non-CRS matrix. You
|
|||
|
must convert your matrix with SparseConvertToCRS() before using this
|
|||
|
function.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsesmm(const sparsematrix &s, const bool isupper, const real_2d_array &a, const ae_int_t k, real_2d_array &b);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This procedure resizes Hash-Table matrix. It can be called when you have
|
|||
|
deleted too many elements from the matrix, and you want to free unneeded
|
|||
|
memory.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.10.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparseresizematrix(const sparsematrix &s);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function is used to enumerate all elements of the sparse matrix.
|
|||
|
Before first call user initializes T0 and T1 counters by zero. These
|
|||
|
counters are used to remember current position in a matrix; after each
|
|||
|
call they are updated by the function.
|
|||
|
|
|||
|
Subsequent calls to this function return non-zero elements of the sparse
|
|||
|
matrix, one by one. If you enumerate CRS matrix, matrix is traversed from
|
|||
|
left to right, from top to bottom. In case you enumerate matrix stored as
|
|||
|
Hash table, elements are returned in random order.
|
|||
|
|
|||
|
EXAMPLE
|
|||
|
> T0=0
|
|||
|
> T1=0
|
|||
|
> while SparseEnumerate(S,T0,T1,I,J,V) do
|
|||
|
> ....do something with I,J,V
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in Hash-Table or CRS representation.
|
|||
|
T0 - internal counter
|
|||
|
T1 - internal counter
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
T0 - new value of the internal counter
|
|||
|
T1 - new value of the internal counter
|
|||
|
I - row index of non-zero element, 0<=I<M.
|
|||
|
J - column index of non-zero element, 0<=J<N
|
|||
|
V - value of the T-th element
|
|||
|
|
|||
|
RESULT
|
|||
|
True in case of success (next non-zero element was retrieved)
|
|||
|
False in case all non-zero elements were enumerated
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.03.2012 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool sparseenumerate(const sparsematrix &s, ae_int_t &t0, ae_int_t &t1, ae_int_t &i, ae_int_t &j, double &v);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function rewrites existing (non-zero) element. It returns True if
|
|||
|
element exists or False, when it is called for non-existing (zero)
|
|||
|
element.
|
|||
|
|
|||
|
The purpose of this function is to provide convenient thread-safe way to
|
|||
|
modify sparse matrix. Such modification (already existing element is
|
|||
|
rewritten) is guaranteed to be thread-safe without any synchronization, as
|
|||
|
long as different threads modify different elements.
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse M*N matrix in Hash-Table or CRS representation.
|
|||
|
I - row index of non-zero element to modify, 0<=I<M
|
|||
|
J - column index of non-zero element to modify, 0<=J<N
|
|||
|
V - value to rewrite, must be finite number
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
S - modified matrix
|
|||
|
RESULT
|
|||
|
True in case when element exists
|
|||
|
False in case when element doesn't exist or it is zero
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 14.03.2012 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool sparserewriteexisting(const sparsematrix &s, const ae_int_t i, const ae_int_t j, const double v);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function returns I-th row of the sparse matrix stored in CRS format.
|
|||
|
|
|||
|
NOTE: when incorrect I (outside of [0,M-1]) or matrix (non-CRS) are
|
|||
|
passed, this function throws exception.
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
S - sparse M*N matrix in CRS format
|
|||
|
I - row index, 0<=I<M
|
|||
|
IRow - output buffer, can be preallocated. In case buffer
|
|||
|
size is too small to store I-th row, it is
|
|||
|
automatically reallocated.
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
IRow - array[M], I-th row.
|
|||
|
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 20.07.2012 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsegetrow(const sparsematrix &s, const ae_int_t i, real_1d_array &irow);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function performs in-place conversion from CRS format to Hash table
|
|||
|
storage.
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S - sparse matrix in CRS format.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
S - sparse matrix in Hash table format.
|
|||
|
|
|||
|
NOTE: this function has no effect when called with matrix which is
|
|||
|
already in Hash table mode.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 20.07.2012 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparseconverttohash(const sparsematrix &s);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function performs out-of-place conversion to Hash table storage
|
|||
|
format. S0 is copied to S1 and converted on-the-fly.
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S0 - sparse matrix in any format.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
S1 - sparse matrix in Hash table format.
|
|||
|
|
|||
|
NOTE: if S0 is stored as Hash-table, it is just copied without conversion.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 20.07.2012 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsecopytohash(const sparsematrix &s0, sparsematrix &s1);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function performs out-of-place conversion to CRS format. S0 is
|
|||
|
copied to S1 and converted on-the-fly.
|
|||
|
|
|||
|
INPUT PARAMETERS
|
|||
|
S0 - sparse matrix in any format.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
S1 - sparse matrix in CRS format.
|
|||
|
|
|||
|
NOTE: if S0 is stored as CRS, it is just copied without conversion.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 20.07.2012 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsecopytocrs(const sparsematrix &s0, sparsematrix &s1);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function returns type of the matrix storage format.
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
S - sparse matrix.
|
|||
|
|
|||
|
RESULT:
|
|||
|
sparse storage format used by matrix:
|
|||
|
0 - Hash-table
|
|||
|
1 - CRS-format
|
|||
|
|
|||
|
NOTE: future versions of ALGLIB may include additional sparse storage
|
|||
|
formats.
|
|||
|
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 20.07.2012 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
ae_int_t sparsegetmatrixtype(const sparsematrix &s);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function checks matrix storage format and returns True when matrix is
|
|||
|
stored using Hash table representation.
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
S - sparse matrix.
|
|||
|
|
|||
|
RESULT:
|
|||
|
True if matrix type is Hash table
|
|||
|
False if matrix type is not Hash table
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 20.07.2012 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool sparseishash(const sparsematrix &s);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function checks matrix storage format and returns True when matrix is
|
|||
|
stored using CRS representation.
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
S - sparse matrix.
|
|||
|
|
|||
|
RESULT:
|
|||
|
True if matrix type is CRS
|
|||
|
False if matrix type is not CRS
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 20.07.2012 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool sparseiscrs(const sparsematrix &s);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
The function frees all memory occupied by sparse matrix. Sparse matrix
|
|||
|
structure becomes unusable after this call.
|
|||
|
|
|||
|
OUTPUT PARAMETERS
|
|||
|
S - sparse matrix to delete
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 24.07.2012 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void sparsefree(sparsematrix &s);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
The function returns number of rows of a sparse matrix.
|
|||
|
|
|||
|
RESULT: number of rows of a sparse matrix.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 23.08.2012 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
ae_int_t sparsegetnrows(const sparsematrix &s);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
The function returns number of columns of a sparse matrix.
|
|||
|
|
|||
|
RESULT: number of columns of a sparse matrix.
|
|||
|
|
|||
|
-- ALGLIB PROJECT --
|
|||
|
Copyright 23.08.2012 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
ae_int_t sparsegetncols(const sparsematrix &s);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This procedure initializes matrix norm estimator.
|
|||
|
|
|||
|
USAGE:
|
|||
|
1. User initializes algorithm state with NormEstimatorCreate() call
|
|||
|
2. User calls NormEstimatorEstimateSparse() (or NormEstimatorIteration())
|
|||
|
3. User calls NormEstimatorResults() to get solution.
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
M - number of rows in the matrix being estimated, M>0
|
|||
|
N - number of columns in the matrix being estimated, N>0
|
|||
|
NStart - number of random starting vectors
|
|||
|
recommended value - at least 5.
|
|||
|
NIts - number of iterations to do with best starting vector
|
|||
|
recommended value - at least 5.
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
State - structure which stores algorithm state
|
|||
|
|
|||
|
|
|||
|
NOTE: this algorithm is effectively deterministic, i.e. it always returns
|
|||
|
same result when repeatedly called for the same matrix. In fact, algorithm
|
|||
|
uses randomized starting vectors, but internal random numbers generator
|
|||
|
always generates same sequence of the random values (it is a feature, not
|
|||
|
bug).
|
|||
|
|
|||
|
Algorithm can be made non-deterministic with NormEstimatorSetSeed(0) call.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 06.12.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void normestimatorcreate(const ae_int_t m, const ae_int_t n, const ae_int_t nstart, const ae_int_t nits, normestimatorstate &state);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function changes seed value used by algorithm. In some cases we need
|
|||
|
deterministic processing, i.e. subsequent calls must return equal results,
|
|||
|
in other cases we need non-deterministic algorithm which returns different
|
|||
|
results for the same matrix on every pass.
|
|||
|
|
|||
|
Setting zero seed will lead to non-deterministic algorithm, while non-zero
|
|||
|
value will make our algorithm deterministic.
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
State - norm estimator state, must be initialized with a call
|
|||
|
to NormEstimatorCreate()
|
|||
|
SeedVal - seed value, >=0. Zero value = non-deterministic algo.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 06.12.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void normestimatorsetseed(const normestimatorstate &state, const ae_int_t seedval);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
This function estimates norm of the sparse M*N matrix A.
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
State - norm estimator state, must be initialized with a call
|
|||
|
to NormEstimatorCreate()
|
|||
|
A - sparse M*N matrix, must be converted to CRS format
|
|||
|
prior to calling this function.
|
|||
|
|
|||
|
After this function is over you can call NormEstimatorResults() to get
|
|||
|
estimate of the norm(A).
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 06.12.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void normestimatorestimatesparse(const normestimatorstate &state, const sparsematrix &a);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Matrix norm estimation results
|
|||
|
|
|||
|
INPUT PARAMETERS:
|
|||
|
State - algorithm state
|
|||
|
|
|||
|
OUTPUT PARAMETERS:
|
|||
|
Nrm - estimate of the matrix norm, Nrm>=0
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 06.12.2011 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void normestimatorresults(const normestimatorstate &state, double &nrm);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Determinant calculation of the matrix given by its LU decomposition.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - LU decomposition of the matrix (output of
|
|||
|
RMatrixLU subroutine).
|
|||
|
Pivots - table of permutations which were made during
|
|||
|
the LU decomposition.
|
|||
|
Output of RMatrixLU subroutine.
|
|||
|
N - (optional) size of matrix A:
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, automatically determined from matrix size
|
|||
|
(A must be square matrix)
|
|||
|
|
|||
|
Result: matrix determinant.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
double rmatrixludet(const real_2d_array &a, const integer_1d_array &pivots, const ae_int_t n);
|
|||
|
double rmatrixludet(const real_2d_array &a, const integer_1d_array &pivots);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Calculation of the determinant of a general matrix
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix, array[0..N-1, 0..N-1]
|
|||
|
N - (optional) size of matrix A:
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, automatically determined from matrix size
|
|||
|
(A must be square matrix)
|
|||
|
|
|||
|
Result: determinant of matrix A.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
double rmatrixdet(const real_2d_array &a, const ae_int_t n);
|
|||
|
double rmatrixdet(const real_2d_array &a);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Determinant calculation of the matrix given by its LU decomposition.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - LU decomposition of the matrix (output of
|
|||
|
RMatrixLU subroutine).
|
|||
|
Pivots - table of permutations which were made during
|
|||
|
the LU decomposition.
|
|||
|
Output of RMatrixLU subroutine.
|
|||
|
N - (optional) size of matrix A:
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, automatically determined from matrix size
|
|||
|
(A must be square matrix)
|
|||
|
|
|||
|
Result: matrix determinant.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
alglib::complex cmatrixludet(const complex_2d_array &a, const integer_1d_array &pivots, const ae_int_t n);
|
|||
|
alglib::complex cmatrixludet(const complex_2d_array &a, const integer_1d_array &pivots);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Calculation of the determinant of a general matrix
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix, array[0..N-1, 0..N-1]
|
|||
|
N - (optional) size of matrix A:
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, automatically determined from matrix size
|
|||
|
(A must be square matrix)
|
|||
|
|
|||
|
Result: determinant of matrix A.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
alglib::complex cmatrixdet(const complex_2d_array &a, const ae_int_t n);
|
|||
|
alglib::complex cmatrixdet(const complex_2d_array &a);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Determinant calculation of the matrix given by the Cholesky decomposition.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - Cholesky decomposition,
|
|||
|
output of SMatrixCholesky subroutine.
|
|||
|
N - (optional) size of matrix A:
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, automatically determined from matrix size
|
|||
|
(A must be square matrix)
|
|||
|
|
|||
|
As the determinant is equal to the product of squares of diagonal elements,
|
|||
|
it<EFBFBD>s not necessary to specify which triangle - lower or upper - the matrix
|
|||
|
is stored in.
|
|||
|
|
|||
|
Result:
|
|||
|
matrix determinant.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005-2008 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
double spdmatrixcholeskydet(const real_2d_array &a, const ae_int_t n);
|
|||
|
double spdmatrixcholeskydet(const real_2d_array &a);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Determinant calculation of the symmetric positive definite matrix.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix. Array with elements [0..N-1, 0..N-1].
|
|||
|
N - (optional) size of matrix A:
|
|||
|
* if given, only principal NxN submatrix is processed and
|
|||
|
overwritten. other elements are unchanged.
|
|||
|
* if not given, automatically determined from matrix size
|
|||
|
(A must be square matrix)
|
|||
|
IsUpper - (optional) storage type:
|
|||
|
* if True, symmetric matrix A is given by its upper
|
|||
|
triangle, and the lower triangle isn<EFBFBD>t used/changed by
|
|||
|
function
|
|||
|
* if False, symmetric matrix A is given by its lower
|
|||
|
triangle, and the upper triangle isn<EFBFBD>t used/changed by
|
|||
|
function
|
|||
|
* if not given, both lower and upper triangles must be
|
|||
|
filled.
|
|||
|
|
|||
|
Result:
|
|||
|
determinant of matrix A.
|
|||
|
If matrix A is not positive definite, exception is thrown.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005-2008 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
double spdmatrixdet(const real_2d_array &a, const ae_int_t n, const bool isupper);
|
|||
|
double spdmatrixdet(const real_2d_array &a);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Algorithm for solving the following generalized symmetric positive-definite
|
|||
|
eigenproblem:
|
|||
|
A*x = lambda*B*x (1) or
|
|||
|
A*B*x = lambda*x (2) or
|
|||
|
B*A*x = lambda*x (3).
|
|||
|
where A is a symmetric matrix, B - symmetric positive-definite matrix.
|
|||
|
The problem is solved by reducing it to an ordinary symmetric eigenvalue
|
|||
|
problem.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - symmetric matrix which is given by its upper or lower
|
|||
|
triangular part.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrices A and B.
|
|||
|
IsUpperA - storage format of matrix A.
|
|||
|
B - symmetric positive-definite matrix which is given by
|
|||
|
its upper or lower triangular part.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
IsUpperB - storage format of matrix B.
|
|||
|
ZNeeded - if ZNeeded is equal to:
|
|||
|
* 0, the eigenvectors are not returned;
|
|||
|
* 1, the eigenvectors are returned.
|
|||
|
ProblemType - if ProblemType is equal to:
|
|||
|
* 1, the following problem is solved: A*x = lambda*B*x;
|
|||
|
* 2, the following problem is solved: A*B*x = lambda*x;
|
|||
|
* 3, the following problem is solved: B*A*x = lambda*x.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
D - eigenvalues in ascending order.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
Z - if ZNeeded is equal to:
|
|||
|
* 0, Z hasn<EFBFBD>t changed;
|
|||
|
* 1, Z contains eigenvectors.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
The eigenvectors are stored in matrix columns. It should
|
|||
|
be noted that the eigenvectors in such problems do not
|
|||
|
form an orthogonal system.
|
|||
|
|
|||
|
Result:
|
|||
|
True, if the problem was solved successfully.
|
|||
|
False, if the error occurred during the Cholesky decomposition of matrix
|
|||
|
B (the matrix isn<EFBFBD>t positive-definite) or during the work of the iterative
|
|||
|
algorithm for solving the symmetric eigenproblem.
|
|||
|
|
|||
|
See also the GeneralizedSymmetricDefiniteEVDReduce subroutine.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 1.28.2006 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool smatrixgevd(const real_2d_array &a, const ae_int_t n, const bool isuppera, const real_2d_array &b, const bool isupperb, const ae_int_t zneeded, const ae_int_t problemtype, real_1d_array &d, real_2d_array &z);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Algorithm for reduction of the following generalized symmetric positive-
|
|||
|
definite eigenvalue problem:
|
|||
|
A*x = lambda*B*x (1) or
|
|||
|
A*B*x = lambda*x (2) or
|
|||
|
B*A*x = lambda*x (3)
|
|||
|
to the symmetric eigenvalues problem C*y = lambda*y (eigenvalues of this and
|
|||
|
the given problems are the same, and the eigenvectors of the given problem
|
|||
|
could be obtained by multiplying the obtained eigenvectors by the
|
|||
|
transformation matrix x = R*y).
|
|||
|
|
|||
|
Here A is a symmetric matrix, B - symmetric positive-definite matrix.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - symmetric matrix which is given by its upper or lower
|
|||
|
triangular part.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrices A and B.
|
|||
|
IsUpperA - storage format of matrix A.
|
|||
|
B - symmetric positive-definite matrix which is given by
|
|||
|
its upper or lower triangular part.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
IsUpperB - storage format of matrix B.
|
|||
|
ProblemType - if ProblemType is equal to:
|
|||
|
* 1, the following problem is solved: A*x = lambda*B*x;
|
|||
|
* 2, the following problem is solved: A*B*x = lambda*x;
|
|||
|
* 3, the following problem is solved: B*A*x = lambda*x.
|
|||
|
|
|||
|
Output parameters:
|
|||
|
A - symmetric matrix which is given by its upper or lower
|
|||
|
triangle depending on IsUpperA. Contains matrix C.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
R - upper triangular or low triangular transformation matrix
|
|||
|
which is used to obtain the eigenvectors of a given problem
|
|||
|
as the product of eigenvectors of C (from the right) and
|
|||
|
matrix R (from the left). If the matrix is upper
|
|||
|
triangular, the elements below the main diagonal
|
|||
|
are equal to 0 (and vice versa). Thus, we can perform
|
|||
|
the multiplication without taking into account the
|
|||
|
internal structure (which is an easier though less
|
|||
|
effective way).
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
IsUpperR - type of matrix R (upper or lower triangular).
|
|||
|
|
|||
|
Result:
|
|||
|
True, if the problem was reduced successfully.
|
|||
|
False, if the error occurred during the Cholesky decomposition of
|
|||
|
matrix B (the matrix is not positive-definite).
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 1.28.2006 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
bool smatrixgevdreduce(real_2d_array &a, const ae_int_t n, const bool isuppera, const real_2d_array &b, const bool isupperb, const ae_int_t problemtype, real_2d_array &r, bool &isupperr);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Inverse matrix update by the Sherman-Morrison formula
|
|||
|
|
|||
|
The algorithm updates matrix A^-1 when adding a number to an element
|
|||
|
of matrix A.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
InvA - inverse of matrix A.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
UpdRow - row where the element to be updated is stored.
|
|||
|
UpdColumn - column where the element to be updated is stored.
|
|||
|
UpdVal - a number to be added to the element.
|
|||
|
|
|||
|
|
|||
|
Output parameters:
|
|||
|
InvA - inverse of modified matrix A.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixinvupdatesimple(real_2d_array &inva, const ae_int_t n, const ae_int_t updrow, const ae_int_t updcolumn, const double updval);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Inverse matrix update by the Sherman-Morrison formula
|
|||
|
|
|||
|
The algorithm updates matrix A^-1 when adding a vector to a row
|
|||
|
of matrix A.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
InvA - inverse of matrix A.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
UpdRow - the row of A whose vector V was added.
|
|||
|
0 <= Row <= N-1
|
|||
|
V - the vector to be added to a row.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
|
|||
|
Output parameters:
|
|||
|
InvA - inverse of modified matrix A.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixinvupdaterow(real_2d_array &inva, const ae_int_t n, const ae_int_t updrow, const real_1d_array &v);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Inverse matrix update by the Sherman-Morrison formula
|
|||
|
|
|||
|
The algorithm updates matrix A^-1 when adding a vector to a column
|
|||
|
of matrix A.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
InvA - inverse of matrix A.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
UpdColumn - the column of A whose vector U was added.
|
|||
|
0 <= UpdColumn <= N-1
|
|||
|
U - the vector to be added to a column.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
|
|||
|
Output parameters:
|
|||
|
InvA - inverse of modified matrix A.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixinvupdatecolumn(real_2d_array &inva, const ae_int_t n, const ae_int_t updcolumn, const real_1d_array &u);
|
|||
|
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Inverse matrix update by the Sherman-Morrison formula
|
|||
|
|
|||
|
The algorithm computes the inverse of matrix A+u*v<EFBFBD> by using the given matrix
|
|||
|
A^-1 and the vectors u and v.
|
|||
|
|
|||
|
Input parameters:
|
|||
|
InvA - inverse of matrix A.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of matrix A.
|
|||
|
U - the vector modifying the matrix.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
V - the vector modifying the matrix.
|
|||
|
Array whose index ranges within [0..N-1].
|
|||
|
|
|||
|
Output parameters:
|
|||
|
InvA - inverse of matrix A + u*v'.
|
|||
|
|
|||
|
-- ALGLIB --
|
|||
|
Copyright 2005 by Bochkanov Sergey
|
|||
|
*************************************************************************/
|
|||
|
void rmatrixinvupdateuv(real_2d_array &inva, const ae_int_t n, const real_1d_array &u, const real_1d_array &v);
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Subroutine performing the Schur decomposition of a general matrix by using
|
|||
|
the QR algorithm with multiple shifts.
|
|||
|
|
|||
|
The source matrix A is represented as S'*A*S = T, where S is an orthogonal
|
|||
|
matrix (Schur vectors), T - upper quasi-triangular matrix (with blocks of
|
|||
|
sizes 1x1 and 2x2 on the main diagonal).
|
|||
|
|
|||
|
Input parameters:
|
|||
|
A - matrix to be decomposed.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
N - size of A, N>=0.
|
|||
|
|
|||
|
|
|||
|
Output parameters:
|
|||
|
A - contains matrix T.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
S - contains Schur vectors.
|
|||
|
Array whose indexes range within [0..N-1, 0..N-1].
|
|||
|
|
|||
|
Note 1:
|
|||
|
The block structure of matrix T can be easily recognized: since all
|
|||
|
the elements below the blocks are zeros, the elements a[i+1,i] which
|
|||
|
are equal to 0 show the block border.
|
|||
|
|
|||
|
Note 2:
|
|||
|
The algorithm performance depends on the value of the internal parameter
|
|||
|
NS of the InternalSchurDecomposition subroutine which defines the number
|
|||
|
of shifts in the QR algorithm (similarly to the block width in block-matrix
|
|||
|
algorithms in linear algebra). If you require maximum performance on
|
|||
|
your machine, it is recommended to adjust this parameter manually.
|
|||
|
|
|||
|
Result:
|
|||
|
True,
|
|||
|
if the algorithm has converged and parameters A and S contain the result.
|
|||
|
False,
|
|||
|
if the algorithm has not converged.
|
|||
|
|
|||
|
Algorithm implemented on the basis of the DHSEQR subroutine (LAPACK 3.0 library).
|
|||
|
*************************************************************************/
|
|||
|
bool rmatrixschur(real_2d_array &a, const ae_int_t n, real_2d_array &s);
|
|||
|
}
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// THIS SECTION CONTAINS COMPUTATIONAL CORE DECLARATIONS (FUNCTIONS)
|
|||
|
//
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
namespace alglib_impl
|
|||
|
{
|
|||
|
void ablassplitlength(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t* n1,
|
|||
|
ae_int_t* n2,
|
|||
|
ae_state *_state);
|
|||
|
void ablascomplexsplitlength(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t* n1,
|
|||
|
ae_int_t* n2,
|
|||
|
ae_state *_state);
|
|||
|
ae_int_t ablasblocksize(/* Real */ ae_matrix* a, ae_state *_state);
|
|||
|
ae_int_t ablascomplexblocksize(/* Complex */ ae_matrix* a,
|
|||
|
ae_state *_state);
|
|||
|
ae_int_t ablasmicroblocksize(ae_state *_state);
|
|||
|
void cmatrixtranspose(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
/* Complex */ ae_matrix* b,
|
|||
|
ae_int_t ib,
|
|||
|
ae_int_t jb,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixtranspose(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
/* Real */ ae_matrix* b,
|
|||
|
ae_int_t ib,
|
|||
|
ae_int_t jb,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixenforcesymmetricity(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixcopy(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
/* Complex */ ae_matrix* b,
|
|||
|
ae_int_t ib,
|
|||
|
ae_int_t jb,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixcopy(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
/* Real */ ae_matrix* b,
|
|||
|
ae_int_t ib,
|
|||
|
ae_int_t jb,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixrank1(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
/* Complex */ ae_vector* u,
|
|||
|
ae_int_t iu,
|
|||
|
/* Complex */ ae_vector* v,
|
|||
|
ae_int_t iv,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixrank1(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
/* Real */ ae_vector* u,
|
|||
|
ae_int_t iu,
|
|||
|
/* Real */ ae_vector* v,
|
|||
|
ae_int_t iv,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixmv(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
ae_int_t opa,
|
|||
|
/* Complex */ ae_vector* x,
|
|||
|
ae_int_t ix,
|
|||
|
/* Complex */ ae_vector* y,
|
|||
|
ae_int_t iy,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixmv(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
ae_int_t opa,
|
|||
|
/* Real */ ae_vector* x,
|
|||
|
ae_int_t ix,
|
|||
|
/* Real */ ae_vector* y,
|
|||
|
ae_int_t iy,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixrighttrsm(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t i1,
|
|||
|
ae_int_t j1,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_int_t optype,
|
|||
|
/* Complex */ ae_matrix* x,
|
|||
|
ae_int_t i2,
|
|||
|
ae_int_t j2,
|
|||
|
ae_state *_state);
|
|||
|
void _pexec_cmatrixrighttrsm(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t i1,
|
|||
|
ae_int_t j1,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_int_t optype,
|
|||
|
/* Complex */ ae_matrix* x,
|
|||
|
ae_int_t i2,
|
|||
|
ae_int_t j2, ae_state *_state);
|
|||
|
void cmatrixlefttrsm(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t i1,
|
|||
|
ae_int_t j1,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_int_t optype,
|
|||
|
/* Complex */ ae_matrix* x,
|
|||
|
ae_int_t i2,
|
|||
|
ae_int_t j2,
|
|||
|
ae_state *_state);
|
|||
|
void _pexec_cmatrixlefttrsm(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t i1,
|
|||
|
ae_int_t j1,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_int_t optype,
|
|||
|
/* Complex */ ae_matrix* x,
|
|||
|
ae_int_t i2,
|
|||
|
ae_int_t j2, ae_state *_state);
|
|||
|
void rmatrixrighttrsm(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t i1,
|
|||
|
ae_int_t j1,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_int_t optype,
|
|||
|
/* Real */ ae_matrix* x,
|
|||
|
ae_int_t i2,
|
|||
|
ae_int_t j2,
|
|||
|
ae_state *_state);
|
|||
|
void _pexec_rmatrixrighttrsm(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t i1,
|
|||
|
ae_int_t j1,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_int_t optype,
|
|||
|
/* Real */ ae_matrix* x,
|
|||
|
ae_int_t i2,
|
|||
|
ae_int_t j2, ae_state *_state);
|
|||
|
void rmatrixlefttrsm(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t i1,
|
|||
|
ae_int_t j1,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_int_t optype,
|
|||
|
/* Real */ ae_matrix* x,
|
|||
|
ae_int_t i2,
|
|||
|
ae_int_t j2,
|
|||
|
ae_state *_state);
|
|||
|
void _pexec_rmatrixlefttrsm(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t i1,
|
|||
|
ae_int_t j1,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_int_t optype,
|
|||
|
/* Real */ ae_matrix* x,
|
|||
|
ae_int_t i2,
|
|||
|
ae_int_t j2, ae_state *_state);
|
|||
|
void cmatrixsyrk(ae_int_t n,
|
|||
|
ae_int_t k,
|
|||
|
double alpha,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
ae_int_t optypea,
|
|||
|
double beta,
|
|||
|
/* Complex */ ae_matrix* c,
|
|||
|
ae_int_t ic,
|
|||
|
ae_int_t jc,
|
|||
|
ae_bool isupper,
|
|||
|
ae_state *_state);
|
|||
|
void _pexec_cmatrixsyrk(ae_int_t n,
|
|||
|
ae_int_t k,
|
|||
|
double alpha,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
ae_int_t optypea,
|
|||
|
double beta,
|
|||
|
/* Complex */ ae_matrix* c,
|
|||
|
ae_int_t ic,
|
|||
|
ae_int_t jc,
|
|||
|
ae_bool isupper, ae_state *_state);
|
|||
|
void rmatrixsyrk(ae_int_t n,
|
|||
|
ae_int_t k,
|
|||
|
double alpha,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
ae_int_t optypea,
|
|||
|
double beta,
|
|||
|
/* Real */ ae_matrix* c,
|
|||
|
ae_int_t ic,
|
|||
|
ae_int_t jc,
|
|||
|
ae_bool isupper,
|
|||
|
ae_state *_state);
|
|||
|
void _pexec_rmatrixsyrk(ae_int_t n,
|
|||
|
ae_int_t k,
|
|||
|
double alpha,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
ae_int_t optypea,
|
|||
|
double beta,
|
|||
|
/* Real */ ae_matrix* c,
|
|||
|
ae_int_t ic,
|
|||
|
ae_int_t jc,
|
|||
|
ae_bool isupper, ae_state *_state);
|
|||
|
void cmatrixgemm(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t k,
|
|||
|
ae_complex alpha,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
ae_int_t optypea,
|
|||
|
/* Complex */ ae_matrix* b,
|
|||
|
ae_int_t ib,
|
|||
|
ae_int_t jb,
|
|||
|
ae_int_t optypeb,
|
|||
|
ae_complex beta,
|
|||
|
/* Complex */ ae_matrix* c,
|
|||
|
ae_int_t ic,
|
|||
|
ae_int_t jc,
|
|||
|
ae_state *_state);
|
|||
|
void _pexec_cmatrixgemm(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t k,
|
|||
|
ae_complex alpha,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
ae_int_t optypea,
|
|||
|
/* Complex */ ae_matrix* b,
|
|||
|
ae_int_t ib,
|
|||
|
ae_int_t jb,
|
|||
|
ae_int_t optypeb,
|
|||
|
ae_complex beta,
|
|||
|
/* Complex */ ae_matrix* c,
|
|||
|
ae_int_t ic,
|
|||
|
ae_int_t jc, ae_state *_state);
|
|||
|
void rmatrixgemm(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t k,
|
|||
|
double alpha,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
ae_int_t optypea,
|
|||
|
/* Real */ ae_matrix* b,
|
|||
|
ae_int_t ib,
|
|||
|
ae_int_t jb,
|
|||
|
ae_int_t optypeb,
|
|||
|
double beta,
|
|||
|
/* Real */ ae_matrix* c,
|
|||
|
ae_int_t ic,
|
|||
|
ae_int_t jc,
|
|||
|
ae_state *_state);
|
|||
|
void _pexec_rmatrixgemm(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t k,
|
|||
|
double alpha,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t ia,
|
|||
|
ae_int_t ja,
|
|||
|
ae_int_t optypea,
|
|||
|
/* Real */ ae_matrix* b,
|
|||
|
ae_int_t ib,
|
|||
|
ae_int_t jb,
|
|||
|
ae_int_t optypeb,
|
|||
|
double beta,
|
|||
|
/* Real */ ae_matrix* c,
|
|||
|
ae_int_t ic,
|
|||
|
ae_int_t jc, ae_state *_state);
|
|||
|
void rmatrixqr(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* tau,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixlq(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* tau,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixqr(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_vector* tau,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixlq(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_vector* tau,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixqrunpackq(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* tau,
|
|||
|
ae_int_t qcolumns,
|
|||
|
/* Real */ ae_matrix* q,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixqrunpackr(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_matrix* r,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixlqunpackq(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* tau,
|
|||
|
ae_int_t qrows,
|
|||
|
/* Real */ ae_matrix* q,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixlqunpackl(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_matrix* l,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixqrunpackq(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_vector* tau,
|
|||
|
ae_int_t qcolumns,
|
|||
|
/* Complex */ ae_matrix* q,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixqrunpackr(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_matrix* r,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixlqunpackq(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_vector* tau,
|
|||
|
ae_int_t qrows,
|
|||
|
/* Complex */ ae_matrix* q,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixlqunpackl(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Complex */ ae_matrix* l,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixqrbasecase(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* work,
|
|||
|
/* Real */ ae_vector* t,
|
|||
|
/* Real */ ae_vector* tau,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixlqbasecase(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* work,
|
|||
|
/* Real */ ae_vector* t,
|
|||
|
/* Real */ ae_vector* tau,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixbd(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* tauq,
|
|||
|
/* Real */ ae_vector* taup,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixbdunpackq(/* Real */ ae_matrix* qp,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* tauq,
|
|||
|
ae_int_t qcolumns,
|
|||
|
/* Real */ ae_matrix* q,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixbdmultiplybyq(/* Real */ ae_matrix* qp,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* tauq,
|
|||
|
/* Real */ ae_matrix* z,
|
|||
|
ae_int_t zrows,
|
|||
|
ae_int_t zcolumns,
|
|||
|
ae_bool fromtheright,
|
|||
|
ae_bool dotranspose,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixbdunpackpt(/* Real */ ae_matrix* qp,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* taup,
|
|||
|
ae_int_t ptrows,
|
|||
|
/* Real */ ae_matrix* pt,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixbdmultiplybyp(/* Real */ ae_matrix* qp,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* taup,
|
|||
|
/* Real */ ae_matrix* z,
|
|||
|
ae_int_t zrows,
|
|||
|
ae_int_t zcolumns,
|
|||
|
ae_bool fromtheright,
|
|||
|
ae_bool dotranspose,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixbdunpackdiagonals(/* Real */ ae_matrix* b,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool* isupper,
|
|||
|
/* Real */ ae_vector* d,
|
|||
|
/* Real */ ae_vector* e,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixhessenberg(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* tau,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixhessenbergunpackq(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* tau,
|
|||
|
/* Real */ ae_matrix* q,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixhessenbergunpackh(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_matrix* h,
|
|||
|
ae_state *_state);
|
|||
|
void smatrixtd(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
/* Real */ ae_vector* tau,
|
|||
|
/* Real */ ae_vector* d,
|
|||
|
/* Real */ ae_vector* e,
|
|||
|
ae_state *_state);
|
|||
|
void smatrixtdunpackq(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
/* Real */ ae_vector* tau,
|
|||
|
/* Real */ ae_matrix* q,
|
|||
|
ae_state *_state);
|
|||
|
void hmatrixtd(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
/* Complex */ ae_vector* tau,
|
|||
|
/* Real */ ae_vector* d,
|
|||
|
/* Real */ ae_vector* e,
|
|||
|
ae_state *_state);
|
|||
|
void hmatrixtdunpackq(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
/* Complex */ ae_vector* tau,
|
|||
|
/* Complex */ ae_matrix* q,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool rmatrixbdsvd(/* Real */ ae_vector* d,
|
|||
|
/* Real */ ae_vector* e,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isfractionalaccuracyrequired,
|
|||
|
/* Real */ ae_matrix* u,
|
|||
|
ae_int_t nru,
|
|||
|
/* Real */ ae_matrix* c,
|
|||
|
ae_int_t ncc,
|
|||
|
/* Real */ ae_matrix* vt,
|
|||
|
ae_int_t ncvt,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool bidiagonalsvddecomposition(/* Real */ ae_vector* d,
|
|||
|
/* Real */ ae_vector* e,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isfractionalaccuracyrequired,
|
|||
|
/* Real */ ae_matrix* u,
|
|||
|
ae_int_t nru,
|
|||
|
/* Real */ ae_matrix* c,
|
|||
|
ae_int_t ncc,
|
|||
|
/* Real */ ae_matrix* vt,
|
|||
|
ae_int_t ncvt,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool rmatrixsvd(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t uneeded,
|
|||
|
ae_int_t vtneeded,
|
|||
|
ae_int_t additionalmemory,
|
|||
|
/* Real */ ae_vector* w,
|
|||
|
/* Real */ ae_matrix* u,
|
|||
|
/* Real */ ae_matrix* vt,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool smatrixevd(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t zneeded,
|
|||
|
ae_bool isupper,
|
|||
|
/* Real */ ae_vector* d,
|
|||
|
/* Real */ ae_matrix* z,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool smatrixevdr(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t zneeded,
|
|||
|
ae_bool isupper,
|
|||
|
double b1,
|
|||
|
double b2,
|
|||
|
ae_int_t* m,
|
|||
|
/* Real */ ae_vector* w,
|
|||
|
/* Real */ ae_matrix* z,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool smatrixevdi(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t zneeded,
|
|||
|
ae_bool isupper,
|
|||
|
ae_int_t i1,
|
|||
|
ae_int_t i2,
|
|||
|
/* Real */ ae_vector* w,
|
|||
|
/* Real */ ae_matrix* z,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool hmatrixevd(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t zneeded,
|
|||
|
ae_bool isupper,
|
|||
|
/* Real */ ae_vector* d,
|
|||
|
/* Complex */ ae_matrix* z,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool hmatrixevdr(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t zneeded,
|
|||
|
ae_bool isupper,
|
|||
|
double b1,
|
|||
|
double b2,
|
|||
|
ae_int_t* m,
|
|||
|
/* Real */ ae_vector* w,
|
|||
|
/* Complex */ ae_matrix* z,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool hmatrixevdi(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t zneeded,
|
|||
|
ae_bool isupper,
|
|||
|
ae_int_t i1,
|
|||
|
ae_int_t i2,
|
|||
|
/* Real */ ae_vector* w,
|
|||
|
/* Complex */ ae_matrix* z,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool smatrixtdevd(/* Real */ ae_vector* d,
|
|||
|
/* Real */ ae_vector* e,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t zneeded,
|
|||
|
/* Real */ ae_matrix* z,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool smatrixtdevdr(/* Real */ ae_vector* d,
|
|||
|
/* Real */ ae_vector* e,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t zneeded,
|
|||
|
double a,
|
|||
|
double b,
|
|||
|
ae_int_t* m,
|
|||
|
/* Real */ ae_matrix* z,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool smatrixtdevdi(/* Real */ ae_vector* d,
|
|||
|
/* Real */ ae_vector* e,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t zneeded,
|
|||
|
ae_int_t i1,
|
|||
|
ae_int_t i2,
|
|||
|
/* Real */ ae_matrix* z,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool rmatrixevd(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t vneeded,
|
|||
|
/* Real */ ae_vector* wr,
|
|||
|
/* Real */ ae_vector* wi,
|
|||
|
/* Real */ ae_matrix* vl,
|
|||
|
/* Real */ ae_matrix* vr,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixrndorthogonal(ae_int_t n,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixrndcond(ae_int_t n,
|
|||
|
double c,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixrndorthogonal(ae_int_t n,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixrndcond(ae_int_t n,
|
|||
|
double c,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_state *_state);
|
|||
|
void smatrixrndcond(ae_int_t n,
|
|||
|
double c,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_state *_state);
|
|||
|
void spdmatrixrndcond(ae_int_t n,
|
|||
|
double c,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_state *_state);
|
|||
|
void hmatrixrndcond(ae_int_t n,
|
|||
|
double c,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_state *_state);
|
|||
|
void hpdmatrixrndcond(ae_int_t n,
|
|||
|
double c,
|
|||
|
/* Complex */ ae_matrix* a,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixrndorthogonalfromtheright(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixrndorthogonalfromtheleft(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixrndorthogonalfromtheright(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixrndorthogonalfromtheleft(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
void smatrixrndmultiply(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
void hmatrixrndmultiply(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixlu(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Integer */ ae_vector* pivots,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixlu(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Integer */ ae_vector* pivots,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool hpdmatrixcholesky(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool spdmatrixcholesky(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixlup(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Integer */ ae_vector* pivots,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixlup(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Integer */ ae_vector* pivots,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixplu(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Integer */ ae_vector* pivots,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixplu(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Integer */ ae_vector* pivots,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool spdmatrixcholeskyrec(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t offs,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
/* Real */ ae_vector* tmp,
|
|||
|
ae_state *_state);
|
|||
|
double rmatrixrcond1(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
double rmatrixrcondinf(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
double spdmatrixrcond(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_state *_state);
|
|||
|
double rmatrixtrrcond1(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_state *_state);
|
|||
|
double rmatrixtrrcondinf(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_state *_state);
|
|||
|
double hpdmatrixrcond(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_state *_state);
|
|||
|
double cmatrixrcond1(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
double cmatrixrcondinf(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
double rmatrixlurcond1(/* Real */ ae_matrix* lua,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
double rmatrixlurcondinf(/* Real */ ae_matrix* lua,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
double spdmatrixcholeskyrcond(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_state *_state);
|
|||
|
double hpdmatrixcholeskyrcond(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_state *_state);
|
|||
|
double cmatrixlurcond1(/* Complex */ ae_matrix* lua,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
double cmatrixlurcondinf(/* Complex */ ae_matrix* lua,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
double cmatrixtrrcond1(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_state *_state);
|
|||
|
double cmatrixtrrcondinf(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_state *_state);
|
|||
|
double rcondthreshold(ae_state *_state);
|
|||
|
void rmatrixluinverse(/* Real */ ae_matrix* a,
|
|||
|
/* Integer */ ae_vector* pivots,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t* info,
|
|||
|
matinvreport* rep,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixinverse(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t* info,
|
|||
|
matinvreport* rep,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixluinverse(/* Complex */ ae_matrix* a,
|
|||
|
/* Integer */ ae_vector* pivots,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t* info,
|
|||
|
matinvreport* rep,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixinverse(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t* info,
|
|||
|
matinvreport* rep,
|
|||
|
ae_state *_state);
|
|||
|
void spdmatrixcholeskyinverse(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_int_t* info,
|
|||
|
matinvreport* rep,
|
|||
|
ae_state *_state);
|
|||
|
void spdmatrixinverse(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_int_t* info,
|
|||
|
matinvreport* rep,
|
|||
|
ae_state *_state);
|
|||
|
void hpdmatrixcholeskyinverse(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_int_t* info,
|
|||
|
matinvreport* rep,
|
|||
|
ae_state *_state);
|
|||
|
void hpdmatrixinverse(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_int_t* info,
|
|||
|
matinvreport* rep,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixtrinverse(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_int_t* info,
|
|||
|
matinvreport* rep,
|
|||
|
ae_state *_state);
|
|||
|
void cmatrixtrinverse(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_bool isunit,
|
|||
|
ae_int_t* info,
|
|||
|
matinvreport* rep,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool _matinvreport_init(void* _p, ae_state *_state, ae_bool make_automatic);
|
|||
|
ae_bool _matinvreport_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic);
|
|||
|
void _matinvreport_clear(void* _p);
|
|||
|
void _matinvreport_destroy(void* _p);
|
|||
|
void sparsecreate(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t k,
|
|||
|
sparsematrix* s,
|
|||
|
ae_state *_state);
|
|||
|
void sparsecreatecrs(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Integer */ ae_vector* ner,
|
|||
|
sparsematrix* s,
|
|||
|
ae_state *_state);
|
|||
|
void sparsecopy(sparsematrix* s0, sparsematrix* s1, ae_state *_state);
|
|||
|
void sparseadd(sparsematrix* s,
|
|||
|
ae_int_t i,
|
|||
|
ae_int_t j,
|
|||
|
double v,
|
|||
|
ae_state *_state);
|
|||
|
void sparseset(sparsematrix* s,
|
|||
|
ae_int_t i,
|
|||
|
ae_int_t j,
|
|||
|
double v,
|
|||
|
ae_state *_state);
|
|||
|
double sparseget(sparsematrix* s,
|
|||
|
ae_int_t i,
|
|||
|
ae_int_t j,
|
|||
|
ae_state *_state);
|
|||
|
double sparsegetdiagonal(sparsematrix* s, ae_int_t i, ae_state *_state);
|
|||
|
void sparseconverttocrs(sparsematrix* s, ae_state *_state);
|
|||
|
void sparsemv(sparsematrix* s,
|
|||
|
/* Real */ ae_vector* x,
|
|||
|
/* Real */ ae_vector* y,
|
|||
|
ae_state *_state);
|
|||
|
void sparsemtv(sparsematrix* s,
|
|||
|
/* Real */ ae_vector* x,
|
|||
|
/* Real */ ae_vector* y,
|
|||
|
ae_state *_state);
|
|||
|
void sparsemv2(sparsematrix* s,
|
|||
|
/* Real */ ae_vector* x,
|
|||
|
/* Real */ ae_vector* y0,
|
|||
|
/* Real */ ae_vector* y1,
|
|||
|
ae_state *_state);
|
|||
|
void sparsesmv(sparsematrix* s,
|
|||
|
ae_bool isupper,
|
|||
|
/* Real */ ae_vector* x,
|
|||
|
/* Real */ ae_vector* y,
|
|||
|
ae_state *_state);
|
|||
|
void sparsemm(sparsematrix* s,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t k,
|
|||
|
/* Real */ ae_matrix* b,
|
|||
|
ae_state *_state);
|
|||
|
void sparsemtm(sparsematrix* s,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t k,
|
|||
|
/* Real */ ae_matrix* b,
|
|||
|
ae_state *_state);
|
|||
|
void sparsemm2(sparsematrix* s,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t k,
|
|||
|
/* Real */ ae_matrix* b0,
|
|||
|
/* Real */ ae_matrix* b1,
|
|||
|
ae_state *_state);
|
|||
|
void sparsesmm(sparsematrix* s,
|
|||
|
ae_bool isupper,
|
|||
|
/* Real */ ae_matrix* a,
|
|||
|
ae_int_t k,
|
|||
|
/* Real */ ae_matrix* b,
|
|||
|
ae_state *_state);
|
|||
|
void sparseresizematrix(sparsematrix* s, ae_state *_state);
|
|||
|
double sparsegetaveragelengthofchain(sparsematrix* s, ae_state *_state);
|
|||
|
ae_bool sparseenumerate(sparsematrix* s,
|
|||
|
ae_int_t* t0,
|
|||
|
ae_int_t* t1,
|
|||
|
ae_int_t* i,
|
|||
|
ae_int_t* j,
|
|||
|
double* v,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool sparserewriteexisting(sparsematrix* s,
|
|||
|
ae_int_t i,
|
|||
|
ae_int_t j,
|
|||
|
double v,
|
|||
|
ae_state *_state);
|
|||
|
void sparsegetrow(sparsematrix* s,
|
|||
|
ae_int_t i,
|
|||
|
/* Real */ ae_vector* irow,
|
|||
|
ae_state *_state);
|
|||
|
void sparseconverttohash(sparsematrix* s, ae_state *_state);
|
|||
|
void sparsecopytohash(sparsematrix* s0,
|
|||
|
sparsematrix* s1,
|
|||
|
ae_state *_state);
|
|||
|
void sparsecopytocrs(sparsematrix* s0, sparsematrix* s1, ae_state *_state);
|
|||
|
ae_int_t sparsegetmatrixtype(sparsematrix* s, ae_state *_state);
|
|||
|
ae_bool sparseishash(sparsematrix* s, ae_state *_state);
|
|||
|
ae_bool sparseiscrs(sparsematrix* s, ae_state *_state);
|
|||
|
void sparsefree(sparsematrix* s, ae_state *_state);
|
|||
|
ae_int_t sparsegetnrows(sparsematrix* s, ae_state *_state);
|
|||
|
ae_int_t sparsegetncols(sparsematrix* s, ae_state *_state);
|
|||
|
ae_bool _sparsematrix_init(void* _p, ae_state *_state, ae_bool make_automatic);
|
|||
|
ae_bool _sparsematrix_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic);
|
|||
|
void _sparsematrix_clear(void* _p);
|
|||
|
void _sparsematrix_destroy(void* _p);
|
|||
|
void fblscholeskysolve(/* Real */ ae_matrix* cha,
|
|||
|
double sqrtscalea,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
/* Real */ ae_vector* xb,
|
|||
|
/* Real */ ae_vector* tmp,
|
|||
|
ae_state *_state);
|
|||
|
void fblssolvecgx(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
double alpha,
|
|||
|
/* Real */ ae_vector* b,
|
|||
|
/* Real */ ae_vector* x,
|
|||
|
/* Real */ ae_vector* buf,
|
|||
|
ae_state *_state);
|
|||
|
void fblscgcreate(/* Real */ ae_vector* x,
|
|||
|
/* Real */ ae_vector* b,
|
|||
|
ae_int_t n,
|
|||
|
fblslincgstate* state,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool fblscgiteration(fblslincgstate* state, ae_state *_state);
|
|||
|
void fblssolvels(/* Real */ ae_matrix* a,
|
|||
|
/* Real */ ae_vector* b,
|
|||
|
ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* tmp0,
|
|||
|
/* Real */ ae_vector* tmp1,
|
|||
|
/* Real */ ae_vector* tmp2,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool _fblslincgstate_init(void* _p, ae_state *_state, ae_bool make_automatic);
|
|||
|
ae_bool _fblslincgstate_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic);
|
|||
|
void _fblslincgstate_clear(void* _p);
|
|||
|
void _fblslincgstate_destroy(void* _p);
|
|||
|
void normestimatorcreate(ae_int_t m,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t nstart,
|
|||
|
ae_int_t nits,
|
|||
|
normestimatorstate* state,
|
|||
|
ae_state *_state);
|
|||
|
void normestimatorsetseed(normestimatorstate* state,
|
|||
|
ae_int_t seedval,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool normestimatoriteration(normestimatorstate* state,
|
|||
|
ae_state *_state);
|
|||
|
void normestimatorestimatesparse(normestimatorstate* state,
|
|||
|
sparsematrix* a,
|
|||
|
ae_state *_state);
|
|||
|
void normestimatorresults(normestimatorstate* state,
|
|||
|
double* nrm,
|
|||
|
ae_state *_state);
|
|||
|
void normestimatorrestart(normestimatorstate* state, ae_state *_state);
|
|||
|
ae_bool _normestimatorstate_init(void* _p, ae_state *_state, ae_bool make_automatic);
|
|||
|
ae_bool _normestimatorstate_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic);
|
|||
|
void _normestimatorstate_clear(void* _p);
|
|||
|
void _normestimatorstate_destroy(void* _p);
|
|||
|
double rmatrixludet(/* Real */ ae_matrix* a,
|
|||
|
/* Integer */ ae_vector* pivots,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
double rmatrixdet(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
ae_complex cmatrixludet(/* Complex */ ae_matrix* a,
|
|||
|
/* Integer */ ae_vector* pivots,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
ae_complex cmatrixdet(/* Complex */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
double spdmatrixcholeskydet(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_state *_state);
|
|||
|
double spdmatrixdet(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isupper,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool smatrixgevd(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isuppera,
|
|||
|
/* Real */ ae_matrix* b,
|
|||
|
ae_bool isupperb,
|
|||
|
ae_int_t zneeded,
|
|||
|
ae_int_t problemtype,
|
|||
|
/* Real */ ae_vector* d,
|
|||
|
/* Real */ ae_matrix* z,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool smatrixgevdreduce(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
ae_bool isuppera,
|
|||
|
/* Real */ ae_matrix* b,
|
|||
|
ae_bool isupperb,
|
|||
|
ae_int_t problemtype,
|
|||
|
/* Real */ ae_matrix* r,
|
|||
|
ae_bool* isupperr,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixinvupdatesimple(/* Real */ ae_matrix* inva,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t updrow,
|
|||
|
ae_int_t updcolumn,
|
|||
|
double updval,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixinvupdaterow(/* Real */ ae_matrix* inva,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t updrow,
|
|||
|
/* Real */ ae_vector* v,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixinvupdatecolumn(/* Real */ ae_matrix* inva,
|
|||
|
ae_int_t n,
|
|||
|
ae_int_t updcolumn,
|
|||
|
/* Real */ ae_vector* u,
|
|||
|
ae_state *_state);
|
|||
|
void rmatrixinvupdateuv(/* Real */ ae_matrix* inva,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_vector* u,
|
|||
|
/* Real */ ae_vector* v,
|
|||
|
ae_state *_state);
|
|||
|
ae_bool rmatrixschur(/* Real */ ae_matrix* a,
|
|||
|
ae_int_t n,
|
|||
|
/* Real */ ae_matrix* s,
|
|||
|
ae_state *_state);
|
|||
|
|
|||
|
}
|
|||
|
#endif
|
|||
|
|