slarf.c

来自「NIST Handwriting OCR Testbed」· C语言 代码 · 共 138 行

C
138
字号
/** ======================================================================* NIST Guide to Available Math Software.* Fullsource for module SSYEVX.C from package CLAPACK.* Retrieved from NETLIB on Fri Mar 10 14:23:44 2000.* ======================================================================*/#include <f2c.h>/* Subroutine */ int slarf_(char *side, integer *m, integer *n, real *v, 	integer *incv, real *tau, real *c, integer *ldc, real *work){/*  -- LAPACK auxiliary routine (version 2.0) --          Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,          Courant Institute, Argonne National Lab, and Rice University          February 29, 1992       Purpose       =======       SLARF applies a real elementary reflector H to a real m by n matrix       C, from either the left or the right. H is represented in the form             H = I - tau * v * v'       where tau is a real scalar and v is a real vector.       If tau = 0, then H is taken to be the unit matrix.       Arguments       =========       SIDE    (input) CHARACTER*1               = 'L': form  H * C               = 'R': form  C * H       M       (input) INTEGER               The number of rows of the matrix C.       N       (input) INTEGER               The number of columns of the matrix C.       V       (input) REAL array, dimension                          (1 + (M-1)*abs(INCV)) if SIDE = 'L'                       or (1 + (N-1)*abs(INCV)) if SIDE = 'R'               The vector v in the representation of H. V is not used if               TAU = 0.       INCV    (input) INTEGER               The increment between elements of v. INCV <> 0.       TAU     (input) REAL               The value tau in the representation of H.       C       (input/output) REAL array, dimension (LDC,N)               On entry, the m by n matrix C.               On exit, C is overwritten by the matrix H * C if SIDE = 'L',               or C * H if SIDE = 'R'.       LDC     (input) INTEGER               The leading dimension of the array C. LDC >= max(1,M).       WORK    (workspace) REAL array, dimension                              (N) if SIDE = 'L'                           or (M) if SIDE = 'R'       =====================================================================          Parameter adjustments          Function Body */    /* Table of constant values */    static real c_b4 = 1.f;    static real c_b5 = 0.f;    static integer c__1 = 1;        /* System generated locals */    integer c_dim1, c_offset;    real r__1;    /* Local variables */    extern /* Subroutine */ int sger_(integer *, integer *, real *, real *, 	    integer *, real *, integer *, real *, integer *);    extern logical lsame_(char *, char *);    extern /* Subroutine */ int sgemv_(char *, integer *, integer *, real *, 	    real *, integer *, real *, integer *, real *, real *, integer *);#define V(I) v[(I)-1]#define WORK(I) work[(I)-1]#define C(I,J) c[(I)-1 + ((J)-1)* ( *ldc)]    if (lsame_(side, "L")) {/*        Form  H * C */	if (*tau != 0.f) {/*           w := C' * v */	    sgemv_("Transpose", m, n, &c_b4, &C(1,1), ldc, &V(1), incv, &		    c_b5, &WORK(1), &c__1);/*           C := C - v * w' */	    r__1 = -(doublereal)(*tau);	    sger_(m, n, &r__1, &V(1), incv, &WORK(1), &c__1, &C(1,1), 		    ldc);	}    } else {/*        Form  C * H */	if (*tau != 0.f) {/*           w := C * v */	    sgemv_("No transpose", m, n, &c_b4, &C(1,1), ldc, &V(1), 		    incv, &c_b5, &WORK(1), &c__1);/*           C := C - w * v' */	    r__1 = -(doublereal)(*tau);	    sger_(m, n, &r__1, &WORK(1), &c__1, &V(1), incv, &C(1,1), 		    ldc);	}    }    return 0;/*     End of SLARF */} /* slarf_ */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?