sgeqpf.f.html

来自「famous linear algebra library (LAPACK) p」· HTML 代码 · 共 256 行 · 第 1/2 页

HTML
256
字号
         INFO = -1
      ELSE IF( N.LT.0 ) THEN
         INFO = -2
      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
         INFO = -4
      END IF
      IF( INFO.NE.0 ) THEN
         CALL <a name="XERBLA.117"></a><a href="xerbla.f.html#XERBLA.1">XERBLA</a>( <span class="string">'<a name="SGEQPF.117"></a><a href="sgeqpf.f.html#SGEQPF.1">SGEQPF</a>'</span>, -INFO )
         RETURN
      END IF
<span class="comment">*</span><span class="comment">
</span>      MN = MIN( M, N )
      TOL3Z = SQRT(<a name="SLAMCH.122"></a><a href="slamch.f.html#SLAMCH.1">SLAMCH</a>(<span class="string">'Epsilon'</span>))
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment">     Move initial columns up front
</span><span class="comment">*</span><span class="comment">
</span>      ITEMP = 1
      DO 10 I = 1, N
         IF( JPVT( I ).NE.0 ) THEN
            IF( I.NE.ITEMP ) THEN
               CALL SSWAP( M, A( 1, I ), 1, A( 1, ITEMP ), 1 )
               JPVT( I ) = JPVT( ITEMP )
               JPVT( ITEMP ) = I
            ELSE
               JPVT( I ) = I
            END IF
            ITEMP = ITEMP + 1
         ELSE
            JPVT( I ) = I
         END IF
   10 CONTINUE
      ITEMP = ITEMP - 1
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment">     Compute the QR factorization and update remaining columns
</span><span class="comment">*</span><span class="comment">
</span>      IF( ITEMP.GT.0 ) THEN
         MA = MIN( ITEMP, M )
         CALL <a name="SGEQR2.147"></a><a href="sgeqr2.f.html#SGEQR2.1">SGEQR2</a>( M, MA, A, LDA, TAU, WORK, INFO )
         IF( MA.LT.N ) THEN
            CALL <a name="SORM2R.149"></a><a href="sorm2r.f.html#SORM2R.1">SORM2R</a>( <span class="string">'Left'</span>, <span class="string">'Transpose'</span>, M, N-MA, MA, A, LDA, TAU,
     $                   A( 1, MA+1 ), LDA, WORK, INFO )
         END IF
      END IF
<span class="comment">*</span><span class="comment">
</span>      IF( ITEMP.LT.MN ) THEN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment">        Initialize partial column norms. The first n elements of
</span><span class="comment">*</span><span class="comment">        work store the exact column norms.
</span><span class="comment">*</span><span class="comment">
</span>         DO 20 I = ITEMP + 1, N
            WORK( I ) = SNRM2( M-ITEMP, A( ITEMP+1, I ), 1 )
            WORK( N+I ) = WORK( I )
   20    CONTINUE
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment">        Compute factorization
</span><span class="comment">*</span><span class="comment">
</span>         DO 40 I = ITEMP + 1, MN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment">           Determine ith pivot column and swap if necessary
</span><span class="comment">*</span><span class="comment">
</span>            PVT = ( I-1 ) + ISAMAX( N-I+1, WORK( I ), 1 )
<span class="comment">*</span><span class="comment">
</span>            IF( PVT.NE.I ) THEN
               CALL SSWAP( M, A( 1, PVT ), 1, A( 1, I ), 1 )
               ITEMP = JPVT( PVT )
               JPVT( PVT ) = JPVT( I )
               JPVT( I ) = ITEMP
               WORK( PVT ) = WORK( I )
               WORK( N+PVT ) = WORK( N+I )
            END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment">           Generate elementary reflector H(i)
</span><span class="comment">*</span><span class="comment">
</span>            IF( I.LT.M ) THEN
               CALL <a name="SLARFG.184"></a><a href="slarfg.f.html#SLARFG.1">SLARFG</a>( M-I+1, A( I, I ), A( I+1, I ), 1, TAU( I ) )
            ELSE
               CALL <a name="SLARFG.186"></a><a href="slarfg.f.html#SLARFG.1">SLARFG</a>( 1, A( M, M ), A( M, M ), 1, TAU( M ) )
            END IF
<span class="comment">*</span><span class="comment">
</span>            IF( I.LT.N ) THEN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment">              Apply H(i) to A(i:m,i+1:n) from the left
</span><span class="comment">*</span><span class="comment">
</span>               AII = A( I, I )
               A( I, I ) = ONE
               CALL <a name="SLARF.195"></a><a href="slarf.f.html#SLARF.1">SLARF</a>( <span class="string">'LEFT'</span>, M-I+1, N-I, A( I, I ), 1, TAU( I ),
     $                     A( I, I+1 ), LDA, WORK( 2*N+1 ) )
               A( I, I ) = AII
            END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment">           Update partial column norms
</span><span class="comment">*</span><span class="comment">
</span>            DO 30 J = I + 1, N
               IF( WORK( J ).NE.ZERO ) THEN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment">                 NOTE: The following 4 lines follow from the analysis in
</span><span class="comment">*</span><span class="comment">                 Lapack Working Note 176.
</span><span class="comment">*</span><span class="comment">                 
</span>                  TEMP = ABS( A( I, J ) ) / WORK( J )
                  TEMP = MAX( ZERO, ( ONE+TEMP )*( ONE-TEMP ) )
                  TEMP2 = TEMP*( WORK( J ) / WORK( N+J ) )**2
                  IF( TEMP2 .LE. TOL3Z ) THEN 
                     IF( M-I.GT.0 ) THEN
                        WORK( J ) = SNRM2( M-I, A( I+1, J ), 1 )
                        WORK( N+J ) = WORK( J )
                     ELSE
                        WORK( J ) = ZERO
                        WORK( N+J ) = ZERO
                     END IF
                  ELSE
                     WORK( J ) = WORK( J )*SQRT( TEMP )
                  END IF
               END IF
   30       CONTINUE
<span class="comment">*</span><span class="comment">
</span>   40    CONTINUE
      END IF
      RETURN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment">     End of <a name="SGEQPF.229"></a><a href="sgeqpf.f.html#SGEQPF.1">SGEQPF</a>
</span><span class="comment">*</span><span class="comment">
</span>      END

</pre>

 </body>
</html>

⌨️ 快捷键说明

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