Purpose
=======
DBDSQR computes the singular values and, optionally, the right and/or
left singular vectors from the singular value decomposition (SVD) of
a real N-by-N (upper or lower) bidiagonal matrix B using the implicit
zero-shift QR algorithm. The SVD of B has the form
B = Q * S * P**T
where S is the diagonal matrix of singular values, Q is an orthogonal
matrix of left singular vectors, and P is an orthogonal matrix of
right singular vectors. If left singular vectors are requested, this
subroutine actually returns U*Q instead of Q, and, if right singular
vectors are requested, this subroutine returns P**T*VT instead of
P**T, for given real input matrices U and VT. When U and VT are the
orthogonal matrices that reduce a general matrix A to bidiagonal
form: A = U*B*VT, as computed by DGEBRD, then
A = (U*Q) * S * (P**T*VT)
is the SVD of A. Optionally, the subroutine may also compute Q**T*C
for a given real input matrix C.
See "Computing Small Singular Values of Bidiagonal Matrices With
Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan,
LAPACK Working Note #3 (or SIAM J. Sci. Statist. Comput. vol. 11,
no. 5, pp. 873-912, Sept 1990) and
"Accurate singular values and differential qd algorithms," by
B. Parlett and V. Fernando, Technical Report CPAM-554, Mathematics
Department, University of California at Berkeley, July 1992
for a detailed description of the algorithm.
Namespace: DotNumerics.LinearAlgebra.CSLapackAssembly: DWSIM.MathOps.DotNumerics (in DWSIM.MathOps.DotNumerics.dll) Version: 1.0.0.0 (1.0.0.0)
Syntax public void Run(
string UPLO,
int N,
int NCVT,
int NRU,
int NCC,
ref double[] D,
int offset_d,
ref double[] E,
int offset_e,
ref double[] VT,
int offset_vt,
int LDVT,
ref double[] U,
int offset_u,
int LDU,
ref double[] C,
int offset_c,
int LDC,
ref double[] WORK,
int offset_work,
ref int INFO
)
Public Sub Run (
UPLO As String,
N As Integer,
NCVT As Integer,
NRU As Integer,
NCC As Integer,
ByRef D As Double(),
offset_d As Integer,
ByRef E As Double(),
offset_e As Integer,
ByRef VT As Double(),
offset_vt As Integer,
LDVT As Integer,
ByRef U As Double(),
offset_u As Integer,
LDU As Integer,
ByRef C As Double(),
offset_c As Integer,
LDC As Integer,
ByRef WORK As Double(),
offset_work As Integer,
ByRef INFO As Integer
)
Request Example
View SourceParameters
- UPLO String
-
(input) CHARACTER*1
= 'U': B is upper bidiagonal;
= 'L': B is lower bidiagonal.
- N Int32
-
(input) INTEGER
The order of the matrix B. N .GE. 0.
- NCVT Int32
-
(input) INTEGER
The number of columns of the matrix VT. NCVT .GE. 0.
- NRU Int32
-
(input) INTEGER
The number of rows of the matrix U. NRU .GE. 0.
- NCC Int32
-
(input) INTEGER
The number of columns of the matrix C. NCC .GE. 0.
- D Double
-
(input/output) DOUBLE PRECISION array, dimension (N)
On entry, the n diagonal elements of the bidiagonal matrix B.
On exit, if INFO=0, the singular values of B in decreasing
order.
- offset_d Int32
-
- E Double
-
(input/output) DOUBLE PRECISION array, dimension (N-1)
On entry, the N-1 offdiagonal elements of the bidiagonal
matrix B.
On exit, if INFO = 0, E is destroyed; if INFO .GT. 0, D and E
will contain the diagonal and superdiagonal elements of a
bidiagonal matrix orthogonally equivalent to the one given
as input.
- offset_e Int32
-
- VT Double
-
(input/output) DOUBLE PRECISION array, dimension (LDVT, NCVT)
On entry, an N-by-NCVT matrix VT.
On exit, VT is overwritten by P**T * VT.
Not referenced if NCVT = 0.
- offset_vt Int32
-
- LDVT Int32
-
(input) INTEGER
The leading dimension of the array VT.
LDVT .GE. max(1,N) if NCVT .GT. 0; LDVT .GE. 1 if NCVT = 0.
- U Double
-
(input/output) DOUBLE PRECISION array, dimension (LDU, N)
On entry, an NRU-by-N matrix U.
On exit, U is overwritten by U * Q.
Not referenced if NRU = 0.
- offset_u Int32
-
- LDU Int32
-
(input) INTEGER
The leading dimension of the array U. LDU .GE. max(1,NRU).
- C Double
-
(input/output) DOUBLE PRECISION array, dimension (LDC, NCC)
On entry, an N-by-NCC matrix C.
On exit, C is overwritten by Q**T * C.
Not referenced if NCC = 0.
- offset_c Int32
-
- LDC Int32
-
(input) INTEGER
The leading dimension of the array C.
LDC .GE. max(1,N) if NCC .GT. 0; LDC .GE.1 if NCC = 0.
- WORK Double
-
(workspace) DOUBLE PRECISION array, dimension (2*N)
if NCVT = NRU = NCC = 0, (max(1, 4*N)) otherwise
- offset_work Int32
-
- INFO Int32
-
(output) INTEGER
= 0: successful exit
.LT. 0: If INFO = -i, the i-th argument had an illegal value
.GT. 0: the algorithm did not converge; D and E contain the
elements of a bidiagonal matrix which is orthogonally
similar to the input matrix B; if INFO = i, i
elements of E have not converged to zero.
See Also