slansy.c
来自「NIST Handwriting OCR Testbed」· C语言 代码 · 共 230 行
C
230 行
/** ======================================================================* 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>doublereal slansy_(char *norm, char *uplo, integer *n, real *a, integer *lda, 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 October 31, 1992 Purpose ======= SLANSY returns the value of the one norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a real symmetric matrix A. Description =========== SLANSY returns the value SLANSY = ( max(abs(A(i,j))), NORM = 'M' or 'm' ( ( norm1(A), NORM = '1', 'O' or 'o' ( ( normI(A), NORM = 'I' or 'i' ( ( normF(A), NORM = 'F', 'f', 'E' or 'e' where norm1 denotes the one norm of a matrix (maximum column sum), normI denotes the infinity norm of a matrix (maximum row sum) and normF denotes the Frobenius norm of a matrix (square root of sum of squares). Note that max(abs(A(i,j))) is not a matrix norm. Arguments ========= NORM (input) CHARACTER*1 Specifies the value to be returned in SLANSY as described above. UPLO (input) CHARACTER*1 Specifies whether the upper or lower triangular part of the symmetric matrix A is to be referenced. = 'U': Upper triangular part of A is referenced = 'L': Lower triangular part of A is referenced N (input) INTEGER The order of the matrix A. N >= 0. When N = 0, SLANSY is set to zero. A (input) REAL array, dimension (LDA,N) The symmetric matrix A. If UPLO = 'U', the leading n by n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading n by n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. LDA (input) INTEGER The leading dimension of the array A. LDA >= max(N,1). WORK (workspace) REAL array, dimension (LWORK), where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, WORK is not referenced. ===================================================================== Parameter adjustments Function Body */ /* Table of constant values */ static integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; real ret_val, r__1, r__2, r__3; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ static real absa; static integer i, j; static real scale; extern logical lsame_(char *, char *); static real value; extern /* Subroutine */ int slassq_(integer *, real *, integer *, real *, real *); static real sum;#define WORK(I) work[(I)-1]#define A(I,J) a[(I)-1 + ((J)-1)* ( *lda)] if (*n == 0) { value = 0.f; } else if (lsame_(norm, "M")) {/* Find max(abs(A(i,j))). */ value = 0.f; if (lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= *n; ++j) { i__2 = j; for (i = 1; i <= j; ++i) {/* Computing MAX */ r__2 = value, r__3 = (r__1 = A(i,j), dabs(r__1) ); value = dmax(r__2,r__3);/* L10: */ }/* L20: */ } } else { i__1 = *n; for (j = 1; j <= *n; ++j) { i__2 = *n; for (i = j; i <= *n; ++i) {/* Computing MAX */ r__2 = value, r__3 = (r__1 = A(i,j), dabs(r__1) ); value = dmax(r__2,r__3);/* L30: */ }/* L40: */ } } } else if (lsame_(norm, "I") || lsame_(norm, "O") || *( unsigned char *)norm == '1') {/* Find normI(A) ( = norm1(A), since A is symmetric). */ value = 0.f; if (lsame_(uplo, "U")) { i__1 = *n; for (j = 1; j <= *n; ++j) { sum = 0.f; i__2 = j - 1; for (i = 1; i <= j-1; ++i) { absa = (r__1 = A(i,j), dabs(r__1)); sum += absa; WORK(i) += absa;/* L50: */ } WORK(j) = sum + (r__1 = A(j,j), dabs(r__1));/* L60: */ } i__1 = *n; for (i = 1; i <= *n; ++i) {/* Computing MAX */ r__1 = value, r__2 = WORK(i); value = dmax(r__1,r__2);/* L70: */ } } else { i__1 = *n; for (i = 1; i <= *n; ++i) { WORK(i) = 0.f;/* L80: */ } i__1 = *n; for (j = 1; j <= *n; ++j) { sum = WORK(j) + (r__1 = A(j,j), dabs(r__1)); i__2 = *n; for (i = j + 1; i <= *n; ++i) { absa = (r__1 = A(i,j), dabs(r__1)); sum += absa; WORK(i) += absa;/* L90: */ } value = dmax(value,sum);/* L100: */ } } } else if (lsame_(norm, "F") || lsame_(norm, "E")) {/* Find normF(A). */ scale = 0.f; sum = 1.f; if (lsame_(uplo, "U")) { i__1 = *n; for (j = 2; j <= *n; ++j) { i__2 = j - 1; slassq_(&i__2, &A(1,j), &c__1, &scale, &sum);/* L110: */ } } else { i__1 = *n - 1; for (j = 1; j <= *n-1; ++j) { i__2 = *n - j; slassq_(&i__2, &A(j+1,j), &c__1, &scale, &sum);/* L120: */ } } sum *= 2; i__1 = *lda + 1; slassq_(n, &A(1,1), &i__1, &scale, &sum); value = scale * sqrt(sum); } ret_val = value; return ret_val;/* End of SLANSY */} /* slansy_ */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?