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
6.8 KiB
C
166 lines
6.8 KiB
C
/*************************************************************************
|
|
Copyright (c) 1992-2007 The University of Tennessee. All rights reserved.
|
|
|
|
Contributors:
|
|
* Sergey Bochkanov (ALGLIB project). Translation from FORTRAN to
|
|
pseudocode.
|
|
|
|
See subroutines comments for additional copyrights.
|
|
|
|
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 _bdsvd_h
|
|
#define _bdsvd_h
|
|
|
|
#include "alglib/ap.h"
|
|
|
|
#include "alglib/rotations.h"
|
|
|
|
|
|
/*************************************************************************
|
|
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 -
|
|
accuracy to search singular values with.
|
|
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.
|
|
*************************************************************************/
|
|
ALGLIB_EXPORT
|
|
bool rmatrixbdsvd(ap::real_1d_array& d,
|
|
ap::real_1d_array e,
|
|
int n,
|
|
bool isupper,
|
|
bool isfractionalaccuracyrequired,
|
|
ap::real_2d_array& u,
|
|
int nru,
|
|
ap::real_2d_array& c,
|
|
int ncc,
|
|
ap::real_2d_array& vt,
|
|
int ncvt);
|
|
|
|
|
|
/*************************************************************************
|
|
Obsolete 1-based subroutine. See RMatrixBDSVD for 0-based replacement.
|
|
|
|
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.
|
|
*************************************************************************/
|
|
ALGLIB_EXPORT
|
|
bool bidiagonalsvddecomposition(ap::real_1d_array& d,
|
|
ap::real_1d_array e,
|
|
int n,
|
|
bool isupper,
|
|
bool isfractionalaccuracyrequired,
|
|
ap::real_2d_array& u,
|
|
int nru,
|
|
ap::real_2d_array& c,
|
|
int ncc,
|
|
ap::real_2d_array& vt,
|
|
int ncvt);
|
|
|
|
|
|
#endif
|