stgsja.f.html
来自「famous linear algebra library (LAPACK) p」· HTML 代码 · 共 540 行 · 第 1/3 页
HTML
540 行
</span> DO 20 I = 1, L - 1
DO 10 J = I + 1, L
<span class="comment">*</span><span class="comment">
</span> A1 = ZERO
A2 = ZERO
A3 = ZERO
IF( K+I.LE.M )
$ A1 = A( K+I, N-L+I )
IF( K+J.LE.M )
$ A3 = A( K+J, N-L+J )
<span class="comment">*</span><span class="comment">
</span> B1 = B( I, N-L+I )
B3 = B( J, N-L+J )
<span class="comment">*</span><span class="comment">
</span> IF( UPPER ) THEN
IF( K+I.LE.M )
$ A2 = A( K+I, N-L+J )
B2 = B( I, N-L+J )
ELSE
IF( K+J.LE.M )
$ A2 = A( K+J, N-L+I )
B2 = B( J, N-L+I )
END IF
<span class="comment">*</span><span class="comment">
</span> CALL <a name="SLAGS2.366"></a><a href="slags2.f.html#SLAGS2.1">SLAGS2</a>( UPPER, A1, A2, A3, B1, B2, B3, CSU, SNU,
$ CSV, SNV, CSQ, SNQ )
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Update (K+I)-th and (K+J)-th rows of matrix A: U'*A
</span><span class="comment">*</span><span class="comment">
</span> IF( K+J.LE.M )
$ CALL SROT( L, A( K+J, N-L+1 ), LDA, A( K+I, N-L+1 ),
$ LDA, CSU, SNU )
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Update I-th and J-th rows of matrix B: V'*B
</span><span class="comment">*</span><span class="comment">
</span> CALL SROT( L, B( J, N-L+1 ), LDB, B( I, N-L+1 ), LDB,
$ CSV, SNV )
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Update (N-L+I)-th and (N-L+J)-th columns of matrices
</span><span class="comment">*</span><span class="comment"> A and B: A*Q and B*Q
</span><span class="comment">*</span><span class="comment">
</span> CALL SROT( MIN( K+L, M ), A( 1, N-L+J ), 1,
$ A( 1, N-L+I ), 1, CSQ, SNQ )
<span class="comment">*</span><span class="comment">
</span> CALL SROT( L, B( 1, N-L+J ), 1, B( 1, N-L+I ), 1, CSQ,
$ SNQ )
<span class="comment">*</span><span class="comment">
</span> IF( UPPER ) THEN
IF( K+I.LE.M )
$ A( K+I, N-L+J ) = ZERO
B( I, N-L+J ) = ZERO
ELSE
IF( K+J.LE.M )
$ A( K+J, N-L+I ) = ZERO
B( J, N-L+I ) = ZERO
END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Update orthogonal matrices U, V, Q, if desired.
</span><span class="comment">*</span><span class="comment">
</span> IF( WANTU .AND. K+J.LE.M )
$ CALL SROT( M, U( 1, K+J ), 1, U( 1, K+I ), 1, CSU,
$ SNU )
<span class="comment">*</span><span class="comment">
</span> IF( WANTV )
$ CALL SROT( P, V( 1, J ), 1, V( 1, I ), 1, CSV, SNV )
<span class="comment">*</span><span class="comment">
</span> IF( WANTQ )
$ CALL SROT( N, Q( 1, N-L+J ), 1, Q( 1, N-L+I ), 1, CSQ,
$ SNQ )
<span class="comment">*</span><span class="comment">
</span> 10 CONTINUE
20 CONTINUE
<span class="comment">*</span><span class="comment">
</span> IF( .NOT.UPPER ) THEN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> The matrices A13 and B13 were lower triangular at the start
</span><span class="comment">*</span><span class="comment"> of the cycle, and are now upper triangular.
</span><span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Convergence test: test the parallelism of the corresponding
</span><span class="comment">*</span><span class="comment"> rows of A and B.
</span><span class="comment">*</span><span class="comment">
</span> ERROR = ZERO
DO 30 I = 1, MIN( L, M-K )
CALL SCOPY( L-I+1, A( K+I, N-L+I ), LDA, WORK, 1 )
CALL SCOPY( L-I+1, B( I, N-L+I ), LDB, WORK( L+1 ), 1 )
CALL <a name="SLAPLL.427"></a><a href="slapll.f.html#SLAPLL.1">SLAPLL</a>( L-I+1, WORK, 1, WORK( L+1 ), 1, SSMIN )
ERROR = MAX( ERROR, SSMIN )
30 CONTINUE
<span class="comment">*</span><span class="comment">
</span> IF( ABS( ERROR ).LE.MIN( TOLA, TOLB ) )
$ GO TO 50
END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> End of cycle loop
</span><span class="comment">*</span><span class="comment">
</span> 40 CONTINUE
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> The algorithm has not converged after MAXIT cycles.
</span><span class="comment">*</span><span class="comment">
</span> INFO = 1
GO TO 100
<span class="comment">*</span><span class="comment">
</span> 50 CONTINUE
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> If ERROR <= MIN(TOLA,TOLB), then the algorithm has converged.
</span><span class="comment">*</span><span class="comment"> Compute the generalized singular value pairs (ALPHA, BETA), and
</span><span class="comment">*</span><span class="comment"> set the triangular matrix R to array A.
</span><span class="comment">*</span><span class="comment">
</span> DO 60 I = 1, K
ALPHA( I ) = ONE
BETA( I ) = ZERO
60 CONTINUE
<span class="comment">*</span><span class="comment">
</span> DO 70 I = 1, MIN( L, M-K )
<span class="comment">*</span><span class="comment">
</span> A1 = A( K+I, N-L+I )
B1 = B( I, N-L+I )
<span class="comment">*</span><span class="comment">
</span> IF( A1.NE.ZERO ) THEN
GAMMA = B1 / A1
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> change sign if necessary
</span><span class="comment">*</span><span class="comment">
</span> IF( GAMMA.LT.ZERO ) THEN
CALL SSCAL( L-I+1, -ONE, B( I, N-L+I ), LDB )
IF( WANTV )
$ CALL SSCAL( P, -ONE, V( 1, I ), 1 )
END IF
<span class="comment">*</span><span class="comment">
</span> CALL <a name="SLARTG.471"></a><a href="slartg.f.html#SLARTG.1">SLARTG</a>( ABS( GAMMA ), ONE, BETA( K+I ), ALPHA( K+I ),
$ RWK )
<span class="comment">*</span><span class="comment">
</span> IF( ALPHA( K+I ).GE.BETA( K+I ) ) THEN
CALL SSCAL( L-I+1, ONE / ALPHA( K+I ), A( K+I, N-L+I ),
$ LDA )
ELSE
CALL SSCAL( L-I+1, ONE / BETA( K+I ), B( I, N-L+I ),
$ LDB )
CALL SCOPY( L-I+1, B( I, N-L+I ), LDB, A( K+I, N-L+I ),
$ LDA )
END IF
<span class="comment">*</span><span class="comment">
</span> ELSE
<span class="comment">*</span><span class="comment">
</span> ALPHA( K+I ) = ZERO
BETA( K+I ) = ONE
CALL SCOPY( L-I+1, B( I, N-L+I ), LDB, A( K+I, N-L+I ),
$ LDA )
<span class="comment">*</span><span class="comment">
</span> END IF
<span class="comment">*</span><span class="comment">
</span> 70 CONTINUE
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Post-assignment
</span><span class="comment">*</span><span class="comment">
</span> DO 80 I = M + 1, K + L
ALPHA( I ) = ZERO
BETA( I ) = ONE
80 CONTINUE
<span class="comment">*</span><span class="comment">
</span> IF( K+L.LT.N ) THEN
DO 90 I = K + L + 1, N
ALPHA( I ) = ZERO
BETA( I ) = ZERO
90 CONTINUE
END IF
<span class="comment">*</span><span class="comment">
</span> 100 CONTINUE
NCYCLE = KCYCLE
RETURN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> End of <a name="STGSJA.513"></a><a href="stgsja.f.html#STGSJA.1">STGSJA</a>
</span><span class="comment">*</span><span class="comment">
</span> END
</pre>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?