LAPACK 3.12.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ dgelsx()

subroutine dgelsx ( integer  m,
integer  n,
integer  nrhs,
double precision, dimension( lda, * )  a,
integer  lda,
double precision, dimension( ldb, * )  b,
integer  ldb,
integer, dimension( * )  jpvt,
double precision  rcond,
integer  rank,
double precision, dimension( * )  work,
integer  info 
)

DGELSX solves overdetermined or underdetermined systems for GE matrices

Download DGELSX + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 This routine is deprecated and has been replaced by routine DGELSY.

 DGELSX computes the minimum-norm solution to a real linear least
 squares problem:
     minimize || A * X - B ||
 using a complete orthogonal factorization of A.  A is an M-by-N
 matrix which may be rank-deficient.

 Several right hand side vectors b and solution vectors x can be
 handled in a single call; they are stored as the columns of the
 M-by-NRHS right hand side matrix B and the N-by-NRHS solution
 matrix X.

 The routine first computes a QR factorization with column pivoting:
     A * P = Q * [ R11 R12 ]
                 [  0  R22 ]
 with R11 defined as the largest leading submatrix whose estimated
 condition number is less than 1/RCOND.  The order of R11, RANK,
 is the effective rank of A.

 Then, R22 is considered to be negligible, and R12 is annihilated
 by orthogonal transformations from the right, arriving at the
 complete orthogonal factorization:
    A * P = Q * [ T11 0 ] * Z
                [  0  0 ]
 The minimum-norm solution is then
    X = P * Z**T [ inv(T11)*Q1**T*B ]
                 [        0         ]
 where Q1 consists of the first RANK columns of Q.
Parameters
[in]M
          M is INTEGER
          The number of rows of the matrix A.  M >= 0.
[in]N
          N is INTEGER
          The number of columns of the matrix A.  N >= 0.
[in]NRHS
          NRHS is INTEGER
          The number of right hand sides, i.e., the number of
          columns of matrices B and X. NRHS >= 0.
[in,out]A
          A is DOUBLE PRECISION array, dimension (LDA,N)
          On entry, the M-by-N matrix A.
          On exit, A has been overwritten by details of its
          complete orthogonal factorization.
[in]LDA
          LDA is INTEGER
          The leading dimension of the array A.  LDA >= max(1,M).
[in,out]B
          B is DOUBLE PRECISION array, dimension (LDB,NRHS)
          On entry, the M-by-NRHS right hand side matrix B.
          On exit, the N-by-NRHS solution matrix X.
          If m >= n and RANK = n, the residual sum-of-squares for
          the solution in the i-th column is given by the sum of
          squares of elements N+1:M in that column.
[in]LDB
          LDB is INTEGER
          The leading dimension of the array B. LDB >= max(1,M,N).
[in,out]JPVT
          JPVT is INTEGER array, dimension (N)
          On entry, if JPVT(i) .ne. 0, the i-th column of A is an
          initial column, otherwise it is a free column.  Before
          the QR factorization of A, all initial columns are
          permuted to the leading positions; only the remaining
          free columns are moved as a result of column pivoting
          during the factorization.
          On exit, if JPVT(i) = k, then the i-th column of A*P
          was the k-th column of A.
[in]RCOND
          RCOND is DOUBLE PRECISION
          RCOND is used to determine the effective rank of A, which
          is defined as the order of the largest leading triangular
          submatrix R11 in the QR factorization with pivoting of A,
          whose estimated condition number < 1/RCOND.
[out]RANK
          RANK is INTEGER
          The effective rank of A, i.e., the order of the submatrix
          R11.  This is the same as the order of the submatrix T11
          in the complete orthogonal factorization of A.
[out]WORK
          WORK is DOUBLE PRECISION array, dimension
                      (max( min(M,N)+3*N, 2*min(M,N)+NRHS )),
[out]INFO
          INFO is INTEGER
          = 0:  successful exit
          < 0:  if INFO = -i, the i-th argument had an illegal value
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.

Definition at line 176 of file dgelsx.f.

