⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsptrf.c

📁 DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*              Perform a rank-1 update of A(1:k-1,1:k-1) as */

/*              A := A - U(k)*D(k)*U(k)' = A - W(k)*1/D(k)*W(k)' */

/*<                R1 = ONE / AP( KC+K-1 ) >*/
                r1 = 1. / ap[kc + k - 1];
/*<                CALL DSPR( UPLO, K-1, -R1, AP( KC ), 1, AP ) >*/
                i__1 = k - 1;
                d__1 = -r1;
                dspr_(uplo, &i__1, &d__1, &ap[kc], &c__1, &ap[1], (ftnlen)1);

/*              Store U(k) in column k */

/*<                CALL DSCAL( K-1, R1, AP( KC ), 1 ) >*/
                i__1 = k - 1;
                dscal_(&i__1, &r1, &ap[kc], &c__1);
/*<             ELSE >*/
            } else {

/*              2-by-2 pivot block D(k): columns k and k-1 now hold */

/*              ( W(k-1) W(k) ) = ( U(k-1) U(k) )*D(k) */

/*              where U(k) and U(k-1) are the k-th and (k-1)-th columns */
/*              of U */

/*              Perform a rank-2 update of A(1:k-2,1:k-2) as */

/*              A := A - ( U(k-1) U(k) )*D(k)*( U(k-1) U(k) )' */
/*                 = A - ( W(k-1) W(k) )*inv(D(k))*( W(k-1) W(k) )' */

/*              Convert this to two rank-1 updates by using the eigen- */
/*              decomposition of D(k) */

/*<    >*/
                dlaev2_(&ap[kc - 1], &ap[kc + k - 2], &ap[kc + k - 1], &r1, &
                        r2, &c__, &s);
/*<                R1 = ONE / R1 >*/
                r1 = 1. / r1;
/*<                R2 = ONE / R2 >*/
                r2 = 1. / r2;
/*<                CALL DROT( K-2, AP( KNC ), 1, AP( KC ), 1, C, S ) >*/
                i__1 = k - 2;
                drot_(&i__1, &ap[knc], &c__1, &ap[kc], &c__1, &c__, &s);
/*<                CALL DSPR( UPLO, K-2, -R1, AP( KNC ), 1, AP ) >*/
                i__1 = k - 2;
                d__1 = -r1;
                dspr_(uplo, &i__1, &d__1, &ap[knc], &c__1, &ap[1], (ftnlen)1);
/*<                CALL DSPR( UPLO, K-2, -R2, AP( KC ), 1, AP ) >*/
                i__1 = k - 2;
                d__1 = -r2;
                dspr_(uplo, &i__1, &d__1, &ap[kc], &c__1, &ap[1], (ftnlen)1);

/*              Store U(k) and U(k-1) in columns k and k-1 */

/*<                CALL DSCAL( K-2, R1, AP( KNC ), 1 ) >*/
                i__1 = k - 2;
                dscal_(&i__1, &r1, &ap[knc], &c__1);
/*<                CALL DSCAL( K-2, R2, AP( KC ), 1 ) >*/
                i__1 = k - 2;
                dscal_(&i__1, &r2, &ap[kc], &c__1);
/*<                CALL DROT( K-2, AP( KNC ), 1, AP( KC ), 1, C, -S ) >*/
                i__1 = k - 2;
                d__1 = -s;
                drot_(&i__1, &ap[knc], &c__1, &ap[kc], &c__1, &c__, &d__1);
/*<             END IF >*/
            }
/*<          END IF >*/
        }

/*        Store details of the interchanges in IPIV */

/*<          IF( KSTEP.EQ.1 ) THEN >*/
        if (kstep == 1) {
/*<             IPIV( K ) = KP >*/
            ipiv[k] = kp;
/*<          ELSE >*/
        } else {
/*<             IPIV( K ) = -KP >*/
            ipiv[k] = -kp;
/*<             IPIV( K-1 ) = -KP >*/
            ipiv[k - 1] = -kp;
/*<          END IF >*/
        }

/*        Decrease K and return to the start of the main loop */

/*<          K = K - KSTEP >*/
        k -= kstep;
