|
|
/*************************************************************************
|
|
|
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 _svd_h
|
|
|
#define _svd_h
|
|
|
|
|
|
#include "alglib/ap.h"
|
|
|
|
|
|
#include "alglib/reflections.h"
|
|
|
#include "alglib/bidiagonal.h"
|
|
|
#include "alglib/qr.h"
|
|
|
#include "alglib/lq.h"
|
|
|
#include "alglib/blas.h"
|
|
|
#include "alglib/rotations.h"
|
|
|
#include "alglib/bdsvd.h"
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
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<73>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<73>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
|
|
|
*************************************************************************/
|
|
|
ALGLIB_EXPORT
|
|
|
bool rmatrixsvd(ap::real_2d_array a,
|
|
|
int m,
|
|
|
int n,
|
|
|
int uneeded,
|
|
|
int vtneeded,
|
|
|
int additionalmemory,
|
|
|
ap::real_1d_array& w,
|
|
|
ap::real_2d_array& u,
|
|
|
ap::real_2d_array& vt);
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
Obsolete 1-based subroutine.
|
|
|
See RMatrixSVD for 0-based replacement.
|
|
|
*************************************************************************/
|
|
|
ALGLIB_EXPORT
|
|
|
bool svddecomposition(ap::real_2d_array a,
|
|
|
int m,
|
|
|
int n,
|
|
|
int uneeded,
|
|
|
int vtneeded,
|
|
|
int additionalmemory,
|
|
|
ap::real_1d_array& w,
|
|
|
ap::real_2d_array& u,
|
|
|
ap::real_2d_array& vt);
|
|
|
|
|
|
|
|
|
#endif
|