sggsvd.c
来自「InsightToolkit-1.4.0(有大量的优化算法程序)」· C语言 代码 · 共 278 行 · 第 1/2 页
C
278 行
#include "f2c.h"
#include "netlib.h"
/* Subroutine */ void sggsvd_(char *jobu, char *jobv, char *jobq, integer *m,
integer *n, integer *p, integer *k, integer *l, real *a, integer *lda,
real *b, integer *ldb, real *alpha, real *beta, real *u, integer *ldu,
real *v, integer *ldv, real *q, integer *ldq,
real *work, integer *iwork, integer *info)
{
/* System generated locals */
integer i__1;
/* Local variables */
static real tola, tolb, unfl;
static real anorm, bnorm;
static logical wantq, wantu, wantv;
static integer ncycle;
static real ulp;
/* -- LAPACK driver routine (version 2.0) -- */
/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */
/* Courant Institute, Argonne National Lab, and Rice University */
/* September 30, 1994 */
/* Purpose */
/* ======= */
/* */
/* SGGSVD computes the generalized singular value decomposition (GSVD) */
/* of an M-by-N real matrix A and P-by-N real matrix B: */
/* */
/* U'*A*Q = D1*( 0 R ), V'*B*Q = D2*( 0 R ) */
/* */
/* where U, V and Q are orthogonal matrices, and Z' is the transpose */
/* of Z. Let K+L = the effective numerical rank of the matrix (A',B')', */
/* then R is a K+L-by-K+L nonsingular upper triangular matrix, D1 and */
/* D2 are M-by-(K+L) and P-by-(K+L) "diagonal" matrices and of the */
/* following structures, respectively: */
/* */
/* If M-K-L >= 0, */
/* */
/* K L */
/* D1 = K ( I 0 ) */
/* L ( 0 C ) */
/* M-K-L ( 0 0 ) */
/* */
/* K L */
/* D2 = L ( 0 S ) */
/* P-L ( 0 0 ) */
/* */
/* N-K-L K L */
/* ( 0 R ) = K ( 0 R11 R12 ) */
/* L ( 0 0 R22 ) */
/* */
/* where */
/* */
/* C = diag( ALPHA(K+1), ... , ALPHA(K+L) ), */
/* S = diag( BETA(K+1), ... , BETA(K+L) ), */
/* C**2 + S**2 = I. */
/* */
/* R is stored in A(1:K+L,N-K-L+1:N) on exit. */
/* */
/* If M-K-L < 0, */
/* */
/* K M-K K+L-M */
/* D1 = K ( I 0 0 ) */
/* M-K ( 0 C 0 ) */
/* */
/* K M-K K+L-M */
/* D2 = M-K ( 0 S 0 ) */
/* K+L-M ( 0 0 I ) */
/* P-L ( 0 0 0 ) */
/* */
/* N-K-L K M-K K+L-M */
/* ( 0 R ) = K ( 0 R11 R12 R13 ) */
/* M-K ( 0 0 R22 R23 ) */
/* K+L-M ( 0 0 0 R33 ) */
/* */
/* where */
/* */
/* C = diag( ALPHA(K+1), ... , ALPHA(M) ), */
/* S = diag( BETA(K+1), ... , BETA(M) ), */
/* C**2 + S**2 = I. */
/* */
/* (R11 R12 R13 ) is stored in A(1:M, N-K-L+1:N), and R33 is stored */
/* ( 0 R22 R23 ) */
/* in B(M-K+1:L,N+M-K-L+1:N) on exit. */
/* */
/* The routine computes C, S, R, and optionally the orthogonal */
/* transformation matrices U, V and Q. */
/* */
/* In particular, if B is an N-by-N nonsingular matrix, then the GSVD of */
/* A and B implicitly gives the SVD of A*inv(B): */
/* A*inv(B) = U*(D1*inv(D2))*V'. */
/* If ( A',B')' has orthonormal columns, then the GSVD of A and B is */
/* also equal to the CS decomposition of A and B. Furthermore, the GSVD */
/* can be used to derive the solution of the eigenvalue problem: */
/* A'*A x = lambda* B'*B x. */
/* In some literature, the GSVD of A and B is presented in the form */
/* U'*A*X = ( 0 D1 ), V'*B*X = ( 0 D2 ) */
/* where U and V are orthogonal and X is nonsingular, D1 and D2 are */
/* ``diagonal''. The former GSVD form can be converted to the latter */
/* form by taking the nonsingular matrix X as */
/* */
/* X = Q*( I 0 ) */
/* ( 0 inv(R) ). */
/* */
/* Arguments */
/* ========= */
/* */
/* JOBU (input) CHARACTER*1 */
/* = 'U': Orthogonal matrix U is computed; */
/* = 'N': U is not computed. */
/* */
/* JOBV (input) CHARACTER*1 */
/* = 'V': Orthogonal matrix V is computed; */
/* = 'N': V is not computed. */
/* */
/* JOBQ (input) CHARACTER*1 */
/* = 'Q': Orthogonal matrix Q is computed; */
/* = 'N': Q is not computed. */
/* */
/* M (input) INTEGER */
/* The number of rows of the matrix A. M >= 0. */
/* */
/* N (input) INTEGER */
/* The number of columns of the matrices A and B. N >= 0. */
/* */
/* P (input) INTEGER */
/* The number of rows of the matrix B. P >= 0. */
/* */
/* K (output) INTEGER */
/* L (output) INTEGER */
/* On exit, K and L specify the dimension of the subblocks */
/* described in the Purpose section. */
/* K + L = effective numerical rank of (A',B')'. */
/* */
/* A (input/output) REAL array, dimension (LDA,N) */
/* On entry, the M-by-N matrix A. */
/* On exit, A contains the triangular matrix R, or part of R. */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?