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

◆ sorcsd()

recursive subroutine sorcsd ( character jobu1,
character jobu2,
character jobv1t,
character jobv2t,
character trans,
character signs,
integer m,
integer p,
integer q,
real, dimension( ldx11, * ) x11,
integer ldx11,
real, dimension( ldx12, * ) x12,
integer ldx12,
real, dimension( ldx21, * ) x21,
integer ldx21,
real, dimension( ldx22, * ) x22,
integer ldx22,
real, dimension( * ) theta,
real, dimension( ldu1, * ) u1,
integer ldu1,
real, dimension( ldu2, * ) u2,
integer ldu2,
real, dimension( ldv1t, * ) v1t,
integer ldv1t,
real, dimension( ldv2t, * ) v2t,
integer ldv2t,
real, dimension( * ) work,
integer lwork,
integer, dimension( * ) iwork,
integer info )

SORCSD

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

Purpose:
!>
!> SORCSD computes the CS decomposition of an M-by-M partitioned
!> orthogonal matrix X:
!>
!>                                 [  I  0  0 |  0  0  0 ]
!>                                 [  0  C  0 |  0 -S  0 ]
!>     [ X11 | X12 ]   [ U1 |    ] [  0  0  0 |  0  0 -I ] [ V1 |    ]**T
!> X = [-----------] = [---------] [---------------------] [---------]   .
!>     [ X21 | X22 ]   [    | U2 ] [  0  0  0 |  I  0  0 ] [    | V2 ]
!>                                 [  0  S  0 |  0  C  0 ]
!>                                 [  0  0  I |  0  0  0 ]
!>
!> X11 is P-by-Q. The orthogonal matrices U1, U2, V1, and V2 are P-by-P,
!> (M-P)-by-(M-P), Q-by-Q, and (M-Q)-by-(M-Q), respectively. C and S are
!> R-by-R nonnegative diagonal matrices satisfying C^2 + S^2 = I, in
!> which R = MIN(P,M-P,Q,M-Q).
!> 
Parameters
[in]JOBU1
!>          JOBU1 is CHARACTER
!>          = 'Y':      U1 is computed;
!>          otherwise:  U1 is not computed.
!> 
[in]JOBU2
!>          JOBU2 is CHARACTER
!>          = 'Y':      U2 is computed;
!>          otherwise:  U2 is not computed.
!> 
[in]JOBV1T
!>          JOBV1T is CHARACTER
!>          = 'Y':      V1T is computed;
!>          otherwise:  V1T is not computed.
!> 
[in]JOBV2T
!>          JOBV2T is CHARACTER
!>          = 'Y':      V2T is computed;
!>          otherwise:  V2T is not computed.
!> 
[in]TRANS
!>          TRANS is CHARACTER
!>          = 'T':      X, U1, U2, V1T, and V2T are stored in row-major
!>                      order;
!>          otherwise:  X, U1, U2, V1T, and V2T are stored in column-
!>                      major order.
!> 
[in]SIGNS
!>          SIGNS is CHARACTER
!>          = 'O':      The lower-left block is made nonpositive (the
!>                       convention);
!>          otherwise:  The upper-right block is made nonpositive (the
!>                       convention).
!> 
[in]M
!>          M is INTEGER
!>          The number of rows and columns in X.
!> 
[in]P
!>          P is INTEGER
!>          The number of rows in X11 and X12. 0 <= P <= M.
!> 
[in]Q
!>          Q is INTEGER
!>          The number of columns in X11 and X21. 0 <= Q <= M.
!> 
[in,out]X11
!>          X11 is REAL array, dimension (LDX11,Q)
!>          On entry, part of the orthogonal matrix whose CSD is desired.
!> 
[in]LDX11
!>          LDX11 is INTEGER
!>          The leading dimension of X11. LDX11 >= MAX(1,P).
!> 
[in,out]X12
!>          X12 is REAL array, dimension (LDX12,M-Q)
!>          On entry, part of the orthogonal matrix whose CSD is desired.
!> 
[in]LDX12
!>          LDX12 is INTEGER
!>          The leading dimension of X12. LDX12 >= MAX(1,P).
!> 
[in,out]X21
!>          X21 is REAL array, dimension (LDX21,Q)
!>          On entry, part of the orthogonal matrix whose CSD is desired.
!> 
[in]LDX21
!>          LDX21 is INTEGER
!>          The leading dimension of X11. LDX21 >= MAX(1,M-P).
!> 
[in,out]X22
!>          X22 is REAL array, dimension (LDX22,M-Q)
!>          On entry, part of the orthogonal matrix whose CSD is desired.
!> 
[in]LDX22
!>          LDX22 is INTEGER
!>          The leading dimension of X11. LDX22 >= MAX(1,M-P).
!> 
[out]THETA
!>          THETA is REAL array, dimension (R), in which R =
!>          MIN(P,M-P,Q,M-Q).
!>          C = DIAG( COS(THETA(1)), ... , COS(THETA(R)) ) and
!>          S = DIAG( SIN(THETA(1)), ... , SIN(THETA(R)) ).
!> 
[out]U1
!>          U1 is REAL array, dimension (LDU1,P)
!>          If JOBU1 = 'Y', U1 contains the P-by-P orthogonal matrix U1.
!> 
[in]LDU1
!>          LDU1 is INTEGER
!>          The leading dimension of U1. If JOBU1 = 'Y', LDU1 >=
!>          MAX(1,P).
!> 
[out]U2
!>          U2 is REAL array, dimension (LDU2,M-P)
!>          If JOBU2 = 'Y', U2 contains the (M-P)-by-(M-P) orthogonal
!>          matrix U2.
!> 
[in]LDU2
!>          LDU2 is INTEGER
!>          The leading dimension of U2. If JOBU2 = 'Y', LDU2 >=
!>          MAX(1,M-P).
!> 
[out]V1T
!>          V1T is REAL array, dimension (LDV1T,Q)
!>          If JOBV1T = 'Y', V1T contains the Q-by-Q matrix orthogonal
!>          matrix V1**T.
!> 
[in]LDV1T
!>          LDV1T is INTEGER
!>          The leading dimension of V1T. If JOBV1T = 'Y', LDV1T >=
!>          MAX(1,Q).
!> 
[out]V2T
!>          V2T is REAL array, dimension (LDV2T,M-Q)
!>          If JOBV2T = 'Y', V2T contains the (M-Q)-by-(M-Q) orthogonal
!>          matrix V2**T.
!> 
[in]LDV2T
!>          LDV2T is INTEGER
!>          The leading dimension of V2T. If JOBV2T = 'Y', LDV2T >=
!>          MAX(1,M-Q).
!> 
[out]WORK
!>          WORK is REAL array, dimension (MAX(1,LWORK))
!>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
!>          If INFO > 0 on exit, WORK(2:R) contains the values PHI(1),
!>          ..., PHI(R-1) that, together with THETA(1), ..., THETA(R),
!>          define the matrix in intermediate bidiagonal-block form
!>          remaining after nonconvergence. INFO specifies the number
!>          of nonzero PHI's.
!> 
[in]LWORK
!>          LWORK is INTEGER
!>          The dimension of the array WORK.
!>
!>          If LWORK = -1, then a workspace query is assumed; the routine
!>          only calculates the optimal size of the WORK array, returns
!>          this value as the first entry of the work array, and no error
!>          message related to LWORK is issued by XERBLA.
!> 
[out]IWORK
!>          IWORK is INTEGER array, dimension (M-MIN(P, M-P, Q, M-Q))
!> 
[out]INFO
!>          INFO is INTEGER
!>          = 0:  successful exit.
!>          < 0:  if INFO = -i, the i-th argument had an illegal value.
!>          > 0:  SBBCSD did not converge. See the description of WORK
!>                above for details.
!> 
References:
[1] Brian D. Sutton. Computing the complete CS decomposition. Numer. Algorithms, 50(1):33-65, 2009.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.

