slarfb.c
来自「NIST Handwriting OCR Testbed」· C语言 代码 · 共 691 行 · 第 1/2 页
C
691 行
/** ======================================================================* 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 slarfb_(char *side, char *trans, char *direct, char * storev, integer *m, integer *n, integer *k, real *v, integer *ldv, real *t, integer *ldt, real *c, integer *ldc, real *work, integer * ldwork){/* -- 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 ======= SLARFB applies a real block reflector H or its transpose H' to a real m by n matrix C, from either the left or the right. Arguments ========= SIDE (input) CHARACTER*1 = 'L': apply H or H' from the Left = 'R': apply H or H' from the Right TRANS (input) CHARACTER*1 = 'N': apply H (No transpose) = 'T': apply H' (Transpose) DIRECT (input) CHARACTER*1 Indicates how H is formed from a product of elementary reflectors = 'F': H = H(1) H(2) . . . H(k) (Forward) = 'B': H = H(k) . . . H(2) H(1) (Backward) STOREV (input) CHARACTER*1 Indicates how the vectors which define the elementary reflectors are stored: = 'C': Columnwise = 'R': Rowwise M (input) INTEGER The number of rows of the matrix C. N (input) INTEGER The number of columns of the matrix C. K (input) INTEGER The order of the matrix T (= the number of elementary reflectors whose product defines the block reflector). V (input) REAL array, dimension (LDV,K) if STOREV = 'C' (LDV,M) if STOREV = 'R' and SIDE = 'L' (LDV,N) if STOREV = 'R' and SIDE = 'R' The matrix V. See further details. LDV (input) INTEGER The leading dimension of the array V. If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); if STOREV = 'R', LDV >= K. T (input) REAL array, dimension (LDT,K) The triangular k by k matrix T in the representation of the block reflector. LDT (input) INTEGER The leading dimension of the array T. LDT >= K. C (input/output) REAL array, dimension (LDC,N) On entry, the m by n matrix C. On exit, C is overwritten by H*C or H'*C or C*H or C*H'. LDC (input) INTEGER The leading dimension of the array C. LDA >= max(1,M). WORK (workspace) REAL array, dimension (LDWORK,K) LDWORK (input) INTEGER The leading dimension of the array WORK. If SIDE = 'L', LDWORK >= max(1,N); if SIDE = 'R', LDWORK >= max(1,M). ===================================================================== Quick return if possible Parameter adjustments Function Body */ /* Table of constant values */ static integer c__1 = 1; static real c_b14 = 1.f; static real c_b25 = -1.f; /* System generated locals */ integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, work_offset, i__1, i__2; /* Local variables */ static integer i, j; extern logical lsame_(char *, char *); extern /* Subroutine */ int sgemm_(char *, char *, integer *, integer *, integer *, real *, real *, integer *, real *, integer *, real *, real *, integer *), scopy_(integer *, real *, integer *, real *, integer *), strmm_(char *, char *, char *, char *, integer *, integer *, real *, real *, integer *, real *, integer *); static char transt[1];#define V(I,J) v[(I)-1 + ((J)-1)* ( *ldv)]#define T(I,J) t[(I)-1 + ((J)-1)* ( *ldt)]#define C(I,J) c[(I)-1 + ((J)-1)* ( *ldc)]#define WORK(I,J) work[(I)-1 + ((J)-1)* ( *ldwork)] if (*m <= 0 || *n <= 0) { return 0; } if (lsame_(trans, "N")) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } if (lsame_(storev, "C")) { if (lsame_(direct, "F")) {/* Let V = ( V1 ) (first K rows) ( V2 ) where V1 is unit lower triangular. */ if (lsame_(side, "L")) {/* Form H * C or H' * C where C = ( C1 ) ( C2 ) W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK) W := C1' */ i__1 = *k; for (j = 1; j <= *k; ++j) { scopy_(n, &C(j,1), ldc, &WORK(1,j), & c__1);/* L10: */ }/* W := W * V1 */ strmm_("Right", "Lower", "No transpose", "Unit", n, k, &c_b14, &V(1,1), ldv, &WORK(1,1), ldwork); if (*m > *k) {/* W := W + C2'*V2 */ i__1 = *m - *k; sgemm_("Transpose", "No transpose", n, k, &i__1, &c_b14, & C(*k+1,1), ldc, &V(*k+1,1), ldv, &c_b14, &WORK(1,1), ldwork); }/* W := W * T' or W * T */ strmm_("Right", "Upper", transt, "Non-unit", n, k, &c_b14, &T(1,1), ldt, &WORK(1,1), ldwork);/* C := C - V * W' */ if (*m > *k) {/* C2 := C2 - V2 * W' */ i__1 = *m - *k; sgemm_("No transpose", "Transpose", &i__1, n, k, &c_b25, & V(*k+1,1), ldv, &WORK(1,1), ldwork, &c_b14, &C(*k+1,1), ldc) ; }/* W := W * V1' */ strmm_("Right", "Lower", "Transpose", "Unit", n, k, &c_b14, & V(1,1), ldv, &WORK(1,1), ldwork);/* C1 := C1 - W' */ i__1 = *k; for (j = 1; j <= *k; ++j) { i__2 = *n; for (i = 1; i <= *n; ++i) { C(j,i) -= WORK(i,j);/* L20: */ }/* L30: */ } } else if (lsame_(side, "R")) {/* Form C * H or C * H' where C = ( C1 C2 ) W := C * V = (C1*V1 + C2*V2) (stored in WORK) W := C1 */ i__1 = *k; for (j = 1; j <= *k; ++j) { scopy_(m, &C(1,j), &c__1, &WORK(1,j), &c__1);/* L40: */ }/* W := W * V1 */ strmm_("Right", "Lower", "No transpose", "Unit", m, k, &c_b14, &V(1,1), ldv, &WORK(1,1), ldwork); if (*n > *k) {/* W := W + C2 * V2 */ i__1 = *n - *k; sgemm_("No transpose", "No transpose", m, k, &i__1, & c_b14, &C(1,*k+1), ldc, &V(*k+1,1), ldv, &c_b14, &WORK(1,1), ldwork); }/* W := W * T or W * T' */ strmm_("Right", "Upper", trans, "Non-unit", m, k, &c_b14, &T(1,1), ldt, &WORK(1,1), ldwork);/* C := C - W * V' */ if (*n > *k) {/* C2 := C2 - W * V2' */ i__1 = *n - *k; sgemm_("No transpose", "Transpose", m, &i__1, k, &c_b25, & WORK(1,1), ldwork, &V(*k+1,1), ldv, &c_b14, &C(1,*k+1), ldc); }/* W := W * V1' */ strmm_("Right", "Lower", "Transpose", "Unit", m, k, &c_b14, & V(1,1), ldv, &WORK(1,1), ldwork);/* C1 := C1 - W */ i__1 = *k; for (j = 1; j <= *k; ++j) { i__2 = *m; for (i = 1; i <= *m; ++i) { C(i,j) -= WORK(i,j);/* L50: */ }/* L60: */ } } } else {/* Let V = ( V1 ) ( V2 ) (last K rows) where V2 is unit upper triangular. */ if (lsame_(side, "L")) {/* Form H * C or H' * C where C = ( C1 ) ( C2 ) W := C' * V = (C1'*V1 + C2'*V2) (stored in WORK) W := C2' */ i__1 = *k; for (j = 1; j <= *k; ++j) { scopy_(n, &C(*m-*k+j,1), ldc, &WORK(1,j), &c__1);/* L70: */ }/* W := W * V2 */ strmm_("Right", "Upper", "No transpose", "Unit", n, k, &c_b14, &V(*m-*k+1,1), ldv, &WORK(1,1), ldwork); if (*m > *k) {/* W := W + C1'*V1 */ i__1 = *m - *k; sgemm_("Transpose", "No transpose", n, k, &i__1, &c_b14, & C(1,1), ldc, &V(1,1), ldv, &c_b14, & WORK(1,1), ldwork); }/* W := W * T' or W * T */ strmm_("Right", "Lower", transt, "Non-unit", n, k, &c_b14, &T(1,1), ldt, &WORK(1,1), ldwork);/* C := C - V * W' */ if (*m > *k) {/* C1 := C1 - V1 * W' */ i__1 = *m - *k; sgemm_("No transpose", "Transpose", &i__1, n, k, &c_b25, & V(1,1), ldv, &WORK(1,1), ldwork, & c_b14, &C(1,1), ldc); }/* W := W * V2' */ strmm_("Right", "Upper", "Transpose", "Unit", n, k, &c_b14, & V(*m-*k+1,1), ldv, &WORK(1,1), ldwork);/* C2 := C2 - W' */ i__1 = *k; for (j = 1; j <= *k; ++j) { i__2 = *n; for (i = 1; i <= *n; ++i) { C(*m-*k+j,i) -= WORK(i,j) ;/* L80: */ }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?