/*<          KC = KNC - K >*/
        kc = knc - k;
/*<          GO TO 10 >*/
        goto L10;

/*<       ELSE >*/
    } else {

/*        Factorize A as L*D*L' using the lower triangle of A */

/*        K is the main loop index, increasing from 1 to N in steps of */
/*        1 or 2 */

/*<          K = 1 >*/
        k = 1;
/*<          KC = 1 >*/
        kc = 1;
/*<          NPP = N*( N+1 ) / 2 >*/
        npp = *n * (*n + 1) / 2;
/*<    40    CONTINUE >*/
L40:
/*<          KNC = KC >*/
        knc = kc;

/*        If K > N, exit from loop */

/*<    >*/
        if (k > *n) {
            goto L70;
        }
/*<          KSTEP = 1 >*/
        kstep = 1;

/*        Determine rows and columns to be interchanged and whether */
/*        a 1-by-1 or 2-by-2 pivot block will be used */

/*<          ABSAKK = ABS( AP( KC ) ) >*/
        absakk = (d__1 = ap[kc], abs(d__1));

/*        IMAX is the row-index of the largest off-diagonal element in */
/*        column K, and COLMAX is its absolute value */

/*<          IF( K.LT.N ) THEN >*/
        if (k < *n) {
/*<             IMAX = K + IDAMAX( N-K, AP( KC+1 ), 1 ) >*/
            i__1 = *n - k;
            imax = k + idamax_(&i__1, &ap[kc + 1], &c__1);
/*<             COLMAX = ABS( AP( KC+IMAX-K ) ) >*/
            colmax = (d__1 = ap[kc + imax - k], abs(d__1));
/*<          ELSE >*/
        } else {
/*<             COLMAX = ZERO >*/
            colmax = 0.;
/*<          END IF >*/
        }

/*<          IF( MAX( ABSAKK, COLMAX ).EQ.ZERO ) THEN >*/
        if (max(absakk,colmax) == 0.) {

/*           Column K is zero: set INFO and continue */

/*<    >*/
            if (*info == 0) {
                *info = k;
            }
/*<             KP = K >*/
            kp = k;
/*<          ELSE >*/
        } else {
/*<             IF( ABSAKK.GE.ALPHA*COLMAX ) THEN >*/
            if (absakk >= alpha * colmax) {

/*              no interchange, use 1-by-1 pivot block */

/*<                KP = K >*/
                kp = k;
/*<             ELSE >*/
            } else {

/*              JMAX is the column-index of the largest off-diagonal */
/*              element in row IMAX, and ROWMAX is its absolute value */

/*<                ROWMAX = ZERO >*/
                rowmax = 0.;
/*<                KX = KC + IMAX - K >*/
                kx = kc + imax - k;
/*<                DO 50 J = K, IMAX - 1 >*/
                i__1 = imax - 1;
                for (j = k; j <= i__1; ++j) {
/*<                   IF( ABS( AP( KX ) ).GT.ROWMAX ) THEN >*/
                    if ((d__1 = ap[kx], abs(d__1)) > rowmax) {
/*<                      ROWMAX = ABS( AP( KX ) ) >*/
                        rowmax = (d__1 = ap[kx], abs(d__1));
/*<                      JMAX = J >*/
                        jmax = j;
/*<                   END IF >*/
                    }
/*<                   KX = KX + N - J >*/
                    kx = kx + *n - j;
/*<    50          CONTINUE >*/
/* L50: */
                }
/*<                KPC = NPP - ( N-IMAX+1 )*( N-IMAX+2 ) / 2 + 1 >*/
                kpc = npp - (*n - imax + 1) * (*n - imax + 2) / 2 + 1;
/*<                IF( IMAX.LT.N ) THEN >*/
                if (imax < *n) {
/*<                   JMAX = IMAX + IDAMAX( N-IMAX, AP( KPC+1 ), 1 ) >*/
                    i__1 = *n - imax;
                    jmax = imax + idamax_(&i__1, &ap[kpc + 1], &c__1);
/*<                   ROWMAX = MAX( ROWMAX, ABS( AP( KPC+JMAX-IMAX ) ) ) >*/
/* Computing MAX */
                    d__2 = rowmax, d__3 = (d__1 = ap[kpc + jmax - imax], abs(
                            d__1));
                    rowmax = max(d__2,d__3);
/*<                END IF >*/
                }

/*<                IF( ABSAKK.GE.ALPHA*COLMAX*( COLMAX / ROWMAX ) ) THEN >*/
                if (absakk >= alpha * colmax * (colmax / rowmax)) {

/*                 no interchange, use 1-by-1 pivot block */

/*<                   KP = K >*/
                    kp = k;
/*<                ELSE IF( ABS( AP( KPC ) ).GE.ALPHA*ROWMAX ) THEN >*/
                } else if ((d__1 = ap[kpc], abs(d__1)) >= alpha * rowmax) {

/*                 interchange rows and columns K and IMAX, use 1-by-1 */
/*                 pivot block */

/*<                   KP = IMAX >*/
                    kp = imax;
/*<                ELSE >*/
                } else {

/*                 interchange rows and columns K+1 and IMAX, use 2-by-2 */
/*                 pivot block */

/*<                   KP = IMAX >*/
                    kp = imax;
/*<                   KSTEP = 2 >*/
                    kstep = 2;
/*<                END IF >*/
                }
/*<             END IF >*/
            }

/*<             KK = K + KSTEP - 1 >*/
            kk = k + kstep - 1;
/*<    >*/
            if (kstep == 2) {
                knc = knc + *n - k + 1;
            }
/*<             IF( KP.NE.KK ) THEN >*/
            if (kp != kk) {

/*              Interchange rows and columns KK and KP in the trailing */
/*              submatrix A(k:n,k:n) */

/*<    >*/
                if (kp < *n) {
                    i__1 = *n - kp;
                    dswap_(&i__1, &ap[knc + kp - kk + 1], &c__1, &ap[kpc + 1],
                             &c__1);
                }
/*<                KX = KNC + KP - KK >*/
                kx = knc + kp - kk;
/*<                DO 60 J = KK + 1, KP - 1 >*/
                i__1 = kp - 1;
                for (j = kk + 1; j <= i__1; ++j) {
/*<                   KX = KX + N - J + 1 >*/
                    kx = kx + *n - j + 1;
/*<                   T = AP( KNC+J-KK ) >*/
                    t = ap[knc + j - kk];
/*<                   AP( KNC+J-KK ) = AP( KX ) >*/
                    ap[knc + j - kk] = ap[kx];
/*<                   AP( KX ) = T >*/
                    ap[kx] = t;
/*<    60          CONTINUE >*/
/* L60: */
                }
/*<                T = AP( KNC ) >*/
                t = ap[knc];
/*<                AP( KNC ) = AP( KPC ) >*/
                ap[knc] = ap[kpc];
/*<                AP( KPC ) = T >*/
                ap[kpc] = t;
/*<                IF( KSTEP.EQ.2 ) THEN >*/
                if (kstep == 2) {
/*<                   T = AP( KC+1 ) >*/
                    t = ap[kc + 1];
/*<                   AP( KC+1 ) = AP( KC+KP-K ) >*/
                    ap[kc + 1] = ap[kc + kp - k];
/*<                   AP( KC+KP-K ) = T >*/
                    ap[kc + kp - k] = t;
/*<                END IF >*/
                }
/*<             END IF >*/
            }

/*           Update the trailing submatrix */

/*<             IF( KSTEP.EQ.1 ) THEN >*/
            if (kstep == 1) {

/*              1-by-1 pivot block D(k): column k now holds */

/*              W(k) = L(k)*D(k) */

/*              where L(k) is the k-th column of L */

/*<                IF( K.LT.N ) THEN >*/
                if (k < *n) {

/*                 Perform a rank-1 update of A(k+1:n,k+1:n) as */

/*                 A := A - L(k)*D(k)*L(k)' = A - W(k)*(1/D(k))*W(k)' */

/*<                   R1 = ONE / AP( KC ) >*/
                    r1 = 1. / ap[kc];
/*<    >*/
                    i__1 = *n - k;
                    d__1 = -r1;
                    dspr_(uplo, &i__1, &d__1, &ap[kc + 1], &c__1, &ap[kc + *n 
                            - k + 1], (ftnlen)1);

/*                 Store L(k) in column K */

/*<                   CALL DSCAL( N-K, R1, AP( KC+1 ), 1 ) >*/
                    i__1 = *n - k;
                    dscal_(&i__1, &r1, &ap[kc + 1], &c__1);
/*<                END IF >*/
                }
/*<             ELSE >*/
            } else {

/*              2-by-2 pivot block D(k): columns K and K+1 now hold */

/*              ( W(k) W(k+1) ) = ( L(k) L(k+1) )*D(k) */

/*              where L(k) and L(k+1) are the k-th and (k+1)-th columns */
/*              of L */

/*<                IF( K.LT.N-1 ) THEN >*/
                if (k < *n - 1) {

/*                 Perform a rank-2 update of A(k+2:n,k+2:n) as */

/*                 A := A - ( L(k) L(k+1) )*D(k)*( L(k) L(k+1) )' */
/*                    = A - ( W(k) W(k+1) )*inv(D(k))*( W(k) W(k+1) )' */

/*                 Convert this to two rank-1 updates by using the eigen- */
/*                 decomposition of D(k) */

/*<    >*/
                    dlaev2_(&ap[kc], &ap[kc + 1], &ap[knc], &r1, &r2, &c__, &
                            s);
/*<                   R1 = ONE / R1 >*/
                    r1 = 1. / r1;
/*<                   R2 = ONE / R2 >*/
                    r2 = 1. / r2;
/*<    >*/
                    i__1 = *n - k - 1;
                    drot_(&i__1, &ap[kc + 2], &c__1, &ap[knc + 1], &c__1, &
                            c__, &s);
/*<    >*/
                    i__1 = *n - k - 1;
                    d__1 = -r1;
                    dspr_(uplo, &i__1, &d__1, &ap[kc + 2], &c__1, &ap[knc + *
                            n - k], (ftnlen)1);
/*<    >*/
                    i__1 = *n - k - 1;
                    d__1 = -r2;
                    dspr_(uplo, &i__1, &d__1, &ap[knc + 1], &c__1, &ap[knc + *
                            n - k], (ftnlen)1);

/*                 Store L(k) and L(k+1) in columns k and k+1 */

/*<                   CALL DSCAL( N-K-1, R1, AP( KC+2 ), 1 ) >*/
                    i__1 = *n - k - 1;
                    dscal_(&i__1, &r1, &ap[kc + 2], &c__1);
/*<                   CALL DSCAL( N-K-1, R2, AP( KNC+1 ), 1 ) >*/
                    i__1 = *n - k - 1;
                    dscal_(&i__1, &r2, &ap[knc + 1], &c__1);
/*<    >*/
                    i__1 = *n - k - 1;
                    d__1 = -s;
                    drot_(&i__1, &ap[kc + 2], &c__1, &ap[knc + 1], &c__1, &
                            c__, &d__1);
/*<                END IF >*/
                }
/*<             END IF >*/
            }
/*<          END IF >*/
        }

/*        Store details of the interchanges in IPIV */

/*<          IF( KSTEP.EQ.1 ) THEN >*/
        if (kstep == 1) {
/*<             IPIV( K ) = KP >*/
            ipiv[k] = kp;
/*<          ELSE >*/
        } else {
/*<             IPIV( K ) = -KP >*/
            ipiv[k] = -kp;
/*<             IPIV( K+1 ) = -KP >*/
            ipiv[k + 1] = -kp;
/*<          END IF >*/
        }

/*        Increase K and return to the start of the main loop */

/*<          K = K + KSTEP >*/
        k += kstep;
/*<          KC = KNC + N - K + 2 >*/
        kc = knc + *n - k + 2;
/*<          GO TO 40 >*/
        goto L40;

/*<       END IF >*/
    }

/*<    70 CONTINUE >*/
L70:
/*<       RETURN >*/
    return 0;

/*     End of DSPTRF */

/*<       END >*/
} /* dsptrf_ */

#ifdef __cplusplus
        }
#endif

⌨️ 快捷键说明

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