Definition at line 293 of file sorcsd.f.

299*
300* -- LAPACK computational routine --
301* -- LAPACK is a software package provided by Univ. of Tennessee, --
302* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
303*
304* .. Scalar Arguments ..
305 CHARACTER JOBU1, JOBU2, JOBV1T, JOBV2T, SIGNS, TRANS
306 INTEGER INFO, LDU1, LDU2, LDV1T, LDV2T, LDX11, LDX12,
307 $ LDX21, LDX22, LWORK, M, P, Q
308* ..
309* .. Array Arguments ..
310 INTEGER IWORK( * )
311 REAL THETA( * )
312 REAL U1( LDU1, * ), U2( LDU2, * ), V1T( LDV1T, * ),
313 $ V2T( LDV2T, * ), WORK( * ), X11( LDX11, * ),
314 $ X12( LDX12, * ), X21( LDX21, * ), X22( LDX22,
315 $ * )
316* ..
317*
318* ===================================================================
319*
320* .. Parameters ..
321 REAL ONE, ZERO
322 parameter( one = 1.0e+0,
323 $ zero = 0.0e+0 )
324* ..
325* .. Local Arrays ..
326 REAL DUMMY(1)
327* ..
328* .. Local Scalars ..
329 CHARACTER TRANST, SIGNST
330 INTEGER CHILDINFO, I, IB11D, IB11E, IB12D, IB12E,
331 $ IB21D, IB21E, IB22D, IB22E, IBBCSD, IORBDB,
332 $ IORGLQ, IORGQR, IPHI, ITAUP1, ITAUP2, ITAUQ1,
333 $ ITAUQ2, J, LBBCSDWORK, LBBCSDWORKMIN,
334 $ LBBCSDWORKOPT, LORBDBWORK, LORBDBWORKMIN,
335 $ LORBDBWORKOPT, LORGLQWORK, LORGLQWORKMIN,
336 $ LORGLQWORKOPT, LORGQRWORK, LORGQRWORKMIN,
337 $ LORGQRWORKOPT, LWORKMIN, LWORKOPT
338 LOGICAL COLMAJOR, DEFAULTSIGNS, LQUERY, WANTU1, WANTU2,
339 $ WANTV1T, WANTV2T
340* ..
341* .. External Subroutines ..
342 EXTERNAL sbbcsd, slacpy, slapmr, slapmt,
344* ..
345* .. External Functions ..
346 LOGICAL LSAME
347 EXTERNAL lsame
348* ..
349* .. Intrinsic Functions
350 INTRINSIC int, max, min
351* ..
352* .. Executable Statements ..
353*
354* Test input arguments
355*
356 info = 0
357 wantu1 = lsame( jobu1, 'Y' )
358 wantu2 = lsame( jobu2, 'Y' )
359 wantv1t = lsame( jobv1t, 'Y' )
360 wantv2t = lsame( jobv2t, 'Y' )
361 colmajor = .NOT. lsame( trans, 'T' )
362 defaultsigns = .NOT. lsame( signs, 'O' )
363 lquery = lwork .EQ. -1
364 IF( m .LT. 0 ) THEN
365 info = -7
366 ELSE IF( p .LT. 0 .OR. p .GT. m ) THEN
367 info = -8
368 ELSE IF( q .LT. 0 .OR. q .GT. m ) THEN
369 info = -9
370 ELSE IF ( colmajor .AND. ldx11 .LT. max( 1, p ) ) THEN
371 info = -11
372 ELSE IF (.NOT. colmajor .AND. ldx11 .LT. max( 1, q ) ) THEN
373 info = -11
374 ELSE IF (colmajor .AND. ldx12 .LT. max( 1, p ) ) THEN
375 info = -13
376 ELSE IF (.NOT. colmajor .AND. ldx12 .LT. max( 1, m-q ) ) THEN
377 info = -13
378 ELSE IF (colmajor .AND. ldx21 .LT. max( 1, m-p ) ) THEN
379 info = -15
380 ELSE IF (.NOT. colmajor .AND. ldx21 .LT. max( 1, q ) ) THEN
381 info = -15
382 ELSE IF (colmajor .AND. ldx22 .LT. max( 1, m-p ) ) THEN
383 info = -17
384 ELSE IF (.NOT. colmajor .AND. ldx22 .LT. max( 1, m-q ) ) THEN
385 info = -17
386 ELSE IF( wantu1 .AND. ldu1 .LT. p ) THEN
387 info = -20
388 ELSE IF( wantu2 .AND. ldu2 .LT. m-p ) THEN
389 info = -22
390 ELSE IF( wantv1t .AND. ldv1t .LT. q ) THEN
391 info = -24
392 ELSE IF( wantv2t .AND. ldv2t .LT. m-q ) THEN
393 info = -26
394 END IF
395*
396* Work with transpose if convenient
397*
398 IF( info .EQ. 0 .AND. min( p, m-p ) .LT. min( q, m-q ) ) THEN
399 IF( colmajor ) THEN
400 transt = 'T'
401 ELSE
402 transt = 'N'
403 END IF
404 IF( defaultsigns ) THEN
405 signst = 'O'
406 ELSE
407 signst = 'D'
408 END IF
409 CALL sorcsd( jobv1t, jobv2t, jobu1, jobu2, transt, signst,
410 $ m,
411 $ q, p, x11, ldx11, x21, ldx21, x12, ldx12, x22,
412 $ ldx22, theta, v1t, ldv1t, v2t, ldv2t, u1, ldu1,
413 $ u2, ldu2, work, lwork, iwork, info )
414 RETURN
415 END IF
416*
417* Work with permutation [ 0 I; I 0 ] * X * [ 0 I; I 0 ] if
418* convenient
419*
420 IF( info .EQ. 0 .AND. m-q .LT. q ) THEN
421 IF( defaultsigns ) THEN
422 signst = 'O'
423 ELSE
424 signst = 'D'
425 END IF
426 CALL sorcsd( jobu2, jobu1, jobv2t, jobv1t, trans, signst, m,
427 $ m-p, m-q, x22, ldx22, x21, ldx21, x12, ldx12, x11,
428 $ ldx11, theta, u2, ldu2, u1, ldu1, v2t, ldv2t, v1t,
429 $ ldv1t, work, lwork, iwork, info )
430 RETURN
431 END IF
432*
433* Compute workspace
434*
435 IF( info .EQ. 0 ) THEN
436*
437 iphi = 2
438 itaup1 = iphi + max( 1, q - 1 )
439 itaup2 = itaup1 + max( 1, p )
440 itauq1 = itaup2 + max( 1, m - p )
441 itauq2 = itauq1 + max( 1, q )
442 iorgqr = itauq2 + max( 1, m - q )
443 CALL sorgqr( m-q, m-q, m-q, dummy, max(1,m-q), dummy, work,
444 $ -1,
445 $ childinfo )
446 lorgqrworkopt = int( work(1) )
447 lorgqrworkmin = max( 1, m - q )
448 iorglq = itauq2 + max( 1, m - q )
449 CALL sorglq( m-q, m-q, m-q, dummy, max(1,m-q), dummy, work,
450 $ -1,
451 $ childinfo )
452 lorglqworkopt = int( work(1) )
453 lorglqworkmin = max( 1, m - q )
454 iorbdb = itauq2 + max( 1, m - q )
455 CALL sorbdb( trans, signs, m, p, q, x11, ldx11, x12, ldx12,
456 $ x21, ldx21, x22, ldx22, dummy, dummy, dummy, dummy, dummy,
457 $ dummy,work,-1,childinfo )
458 lorbdbworkopt = int( work(1) )
459 lorbdbworkmin = lorbdbworkopt
460 ib11d = itauq2 + max( 1, m - q )
461 ib11e = ib11d + max( 1, q )
462 ib12d = ib11e + max( 1, q - 1 )
463 ib12e = ib12d + max( 1, q )
464 ib21d = ib12e + max( 1, q - 1 )
465 ib21e = ib21d + max( 1, q )
466 ib22d = ib21e + max( 1, q - 1 )
467 ib22e = ib22d + max( 1, q )
468 ibbcsd = ib22e + max( 1, q - 1 )
469 CALL sbbcsd( jobu1, jobu2, jobv1t, jobv2t, trans, m, p, q,
470 $ dummy, dummy, u1, ldu1, u2, ldu2, v1t, ldv1t, v2t,
471 $ ldv2t, dummy, dummy, dummy, dummy, dummy, dummy,
472 $ dummy, dummy, work, -1, childinfo )
473 lbbcsdworkopt = int( work(1) )
474 lbbcsdworkmin = lbbcsdworkopt
475 lworkopt = max( iorgqr + lorgqrworkopt, iorglq + lorglqworkopt,
476 $ iorbdb + lorbdbworkopt, ibbcsd + lbbcsdworkopt ) - 1
477 lworkmin = max( iorgqr + lorgqrworkmin, iorglq + lorglqworkmin,
478 $ iorbdb + lorbdbworkopt, ibbcsd + lbbcsdworkmin ) - 1
479 work(1) = real( max(lworkopt,lworkmin) )
480*
481 IF( lwork .LT. lworkmin .AND. .NOT. lquery ) THEN
482 info = -22
483 ELSE
484 lorgqrwork = lwork - iorgqr + 1
485 lorglqwork = lwork - iorglq + 1
486 lorbdbwork = lwork - iorbdb + 1
487 lbbcsdwork = lwork - ibbcsd + 1
488 END IF
489 END IF
490*
491* Abort if any illegal arguments
492*
493 IF( info .NE. 0 ) THEN
494 CALL xerbla( 'SORCSD', -info )
495 RETURN
496 ELSE IF( lquery ) THEN
497 RETURN
498 END IF
499*
500* Transform to bidiagonal block form
501*
502 CALL sorbdb( trans, signs, m, p, q, x11, ldx11, x12, ldx12,
503 $ x21,
504 $ ldx21, x22, ldx22, theta, work(iphi), work(itaup1),
505 $ work(itaup2), work(itauq1), work(itauq2),
506 $ work(iorbdb), lorbdbwork, childinfo )
507*
508* Accumulate Householder reflectors
509*
510 IF( colmajor ) THEN
511 IF( wantu1 .AND. p .GT. 0 ) THEN
512 CALL slacpy( 'L', p, q, x11, ldx11, u1, ldu1 )
513 CALL sorgqr( p, p, q, u1, ldu1, work(itaup1),
514 $ work(iorgqr),
515 $ lorgqrwork, info)
516 END IF
517 IF( wantu2 .AND. m-p .GT. 0 ) THEN
518 CALL slacpy( 'L', m-p, q, x21, ldx21, u2, ldu2 )
519 CALL sorgqr( m-p, m-p, q, u2, ldu2, work(itaup2),
520 $ work(iorgqr), lorgqrwork, info )
521 END IF
522 IF( wantv1t .AND. q .GT. 0 ) THEN
523 CALL slacpy( 'U', q-1, q-1, x11(1,2), ldx11, v1t(2,2),
524 $ ldv1t )
525 v1t(1, 1) = one
526 DO j = 2, q
527 v1t(1,j) = zero
528 v1t(j,1) = zero
529 END DO
530 CALL sorglq( q-1, q-1, q-1, v1t(2,2), ldv1t,
531 $ work(itauq1),
532 $ work(iorglq), lorglqwork, info )
533 END IF
534 IF( wantv2t .AND. m-q .GT. 0 ) THEN
535 CALL slacpy( 'U', p, m-q, x12, ldx12, v2t, ldv2t )
536 CALL slacpy( 'U', m-p-q, m-p-q, x22(q+1,p+1), ldx22,
537 $ v2t(p+1,p+1), ldv2t )
538 CALL sorglq( m-q, m-q, m-q, v2t, ldv2t, work(itauq2),
539 $ work(iorglq), lorglqwork, info )
540 END IF
541 ELSE
542 IF( wantu1 .AND. p .GT. 0 ) THEN
543 CALL slacpy( 'U', q, p, x11, ldx11, u1, ldu1 )
544 CALL sorglq( p, p, q, u1, ldu1, work(itaup1),
545 $ work(iorglq),
546 $ lorglqwork, info)
547 END IF
548 IF( wantu2 .AND. m-p .GT. 0 ) THEN
549 CALL slacpy( 'U', q, m-p, x21, ldx21, u2, ldu2 )
550 CALL sorglq( m-p, m-p, q, u2, ldu2, work(itaup2),
551 $ work(iorglq), lorglqwork, info )
552 END IF
553 IF( wantv1t .AND. q .GT. 0 ) THEN
554 CALL slacpy( 'L', q-1, q-1, x11(2,1), ldx11, v1t(2,2),
555 $ ldv1t )
556 v1t(1, 1) = one
557 DO j = 2, q
558 v1t(1,j) = zero
559 v1t(j,1) = zero
560 END DO
561 CALL sorgqr( q-1, q-1, q-1, v1t(2,2), ldv1t,
562 $ work(itauq1),
563 $ work(iorgqr), lorgqrwork, info )
564 END IF
565 IF( wantv2t .AND. m-q .GT. 0 ) THEN
566 CALL slacpy( 'L', m-q, p, x12, ldx12, v2t, ldv2t )
567 CALL slacpy( 'L', m-p-q, m-p-q, x22(p+1,q+1), ldx22,
568 $ v2t(p+1,p+1), ldv2t )
569 CALL sorgqr( m-q, m-q, m-q, v2t, ldv2t, work(itauq2),
570 $ work(iorgqr), lorgqrwork, info )
571 END IF
572 END IF
573*
574* Compute the CSD of the matrix in bidiagonal-block form
575*
576 CALL sbbcsd( jobu1, jobu2, jobv1t, jobv2t, trans, m, p, q,
577 $ theta,
578 $ work(iphi), u1, ldu1, u2, ldu2, v1t, ldv1t, v2t,
579 $ ldv2t, work(ib11d), work(ib11e), work(ib12d),
580 $ work(ib12e), work(ib21d), work(ib21e), work(ib22d),
581 $ work(ib22e), work(ibbcsd), lbbcsdwork, info )
582*
583* Permute rows and columns to place identity submatrices in top-
584* left corner of (1,1)-block and/or bottom-right corner of (1,2)-
585* block and/or bottom-right corner of (2,1)-block and/or top-left
586* corner of (2,2)-block
587*
588 IF( q .GT. 0 .AND. wantu2 ) THEN
589 DO i = 1, q
590 iwork(i) = m - p - q + i
591 END DO
592 DO i = q + 1, m - p
593 iwork(i) = i - q
594 END DO
595 IF( colmajor ) THEN
596 CALL slapmt( .false., m-p, m-p, u2, ldu2, iwork )
597 ELSE
598 CALL slapmr( .false., m-p, m-p, u2, ldu2, iwork )
599 END IF
600 END IF
601 IF( m .GT. 0 .AND. wantv2t ) THEN
602 DO i = 1, p
603 iwork(i) = m - p - q + i
604 END DO
605 DO i = p + 1, m - q
606 iwork(i) = i - p
607 END DO
608 IF( .NOT. colmajor ) THEN
609 CALL slapmt( .false., m-q, m-q, v2t, ldv2t, iwork )
610 ELSE
611 CALL slapmr( .false., m-q, m-q, v2t, ldv2t, iwork )
612 END IF
613 END IF
614*
615 RETURN
616*
617* End SORCSD
618*
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine sbbcsd(jobu1, jobu2, jobv1t, jobv2t, trans, m, p, q, theta, phi, u1, ldu1, u2, ldu2, v1t, ldv1t, v2t, ldv2t, b11d, b11e, b12d, b12e, b21d, b21e, b22d, b22e, work, lwork, info)
SBBCSD
Definition sbbcsd.f:331
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
Definition slacpy.f:101
subroutine slapmr(forwrd, m, n, x, ldx, k)
SLAPMR rearranges rows of a matrix as specified by a permutation vector.
Definition slapmr.f:102
subroutine slapmt(forwrd, m, n, x, ldx, k)
SLAPMT performs a forward or backward permutation of the columns of a matrix.
Definition slapmt.f:102
logical function lsame(ca, cb)
LSAME
Definition lsame.f:48
subroutine sorbdb(trans, signs, m, p, q, x11, ldx11, x12, ldx12, x21, ldx21, x22, ldx22, theta, phi, taup1, taup2, tauq1, tauq2, work, lwork, info)
SORBDB
Definition sorbdb.f:286
recursive subroutine sorcsd(jobu1, jobu2, jobv1t, jobv2t, trans, signs, m, p, q, x11, ldx11, x12, ldx12, x21, ldx21, x22, ldx22, theta, u1, ldu1, u2, ldu2, v1t, ldv1t, v2t, ldv2t, work, lwork, iwork, info)
SORCSD
Definition sorcsd.f:299
subroutine sorglq(m, n, k, a, lda, tau, work, lwork, info)
SORGLQ
Definition sorglq.f:125
subroutine sorgqr(m, n, k, a, lda, tau, work, lwork, info)
SORGQR
Definition sorgqr.f:126
Here is the call graph for this function:
Here is the caller graph for this function: