📄 sgels.f
字号:
IASCL = 1 ELSE IF( ANRM.GT.BIGNUM ) THEN** Scale matrix norm down to BIGNUM* OPCNT( GELS ) = OPCNT( GELS ) + REAL( M*N ) CALL SLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO ) IASCL = 2 ELSE IF( ANRM.EQ.ZERO ) THEN** Matrix all zero. Return zero solution.* CALL SLASET( 'F', MAX( M, N ), NRHS, ZERO, ZERO, B, LDB ) GO TO 50 END IF* BROW = M IF( TPSD ) $ BROW = N BNRM = SLANGE( 'M', BROW, NRHS, B, LDB, RWORK ) IBSCL = 0 IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN** Scale matrix norm up to SMLNUM* OPCNT( GELS ) = OPCNT( GELS ) + REAL( BROW*NRHS ) CALL SLASCL( 'G', 0, 0, BNRM, SMLNUM, BROW, NRHS, B, LDB, $ INFO ) IBSCL = 1 ELSE IF( BNRM.GT.BIGNUM ) THEN** Scale matrix norm down to BIGNUM* OPCNT( GELS ) = OPCNT( GELS ) + REAL( BROW*NRHS ) CALL SLASCL( 'G', 0, 0, BNRM, BIGNUM, BROW, NRHS, B, LDB, $ INFO ) IBSCL = 2 END IF* IF( M.GE.N ) THEN** compute QR factorization of A* NB = ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 ) OPCNT( GEQRF ) = OPCNT( GEQRF ) + $ SOPLA( 'SGEQRF', M, N, 0, 0, NB ) T1 = SECOND( ) CALL SGEQRF( M, N, A, LDA, WORK( 1 ), WORK( MN+1 ), LWORK-MN, $ INFO ) T2 = SECOND( ) TIMNG( GEQRF ) = TIMNG( GEQRF ) + ( T2-T1 )** workspace at least N, optimally N*NB* IF( .NOT.TPSD ) THEN** Least-Squares Problem min || A * X - B ||** B(1:M,1:NRHS) := Q' * B(1:M,1:NRHS)* NB = ILAENV( 1, 'SORMQR', 'LT', M, NRHS, N, -1 ) OPCNT( ORMQR ) = OPCNT( ORMQR ) + $ SOPLA( 'SORMQR', M, NRHS, N, 0, NB ) T1 = SECOND( ) CALL SORMQR( 'Left', 'Transpose', M, NRHS, N, A, LDA, $ WORK( 1 ), B, LDB, WORK( MN+1 ), LWORK-MN, $ INFO ) T2 = SECOND( ) TIMNG( ORMQR ) = TIMNG( ORMQR ) + ( T2-T1 )** workspace at least NRHS, optimally NRHS*NB** B(1:N,1:NRHS) := inv(R) * B(1:N,1:NRHS)* OPCNT( TRSM ) = OPCNT( TRSM ) + $ SOPBL3( 'STRSM ', N, NRHS, 0 ) T1 = SECOND( ) CALL STRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N, $ NRHS, ONE, A, LDA, B, LDB ) T2 = SECOND( ) TIMNG( TRSM ) = TIMNG( TRSM ) + ( T2-T1 )* SCLLEN = N* ELSE** Overdetermined system of equations A' * X = B** B(1:N,1:NRHS) := inv(R') * B(1:N,1:NRHS)* OPCNT( TRSM ) = OPCNT( TRSM ) + $ SOPBL3( 'STRSM ', N, NRHS, 0 ) T1 = SECOND( ) CALL STRSM( 'Left', 'Upper', 'Transpose', 'Non-unit', N, $ NRHS, ONE, A, LDA, B, LDB ) T2 = SECOND( ) TIMNG( TRSM ) = TIMNG( TRSM ) + ( T2-T1 )** B(N+1:M,1:NRHS) = ZERO* DO 20 J = 1, NRHS DO 10 I = N + 1, M B( I, J ) = ZERO 10 CONTINUE 20 CONTINUE** B(1:M,1:NRHS) := Q(1:N,:) * B(1:N,1:NRHS)* NB = ILAENV( 1, 'SORMQR', 'LN', M, NRHS, N, -1 ) OPCNT( ORMQR ) = OPCNT( ORMQR ) + $ SOPLA( 'SORMQR', M, NRHS, N, 0, NB ) T1 = SECOND( ) CALL SORMQR( 'Left', 'No transpose', M, NRHS, N, A, LDA, $ WORK( 1 ), B, LDB, WORK( MN+1 ), LWORK-MN, $ INFO ) T2 = SECOND( ) TIMNG( ORMQR ) = TIMNG( ORMQR ) + ( T2-T1 )** workspace at least NRHS, optimally NRHS*NB* SCLLEN = M* END IF* ELSE** Compute LQ factorization of A* NB = ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 ) OPCNT( GELQF ) = OPCNT( GELQF ) + $ SOPLA( 'SGELQF', M, N, 0, 0, NB ) T1 = SECOND( ) CALL SGELQF( M, N, A, LDA, WORK( 1 ), WORK( MN+1 ), LWORK-MN, $ INFO ) T2 = SECOND( ) TIMNG( GELQF ) = TIMNG( GELQF ) + ( T2-T1 )** workspace at least M, optimally M*NB.* IF( .NOT.TPSD ) THEN** underdetermined system of equations A * X = B** B(1:M,1:NRHS) := inv(L) * B(1:M,1:NRHS)* OPCNT( TRSM ) = OPCNT( TRSM ) + $ SOPBL3( 'STRSM ', M, NRHS, 0 ) T1 = SECOND( ) CALL STRSM( 'Left', 'Lower', 'No transpose', 'Non-unit', M, $ NRHS, ONE, A, LDA, B, LDB ) T2 = SECOND( ) TIMNG( TRSM ) = TIMNG( TRSM ) + ( T2-T1 )** B(M+1:N,1:NRHS) = 0* DO 40 J = 1, NRHS DO 30 I = M + 1, N B( I, J ) = ZERO 30 CONTINUE 40 CONTINUE** B(1:N,1:NRHS) := Q(1:N,:)' * B(1:M,1:NRHS)* NB = ILAENV( 1, 'SORMLQ', 'LT', N, NRHS, M, -1 ) OPCNT( ORMLQ ) = OPCNT( ORMLQ ) + $ SOPLA( 'SORMLQ', N, NRHS, M, 0, NB ) T1 = SECOND( ) CALL SORMLQ( 'Left', 'Transpose', N, NRHS, M, A, LDA, $ WORK( 1 ), B, LDB, WORK( MN+1 ), LWORK-MN, $ INFO ) T2 = SECOND( ) TIMNG( ORMLQ ) = TIMNG( ORMLQ ) + ( T2-T1 )** workspace at least NRHS, optimally NRHS*NB* SCLLEN = N* ELSE** overdetermined system min || A' * X - B ||** B(1:N,1:NRHS) := Q * B(1:N,1:NRHS)* NB = ILAENV( 1, 'SORMLQ', 'LN', N, NRHS, M, -1 ) OPCNT( ORMLQ ) = OPCNT( ORMLQ ) + $ SOPLA( 'SORMLQ', N, NRHS, M, 0, NB ) T1 = SECOND( ) CALL SORMLQ( 'Left', 'No transpose', N, NRHS, M, A, LDA, $ WORK( 1 ), B, LDB, WORK( MN+1 ), LWORK-MN, $ INFO ) T2 = SECOND( ) TIMNG( ORMLQ ) = TIMNG( ORMLQ ) + ( T2-T1 )** workspace at least NRHS, optimally NRHS*NB** B(1:M,1:NRHS) := inv(L') * B(1:M,1:NRHS)* OPCNT( TRSM ) = OPCNT( TRSM ) + $ SOPBL3( 'STRSM ', M, NRHS, 0 ) T1 = SECOND( ) CALL STRSM( 'Left', 'Lower', 'Transpose', 'Non-unit', M, $ NRHS, ONE, A, LDA, B, LDB ) T2 = SECOND( ) TIMNG( TRSM ) = TIMNG( TRSM ) + ( T2-T1 )* SCLLEN = M* END IF* END IF** Undo scaling* IF( IASCL.EQ.1 ) THEN OPCNT( GELS ) = OPCNT( GELS ) + REAL( SCLLEN*NRHS ) CALL SLASCL( 'G', 0, 0, ANRM, SMLNUM, SCLLEN, NRHS, B, LDB, $ INFO ) ELSE IF( IASCL.EQ.2 ) THEN OPCNT( GELS ) = OPCNT( GELS ) + REAL( SCLLEN*NRHS ) CALL SLASCL( 'G', 0, 0, ANRM, BIGNUM, SCLLEN, NRHS, B, LDB, $ INFO ) END IF IF( IBSCL.EQ.1 ) THEN OPCNT( GELS ) = OPCNT( GELS ) + REAL( SCLLEN*NRHS ) CALL SLASCL( 'G', 0, 0, SMLNUM, BNRM, SCLLEN, NRHS, B, LDB, $ INFO ) ELSE IF( IBSCL.EQ.2 ) THEN OPCNT( GELS ) = OPCNT( GELS ) + REAL( SCLLEN*NRHS ) CALL SLASCL( 'G', 0, 0, BIGNUM, BNRM, SCLLEN, NRHS, B, LDB, $ INFO ) END IF* 50 CONTINUE WORK( 1 ) = REAL( WSIZE )* RETURN** End of SGELS* END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -