You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
5.8 KiB
C
166 lines
5.8 KiB
C
|
3 weeks ago
|
/*************************************************************************
|
||
|
|
Copyright (c) 2005-2007, Sergey Bochkanov (ALGLIB project).
|
||
|
|
|
||
|
|
Redistribution and use in source and binary forms, with or without
|
||
|
|
modification, are permitted provided that the following conditions are
|
||
|
|
met:
|
||
|
|
|
||
|
|
- Redistributions of source code must retain the above copyright
|
||
|
|
notice, this list of conditions and the following disclaimer.
|
||
|
|
|
||
|
|
- Redistributions in binary form must reproduce the above copyright
|
||
|
|
notice, this list of conditions and the following disclaimer listed
|
||
|
|
in this license in the documentation and/or other materials
|
||
|
|
provided with the distribution.
|
||
|
|
|
||
|
|
- Neither the name of the copyright holders nor the names of its
|
||
|
|
contributors may be used to endorse or promote products derived from
|
||
|
|
this software without specific prior written permission.
|
||
|
|
|
||
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||
|
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||
|
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||
|
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||
|
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||
|
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||
|
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||
|
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||
|
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||
|
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
|
*************************************************************************/
|
||
|
|
|
||
|
|
#ifndef _lq_h
|
||
|
|
#define _lq_h
|
||
|
|
|
||
|
|
#include "alglib/ap.h"
|
||
|
|
|
||
|
|
#include "alglib/reflections.h"
|
||
|
|
|
||
|
|
|
||
|
|
/*************************************************************************
|
||
|
|
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 --
|
||
|
|
Copyright 2005-2007 by Bochkanov Sergey
|
||
|
|
*************************************************************************/
|
||
|
|
ALGLIB_EXPORT
|
||
|
|
void rmatrixlq(ap::real_2d_array& a, int m, int n, ap::real_1d_array& tau);
|
||
|
|
|
||
|
|
|
||
|
|
/*************************************************************************
|
||
|
|
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 --
|
||
|
|
Copyright 2005 by Bochkanov Sergey
|
||
|
|
*************************************************************************/
|
||
|
|
ALGLIB_EXPORT
|
||
|
|
void rmatrixlqunpackq(const ap::real_2d_array& a,
|
||
|
|
int m,
|
||
|
|
int n,
|
||
|
|
const ap::real_1d_array& tau,
|
||
|
|
int qrows,
|
||
|
|
ap::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 --
|
||
|
|
Copyright 2005 by Bochkanov Sergey
|
||
|
|
*************************************************************************/
|
||
|
|
ALGLIB_EXPORT
|
||
|
|
void rmatrixlqunpackl(const ap::real_2d_array& a,
|
||
|
|
int m,
|
||
|
|
int n,
|
||
|
|
ap::real_2d_array& l);
|
||
|
|
|
||
|
|
|
||
|
|
/*************************************************************************
|
||
|
|
Obsolete 1-based subroutine
|
||
|
|
See RMatrixLQ for 0-based replacement.
|
||
|
|
*************************************************************************/
|
||
|
|
ALGLIB_EXPORT
|
||
|
|
void lqdecomposition(ap::real_2d_array& a,
|
||
|
|
int m,
|
||
|
|
int n,
|
||
|
|
ap::real_1d_array& tau);
|
||
|
|
|
||
|
|
|
||
|
|
/*************************************************************************
|
||
|
|
Obsolete 1-based subroutine
|
||
|
|
See RMatrixLQUnpackQ for 0-based replacement.
|
||
|
|
*************************************************************************/
|
||
|
|
ALGLIB_EXPORT
|
||
|
|
void unpackqfromlq(const ap::real_2d_array& a,
|
||
|
|
int m,
|
||
|
|
int n,
|
||
|
|
const ap::real_1d_array& tau,
|
||
|
|
int qrows,
|
||
|
|
ap::real_2d_array& q);
|
||
|
|
|
||
|
|
|
||
|
|
/*************************************************************************
|
||
|
|
Obsolete 1-based subroutine
|
||
|
|
*************************************************************************/
|
||
|
|
ALGLIB_EXPORT
|
||
|
|
void lqdecompositionunpacked(ap::real_2d_array a,
|
||
|
|
int m,
|
||
|
|
int n,
|
||
|
|
ap::real_2d_array& l,
|
||
|
|
ap::real_2d_array& q);
|
||
|
|
|
||
|
|
|
||
|
|
#endif
|