223 SUBROUTINE cgelsd( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK,
224 $ WORK, LWORK, RWORK, IWORK, INFO )
231 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS, RANK
236 REAL RWORK( * ), S( * )
237 COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
244 parameter( zero = 0.0e+0, one = 1.0e+0, two = 2.0e+0 )
246 parameter( czero = ( 0.0e+0, 0.0e+0 ) )
250 INTEGER IASCL, IBSCL, IE, IL, ITAU, ITAUP, ITAUQ,
251 $ ldwork, liwork, lrwork, maxmn, maxwrk, minmn,
252 $ minwrk, mm, mnthr, nlvl, nrwork, nwork, smlsiz
253 REAL ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM
264 EXTERNAL clange, slamch, ilaenv
267 INTRINSIC int, log,
max,
min, real
276 lquery = ( lwork.EQ.-1 )
279 ELSE IF( n.LT.0 )
THEN
281 ELSE IF( nrhs.LT.0 )
THEN
283 ELSE IF( lda.LT.
max( 1, m ) )
THEN
285 ELSE IF( ldb.LT.
max( 1, maxmn ) )
THEN
301 IF( minmn.GT.0 )
THEN
302 smlsiz = ilaenv( 9,
'CGELSD',
' ', 0, 0, 0, 0 )
303 mnthr = ilaenv( 6,
'CGELSD',
' ', m, n, nrhs, -1 )
304 nlvl =
max( int( log( real( minmn ) / real( smlsiz + 1 ) ) /
305 $ log( two ) ) + 1, 0 )
306 liwork = 3*minmn*nlvl + 11*minmn
308 IF( m.GE.n .AND. m.GE.mnthr )
THEN
314 maxwrk =
max( maxwrk, n*ilaenv( 1,
'CGEQRF',
' ', m, n,
316 maxwrk =
max( maxwrk, nrhs*ilaenv( 1,
'CUNMQR',
'LC', m,
323 lrwork = 10*n + 2*n*smlsiz + 8*n*nlvl + 3*smlsiz*nrhs +
324 $
max( (smlsiz+1)**2, n*(1+nrhs) + 2*nrhs )
325 maxwrk =
max( maxwrk, 2*n + ( mm + n )*ilaenv( 1,
326 $
'CGEBRD',
' ', mm, n, -1, -1 ) )
327 maxwrk =
max( maxwrk, 2*n + nrhs*ilaenv( 1,
'CUNMBR',
328 $
'QLC', mm, nrhs, n, -1 ) )
329 maxwrk =
max( maxwrk, 2*n + ( n - 1 )*ilaenv( 1,
330 $
'CUNMBR',
'PLN', n, nrhs, n, -1 ) )
331 maxwrk =
max( maxwrk, 2*n + n*nrhs )
332 minwrk =
max( 2*n + mm, 2*n + n*nrhs )
335 lrwork = 10*m + 2*m*smlsiz + 8*m*nlvl + 3*smlsiz*nrhs +
336 $
max( (smlsiz+1)**2, n*(1+nrhs) + 2*nrhs )
337 IF( n.GE.mnthr )
THEN
342 maxwrk = m + m*ilaenv( 1,
'CGELQF',
' ', m, n, -1,
344 maxwrk =
max( maxwrk, m*m + 4*m + 2*m*ilaenv( 1,
345 $
'CGEBRD',
' ', m, m, -1, -1 ) )
346 maxwrk =
max( maxwrk, m*m + 4*m + nrhs*ilaenv( 1,
347 $
'CUNMBR',
'QLC', m, nrhs, m, -1 ) )
348 maxwrk =
max( maxwrk, m*m + 4*m + ( m - 1 )*ilaenv( 1,
349 $
'CUNMLQ',
'LC', n, nrhs, m, -1 ) )
351 maxwrk =
max( maxwrk, m*m + m + m*nrhs )
353 maxwrk =
max( maxwrk, m*m + 2*m )
355 maxwrk =
max( maxwrk, m*m + 4*m + m*nrhs )
358 maxwrk =
max( maxwrk,
359 $ 4*m+m*m+
max( m, 2*m-4, nrhs, n-3*m ) )
364 maxwrk = 2*m + ( n + m )*ilaenv( 1,
'CGEBRD',
' ', m,
366 maxwrk =
max( maxwrk, 2*m + nrhs*ilaenv( 1,
'CUNMBR',
367 $
'QLC', m, nrhs, m, -1 ) )
368 maxwrk =
max( maxwrk, 2*m + m*ilaenv( 1,
'CUNMBR',
369 $
'PLN', n, nrhs, m, -1 ) )
370 maxwrk =
max( maxwrk, 2*m + m*nrhs )
372 minwrk =
max( 2*m + n, 2*m + m*nrhs )
375 minwrk =
min( minwrk, maxwrk )
380 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
386 CALL xerbla(
'CGELSD', -info )
388 ELSE IF( lquery )
THEN
394 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
402 sfmin = slamch(
'S' )
404 bignum = one / smlnum
405 CALL slabad( smlnum, bignum )
409 anrm = clange(
'M', m, n, a, lda, rwork )
415 CALL clascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
417 ELSE IF( anrm.GT.bignum )
THEN
421 CALL clascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
423 ELSE IF( anrm.EQ.zero )
THEN
427 CALL claset(
'F',
max( m, n ), nrhs, czero, czero, b, ldb )
428 CALL slaset(
'F', minmn, 1, zero, zero, s, 1 )
435 bnrm = clange(
'M', m, nrhs, b, ldb, rwork )
437 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
441 CALL clascl( 'g
', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
443.GT.
ELSE IF( BNRMBIGNUM ) THEN
447 CALL CLASCL( 'g
', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
454 $ CALL CLASET( 'f
', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ), LDB )
463.GE.
IF( MMNTHR ) THEN
475 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
476 $ LWORK-NWORK+1, INFO )
482 CALL CUNMQR( 'l
', 'c
', M, NRHS, N, A, LDA, WORK( ITAU ), B,
483 $ LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
488 CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO, A( 2, 1 ),
503 CALL CGEBRD( MM, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
504 $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
510 CALL CUNMBR( 'q
', 'l
', 'c
', MM, NRHS, N, A, LDA, WORK( ITAUQ ),
511 $ B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
515 CALL CLALSD( 'u
', SMLSIZ, N, NRHS, S, RWORK( IE ), B, LDB,
516 $ RCOND, RANK, WORK( NWORK ), RWORK( NRWORK ),
524 CALL CUNMBR( 'p
', 'l
', 'n
', N, NRHS, N, A, LDA, WORK( ITAUP ),
525 $ B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
527.GE..AND..GE.
ELSE IF( NMNTHR LWORK4*M+M*M+
528 $ MAX( M, 2*M-4, NRHS, N-3*M ) ) THEN
534.GE.
IF( LWORKMAX( 4*M+M*LDA+MAX( M, 2*M-4, NRHS, N-3*M ),
535 $ M*LDA+M+M*NRHS ) )LDWORK = LDA
542 CALL CGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
543 $ LWORK-NWORK+1, INFO )
548 CALL CLACPY( 'l
', M, M, A, LDA, WORK( IL ), LDWORK )
549 CALL CLASET( 'u
', M-1, M-1, CZERO, CZERO, WORK( IL+LDWORK ),
551 ITAUQ = IL + LDWORK*M
561 CALL CGEBRD( M, M, WORK( IL ), LDWORK, S, RWORK( IE ),
562 $ WORK( ITAUQ ), WORK( ITAUP ), WORK( NWORK ),
563 $ LWORK-NWORK+1, INFO )
568 CALL CUNMBR( 'q
', 'l
', 'c
', M, NRHS, M, WORK( IL ), LDWORK,
569 $ WORK( ITAUQ ), B, LDB, WORK( NWORK ),
570 $ LWORK-NWORK+1, INFO )
574 CALL CLALSD( 'u
', SMLSIZ, M, NRHS, S, RWORK( IE ), B, LDB,
575 $ RCOND, RANK, WORK( NWORK ), RWORK( NRWORK ),
583 CALL CUNMBR( 'p
', 'l
', 'n
', M, NRHS, M, WORK( IL ), LDWORK,
584 $ WORK( ITAUP ), B, LDB, WORK( NWORK ),
585 $ LWORK-NWORK+1, INFO )
589 CALL CLASET( 'f
', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ), LDB )
595 CALL CUNMLQ( 'l
', 'c
', N, NRHS, M, A, LDA, WORK( ITAU ), B,
596 $ LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
612 CALL CGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
613 $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
619 CALL CUNMBR( 'q
', 'l
', 'c
', M, NRHS, N, A, LDA, WORK( ITAUQ ),
620 $ B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
624 CALL CLALSD( 'l
', SMLSIZ, M, NRHS, S, RWORK( IE ), B, LDB,
625 $ RCOND, RANK, WORK( NWORK ), RWORK( NRWORK ),
633 CALL CUNMBR( 'p
', 'l
', 'n
', N, NRHS, M, A, LDA, WORK( ITAUP ),
634 $ B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
640.EQ.
IF( IASCL1 ) THEN
641 CALL CLASCL( 'g
', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
642 CALL SLASCL( 'g
', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
644.EQ.
ELSE IF( IASCL2 ) THEN
645 CALL CLASCL( 'g
', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
646 CALL SLASCL( 'g
', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
649.EQ.
IF( IBSCL1 ) THEN
650 CALL CLASCL( 'g
', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
651.EQ.
ELSE IF( IBSCL2 ) THEN
652 CALL CLASCL( 'g
', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
subroutine cgelsd(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, lwork, rwork, iwork, info)
CGELSD computes the minimum-norm solution to a linear least squares problem for GE matrices
subroutine clalsd(uplo, smlsiz, n, nrhs, d, e, b, ldb, rcond, rank, work, rwork, iwork, info)
CLALSD uses the singular value decomposition of A to solve the least squares problem.