slarft.c
来自「NIST Handwriting OCR Testbed」· C语言 代码 · 共 268 行
C
268 行
/** ======================================================================* 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 slarft_(char *direct, char *storev, integer *n, integer * k, real *v, integer *ldv, real *tau, real *t, integer *ldt){/* -- 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 ======= SLARFT forms the triangular factor T of a real block reflector H of order n, which is defined as a product of k elementary reflectors. If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. If STOREV = 'C', the vector which defines the elementary reflector H(i) is stored in the i-th column of the array V, and H = I - V * T * V' If STOREV = 'R', the vector which defines the elementary reflector H(i) is stored in the i-th row of the array V, and H = I - V' * T * V Arguments ========= DIRECT (input) CHARACTER*1 Specifies the order in which the elementary reflectors are multiplied to form the block reflector: = 'F': H = H(1) H(2) . . . H(k) (Forward) = 'B': H = H(k) . . . H(2) H(1) (Backward) STOREV (input) CHARACTER*1 Specifies how the vectors which define the elementary reflectors are stored (see also Further Details): = 'C': columnwise = 'R': rowwise N (input) INTEGER The order of the block reflector H. N >= 0. K (input) INTEGER The order of the triangular factor T (= the number of elementary reflectors). K >= 1. V (input/output) REAL array, dimension (LDV,K) if STOREV = 'C' (LDV,N) if STOREV = 'R' The matrix V. See further details. LDV (input) INTEGER The leading dimension of the array V. If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. TAU (input) REAL array, dimension (K) TAU(i) must contain the scalar factor of the elementary reflector H(i). T (output) REAL array, dimension (LDT,K) The k by k triangular factor T of the block reflector. If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is lower triangular. The rest of the array is not used. LDT (input) INTEGER The leading dimension of the array T. LDT >= K. Further Details =============== The shape of the matrix V and the storage of the vectors which define the H(i) is best illustrated by the following example with n = 5 and k = 3. The elements equal to 1 are not stored; the corresponding array elements are modified but restored on exit. The rest of the array is not used. DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) ( v1 1 ) ( 1 v2 v2 v2 ) ( v1 v2 1 ) ( 1 v3 v3 ) ( v1 v2 v3 ) ( v1 v2 v3 ) DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': V = ( v1 v2 v3 ) V = ( v1 v1 1 ) ( v1 v2 v3 ) ( v2 v2 v2 1 ) ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) ( 1 v3 ) ( 1 ) ===================================================================== Quick return if possible Parameter adjustments Function Body */ /* Table of constant values */ static integer c__1 = 1; static real c_b8 = 0.f; /* System generated locals */ integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3; real r__1; /* Local variables */ static integer i, j; extern logical lsame_(char *, char *); extern /* Subroutine */ int sgemv_(char *, integer *, integer *, real *, real *, integer *, real *, integer *, real *, real *, integer *), strmv_(char *, char *, char *, integer *, real *, integer *, real *, integer *); static real vii;#define TAU(I) tau[(I)-1]#define V(I,J) v[(I)-1 + ((J)-1)* ( *ldv)]#define T(I,J) t[(I)-1 + ((J)-1)* ( *ldt)] if (*n == 0) { return 0; } if (lsame_(direct, "F")) { i__1 = *k; for (i = 1; i <= *k; ++i) { if (TAU(i) == 0.f) {/* H(i) = I */ i__2 = i; for (j = 1; j <= i; ++j) { T(j,i) = 0.f;/* L10: */ } } else {/* general case */ vii = V(i,i); V(i,i) = 1.f; if (lsame_(storev, "C")) {/* T(1:i-1,i) := - tau(i) * V(i:n,1:i-1)' * V(i:n,i) */ i__2 = *n - i + 1; i__3 = i - 1; r__1 = -(doublereal)TAU(i); sgemv_("Transpose", &i__2, &i__3, &r__1, &V(i,1), ldv, &V(i,i), &c__1, &c_b8, &T(1,i), &c__1); } else {/* T(1:i-1,i) := - tau(i) * V(1:i-1,i:n) * V(i,i:n)' */ i__2 = i - 1; i__3 = *n - i + 1; r__1 = -(doublereal)TAU(i); sgemv_("No transpose", &i__2, &i__3, &r__1, &V(1,i), ldv, &V(i,i), ldv, &c_b8, &T(1,i), &c__1); } V(i,i) = vii;/* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */ i__2 = i - 1; strmv_("Upper", "No transpose", "Non-unit", &i__2, &T(1,1), ldt, &T(1,i), &c__1); T(i,i) = TAU(i); }/* L20: */ } } else { for (i = *k; i >= 1; --i) { if (TAU(i) == 0.f) {/* H(i) = I */ i__1 = *k; for (j = i; j <= *k; ++j) { T(j,i) = 0.f;/* L30: */ } } else {/* general case */ if (i < *k) { if (lsame_(storev, "C")) { vii = V(*n-*k+i,i); V(*n-*k+i,i) = 1.f;/* T(i+1:k,i) := - tau(i) * V(1:n-k+i,i+1:k)' * V(1:n-k+i,i) */ i__1 = *n - *k + i; i__2 = *k - i; r__1 = -(doublereal)TAU(i); sgemv_("Transpose", &i__1, &i__2, &r__1, &V(1,i+1), ldv, &V(1,i), &c__1, & c_b8, &T(i+1,i), &c__1); V(*n-*k+i,i) = vii; } else { vii = V(i,*n-*k+i); V(i,*n-*k+i) = 1.f;/* T(i+1:k,i) := - tau(i) * V(i+1:k,1:n-k+i) * V(i,1:n-k+i)' */ i__1 = *k - i; i__2 = *n - *k + i; r__1 = -(doublereal)TAU(i); sgemv_("No transpose", &i__1, &i__2, &r__1, &V(i+1,1), ldv, &V(i,1), ldv, &c_b8, & T(i+1,i), &c__1); V(i,*n-*k+i) = vii; }/* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */ i__1 = *k - i; strmv_("Lower", "No transpose", "Non-unit", &i__1, &T(i+1,i+1), ldt, &T(i+1,i) , &c__1); } T(i,i) = TAU(i); }/* L40: */ } } return 0;/* End of SLARFT */} /* slarft_ */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?