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 + -
显示快捷键?