141 SUBROUTINE sgeqpf( M, N, A, LDA, JPVT, TAU, WORK, INFO )
148 INTEGER info, lda, m, n
152 REAL a( lda, * ), tau( * ), work( * )
159 parameter( zero = 0.0e+0, one = 1.0e+0 )
162 INTEGER i, itemp, j, ma, mn, pvt
163 REAL aii, temp, temp2, tol3z
169 INTRINSIC abs, max, min, sqrt
183 ELSE IF( n.LT.0 )
THEN 185 ELSE IF( lda.LT.max( 1, m ) )
THEN 189 CALL xerbla(
'SGEQPF', -info )
194 tol3z = sqrt(
slamch(
'Epsilon'))
200 IF( jpvt( i ).NE.0 )
THEN 201 IF( i.NE.itemp )
THEN 202 CALL sswap( m, a( 1, i ), 1, a( 1, itemp ), 1 )
203 jpvt( i ) = jpvt( itemp )
217 IF( itemp.GT.0 )
THEN 219 CALL sgeqr2( m, ma, a, lda, tau, work, info )
221 CALL sorm2r(
'Left',
'Transpose', m, n-ma, ma, a, lda, tau,
222 $ a( 1, ma+1 ), lda, work, info )
226 IF( itemp.LT.mn )
THEN 231 DO 20 i = itemp + 1, n
232 work( i ) =
snrm2( m-itemp, a( itemp+1, i ), 1 )
233 work( n+i ) = work( i )
238 DO 40 i = itemp + 1, mn
242 pvt = ( i-1 ) +
isamax( n-i+1, work( i ), 1 )
245 CALL sswap( m, a( 1, pvt ), 1, a( 1, i ), 1 )
247 jpvt( pvt ) = jpvt( i )
249 work( pvt ) = work( i )
250 work( n+pvt ) = work( n+i )
256 CALL slarfg( m-i+1, a( i, i ), a( i+1, i ), 1, tau( i ) )
258 CALL slarfg( 1, a( m, m ), a( m, m ), 1, tau( m ) )
267 CALL slarf(
'LEFT', m-i+1, n-i, a( i, i ), 1, tau( i ),
268 $ a( i, i+1 ), lda, work( 2*n+1 ) )
275 IF( work( j ).NE.zero )
THEN 280 temp = abs( a( i, j ) ) / work( j )
281 temp = max( zero, ( one+temp )*( one-temp ) )
282 temp2 = temp*( work( j ) / work( n+j ) )**2
283 IF( temp2 .LE. tol3z )
THEN 285 work( j ) =
snrm2( m-i, a( i+1, j ), 1 )
286 work( n+j ) = work( j )
292 work( j ) = work( j )*sqrt( temp )
subroutine sorm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
SORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sge...
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sgeqr2(M, N, A, LDA, TAU, WORK, INFO)
SGEQR2 computes the QR factorization of a general rectangular matrix using an unblocked algorithm...
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
real(wp) function snrm2(n, x, incx)
SNRM2
subroutine slarf(SIDE, M, N, V, INCV, TAU, C, LDC, WORK)
SLARF applies an elementary reflector to a general rectangular matrix.
subroutine slarfg(N, ALPHA, X, INCX, TAU)
SLARFG generates an elementary reflector (Householder matrix).
real function slamch(CMACH)
SLAMCH
integer function isamax(N, SX, INCX)
ISAMAX