178*
179* -- LAPACK driver routine --
180* -- LAPACK is a software package provided by Univ. of Tennessee, --
181* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
182*
183* .. Scalar Arguments ..
184 INTEGER INFO, LDA, LDB, M, N, NRHS, RANK
185 DOUBLE PRECISION RCOND
186* ..
187* .. Array Arguments ..
188 INTEGER JPVT( * )
189 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), WORK( * )
190* ..
191*
192* =====================================================================
193*
194* .. Parameters ..
195 INTEGER IMAX, IMIN
196 parameter( imax = 1, imin = 2 )
197 DOUBLE PRECISION ZERO, ONE, DONE, NTDONE
198 parameter( zero = 0.0d0, one = 1.0d0, done = zero,
199 $ ntdone = one )
200* ..
201* .. Local Scalars ..
202 INTEGER I, IASCL, IBSCL, ISMAX, ISMIN, J, K, MN
203 DOUBLE PRECISION ANRM, BIGNUM, BNRM, C1, C2, S1, S2, SMAX,
204 $ SMAXPR, SMIN, SMINPR, SMLNUM, T1, T2
205* ..
206* .. External Functions ..
207 DOUBLE PRECISION DLAMCH, DLANGE
208 EXTERNAL dlamch, dlange
209* ..
210* .. External Subroutines ..
211 EXTERNAL dgeqpf, dlaic1, dlascl, dlaset, dlatzm, dorm2r,
213* ..
214* .. Intrinsic Functions ..
215 INTRINSIC abs, max, min
216* ..
217* .. Executable Statements ..
218*
219 mn = min( m, n )
220 ismin = mn + 1
221 ismax = 2*mn + 1
222*
223* Test the input arguments.
224*
225 info = 0
226 IF( m.LT.0 ) THEN
227 info = -1
228 ELSE IF( n.LT.0 ) THEN
229 info = -2
230 ELSE IF( nrhs.LT.0 ) THEN
231 info = -3
232 ELSE IF( lda.LT.max( 1, m ) ) THEN
233 info = -5
234 ELSE IF( ldb.LT.max( 1, m, n ) ) THEN
235 info = -7
236 END IF
237*
238 IF( info.NE.0 ) THEN
239 CALL xerbla( 'DGELSX', -info )
240 RETURN
241 END IF
242*
243* Quick return if possible
244*
245 IF( min( m, n, nrhs ).EQ.0 ) THEN
246 rank = 0
247 RETURN
248 END IF
249*
250* Get machine parameters
251*
252 smlnum = dlamch( 'S' ) / dlamch( 'P' )
253 bignum = one / smlnum
254*
255* Scale A, B if max elements outside range [SMLNUM,BIGNUM]
256*
257 anrm = dlange( 'M', m, n, a, lda, work )
258 iascl = 0
259 IF( anrm.GT.zero .AND. anrm.LT.smlnum ) THEN
260*
261* Scale matrix norm up to SMLNUM
262*
263 CALL dlascl( 'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
264 iascl = 1
265 ELSE IF( anrm.GT.bignum ) THEN
266*
267* Scale matrix norm down to BIGNUM
268*
269 CALL dlascl( 'G', 0, 0, anrm, bignum, m, n, a, lda, info )
270 iascl = 2
271 ELSE IF( anrm.EQ.zero ) THEN
272*
273* Matrix all zero. Return zero solution.
274*
275 CALL dlaset( 'F', max( m, n ), nrhs, zero, zero, b, ldb )
276 rank = 0
277 GO TO 100
278 END IF
279*
280 bnrm = dlange( 'M', m, nrhs, b, ldb, work )
281 ibscl = 0
282 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum ) THEN
283*
284* Scale matrix norm up to SMLNUM
285*
286 CALL dlascl( 'G', 0, 0, bnrm, smlnum, m, nrhs, b, ldb, info )
287 ibscl = 1
288 ELSE IF( bnrm.GT.bignum ) THEN
289*
290* Scale matrix norm down to BIGNUM
291*
292 CALL dlascl( 'G', 0, 0, bnrm, bignum, m, nrhs, b, ldb, info )
293 ibscl = 2
294 END IF
295*
296* Compute QR factorization with column pivoting of A:
297* A * P = Q * R
298*
299 CALL dgeqpf( m, n, a, lda, jpvt, work( 1 ), work( mn+1 ), info )
300*
301* workspace 3*N. Details of Householder rotations stored
302* in WORK(1:MN).
303*
304* Determine RANK using incremental condition estimation
305*
306 work( ismin ) = one
307 work( ismax ) = one
308 smax = abs( a( 1, 1 ) )
309 smin = smax
310 IF( abs( a( 1, 1 ) ).EQ.zero ) THEN
311 rank = 0
312 CALL dlaset( 'F', max( m, n ), nrhs, zero, zero, b, ldb )
313 GO TO 100
314 ELSE
315 rank = 1
316 END IF
317*
318 10 CONTINUE
319 IF( rank.LT.mn ) THEN
320 i = rank + 1
321 CALL dlaic1( imin, rank, work( ismin ), smin, a( 1, i ),
322 $ a( i, i ), sminpr, s1, c1 )
323 CALL dlaic1( imax, rank, work( ismax ), smax, a( 1, i ),
324 $ a( i, i ), smaxpr, s2, c2 )
325*
326 IF( smaxpr*rcond.LE.sminpr ) THEN
327 DO 20 i = 1, rank
328 work( ismin+i-1 ) = s1*work( ismin+i-1 )
329 work( ismax+i-1 ) = s2*work( ismax+i-1 )
330 20 CONTINUE
331 work( ismin+rank ) = c1
332 work( ismax+rank ) = c2
333 smin = sminpr
334 smax = smaxpr
335 rank = rank + 1
336 GO TO 10
337 END IF
338 END IF
339*
340* Logically partition R = [ R11 R12 ]
341* [ 0 R22 ]
342* where R11 = R(1:RANK,1:RANK)
343*
344* [R11,R12] = [ T11, 0 ] * Y
345*
346 IF( rank.LT.n )
347 $ CALL dtzrqf( rank, n, a, lda, work( mn+1 ), info )
348*
349* Details of Householder rotations stored in WORK(MN+1:2*MN)
350*
351* B(1:M,1:NRHS) := Q**T * B(1:M,1:NRHS)
352*
353 CALL dorm2r( 'Left', 'Transpose', m, nrhs, mn, a, lda, work( 1 ),
354 $ b, ldb, work( 2*mn+1 ), info )
355*
356* workspace NRHS
357*
358* B(1:RANK,1:NRHS) := inv(T11) * B(1:RANK,1:NRHS)
359*
360 CALL dtrsm( 'Left', 'Upper', 'No transpose', 'Non-unit', rank,
361 $ nrhs, one, a, lda, b, ldb )
362*
363 DO 40 i = rank + 1, n
364 DO 30 j = 1, nrhs
365 b( i, j ) = zero
366 30 CONTINUE
367 40 CONTINUE
368*
369* B(1:N,1:NRHS) := Y**T * B(1:N,1:NRHS)
370*
371 IF( rank.LT.n ) THEN
372 DO 50 i = 1, rank
373 CALL dlatzm( 'Left', n-rank+1, nrhs, a( i, rank+1 ), lda,
374 $ work( mn+i ), b( i, 1 ), b( rank+1, 1 ), ldb,
375 $ work( 2*mn+1 ) )
376 50 CONTINUE
377 END IF
378*
379* workspace NRHS
380*
381* B(1:N,1:NRHS) := P * B(1:N,1:NRHS)
382*
383 DO 90 j = 1, nrhs
384 DO 60 i = 1, n
385 work( 2*mn+i ) = ntdone
386 60 CONTINUE
387 DO 80 i = 1, n
388 IF( work( 2*mn+i ).EQ.ntdone ) THEN
389 IF( jpvt( i ).NE.i ) THEN
390 k = i
391 t1 = b( k, j )
392 t2 = b( jpvt( k ), j )
393 70 CONTINUE
394 b( jpvt( k ), j ) = t1
395 work( 2*mn+k ) = done
396 t1 = t2
397 k = jpvt( k )
398 t2 = b( jpvt( k ), j )
399 IF( jpvt( k ).NE.i )
400 $ GO TO 70
401 b( i, j ) = t1
402 work( 2*mn+k ) = done
403 END IF
404 END IF
405 80 CONTINUE
406 90 CONTINUE
407*
408* Undo scaling
409*
410 IF( iascl.EQ.1 ) THEN
411 CALL dlascl( 'G', 0, 0, anrm, smlnum, n, nrhs, b, ldb, info )
412 CALL dlascl( 'U', 0, 0, smlnum, anrm, rank, rank, a, lda,
413 $ info )
414 ELSE IF( iascl.EQ.2 ) THEN
415 CALL dlascl( 'G', 0, 0, anrm, bignum, n, nrhs, b, ldb, info )
416 CALL dlascl( 'U', 0, 0, bignum, anrm, rank, rank, a, lda,
417 $ info )
418 END IF
419 IF( ibscl.EQ.1 ) THEN
420 CALL dlascl( 'G', 0, 0, smlnum, bnrm, n, nrhs, b, ldb, info )
421 ELSE IF( ibscl.EQ.2 ) THEN
422 CALL dlascl( 'G', 0, 0, bignum, bnrm, n, nrhs, b, ldb, info )
423 END IF
424*
425 100 CONTINUE
426*
427 RETURN
428*
429* End of DGELSX
430*
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine dgeqpf(m, n, a, lda, jpvt, tau, work, info)
DGEQPF
Definition dgeqpf.f:142
subroutine dlatzm(side, m, n, v, incv, tau, c1, c2, ldc, work)
DLATZM
Definition dlatzm.f:151
subroutine dtzrqf(m, n, a, lda, tau, info)
DTZRQF
Definition dtzrqf.f:138
subroutine dlaic1(job, j, x, sest, w, gamma, sestpr, s, c)
DLAIC1 applies one step of incremental condition estimation.
Definition dlaic1.f:134
double precision function dlamch(cmach)
DLAMCH
Definition dlamch.f:69
double precision function dlange(norm, m, n, a, lda, work)
DLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
Definition dlange.f:114
subroutine dlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
Definition dlascl.f:143
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
Definition dlaset.f:110
subroutine dtrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
DTRSM
Definition dtrsm.f:181
subroutine dorm2r(side, trans, m, n, k, a, lda, tau, c, ldc, work, info)
DORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sge...
Definition dorm2r.f:159
Here is the call graph for this function: