cgelsd.f.html
来自「famous linear algebra library (LAPACK) p」· HTML 代码 · 共 592 行 · 第 1/4 页
HTML
592 行
</span><span class="comment">*</span><span class="comment"> Multiply B by right bidiagonalizing vectors of R.
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CUNMBR.428"></a><a href="cunmbr.f.html#CUNMBR.1">CUNMBR</a>( <span class="string">'P'</span>, <span class="string">'L'</span>, <span class="string">'N'</span>, N, NRHS, N, A, LDA, WORK( ITAUP ),
$ B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
<span class="comment">*</span><span class="comment">
</span> ELSE IF( N.GE.MNTHR .AND. LWORK.GE.4*M+M*M+
$ MAX( M, 2*M-4, NRHS, N-3*M ) ) THEN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Path 2a - underdetermined, with many more columns than rows
</span><span class="comment">*</span><span class="comment"> and sufficient workspace for an efficient algorithm.
</span><span class="comment">*</span><span class="comment">
</span> LDWORK = M
IF( LWORK.GE.MAX( 4*M+M*LDA+MAX( M, 2*M-4, NRHS, N-3*M ),
$ M*LDA+M+M*NRHS ) )LDWORK = LDA
ITAU = 1
NWORK = M + 1
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Compute A=L*Q.
</span><span class="comment">*</span><span class="comment"> (CWorkspace: need 2*M, prefer M+M*NB)
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CGELQF.446"></a><a href="cgelqf.f.html#CGELQF.1">CGELQF</a>( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
$ LWORK-NWORK+1, INFO )
IL = NWORK
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Copy L to WORK(IL), zeroing out above its diagonal.
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CLACPY.452"></a><a href="clacpy.f.html#CLACPY.1">CLACPY</a>( <span class="string">'L'</span>, M, M, A, LDA, WORK( IL ), LDWORK )
CALL <a name="CLASET.453"></a><a href="claset.f.html#CLASET.1">CLASET</a>( <span class="string">'U'</span>, M-1, M-1, CZERO, CZERO, WORK( IL+LDWORK ),
$ LDWORK )
ITAUQ = IL + LDWORK*M
ITAUP = ITAUQ + M
NWORK = ITAUP + M
IE = 1
NRWORK = IE + M
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Bidiagonalize L in WORK(IL).
</span><span class="comment">*</span><span class="comment"> (RWorkspace: need M)
</span><span class="comment">*</span><span class="comment"> (CWorkspace: need M*M+4*M, prefer M*M+4*M+2*M*NB)
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CGEBRD.465"></a><a href="cgebrd.f.html#CGEBRD.1">CGEBRD</a>( M, M, WORK( IL ), LDWORK, S, RWORK( IE ),
$ WORK( ITAUQ ), WORK( ITAUP ), WORK( NWORK ),
$ LWORK-NWORK+1, INFO )
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Multiply B by transpose of left bidiagonalizing vectors of L.
</span><span class="comment">*</span><span class="comment"> (CWorkspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB)
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CUNMBR.472"></a><a href="cunmbr.f.html#CUNMBR.1">CUNMBR</a>( <span class="string">'Q'</span>, <span class="string">'L'</span>, <span class="string">'C'</span>, M, NRHS, M, WORK( IL ), LDWORK,
$ WORK( ITAUQ ), B, LDB, WORK( NWORK ),
$ LWORK-NWORK+1, INFO )
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Solve the bidiagonal least squares problem.
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CLALSD.478"></a><a href="clalsd.f.html#CLALSD.1">CLALSD</a>( <span class="string">'U'</span>, SMLSIZ, M, NRHS, S, RWORK( IE ), B, LDB,
$ RCOND, RANK, WORK( NWORK ), RWORK( NRWORK ),
$ IWORK, INFO )
IF( INFO.NE.0 ) THEN
GO TO 10
END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Multiply B by right bidiagonalizing vectors of L.
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CUNMBR.487"></a><a href="cunmbr.f.html#CUNMBR.1">CUNMBR</a>( <span class="string">'P'</span>, <span class="string">'L'</span>, <span class="string">'N'</span>, M, NRHS, M, WORK( IL ), LDWORK,
$ WORK( ITAUP ), B, LDB, WORK( NWORK ),
$ LWORK-NWORK+1, INFO )
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Zero out below first M rows of B.
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CLASET.493"></a><a href="claset.f.html#CLASET.1">CLASET</a>( <span class="string">'F'</span>, N-M, NRHS, CZERO, CZERO, B( M+1, 1 ), LDB )
NWORK = ITAU + M
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Multiply transpose(Q) by B.
</span><span class="comment">*</span><span class="comment"> (CWorkspace: need NRHS, prefer NRHS*NB)
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CUNMLQ.499"></a><a href="cunmlq.f.html#CUNMLQ.1">CUNMLQ</a>( <span class="string">'L'</span>, <span class="string">'C'</span>, N, NRHS, M, A, LDA, WORK( ITAU ), B,
$ LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
<span class="comment">*</span><span class="comment">
</span> ELSE
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Path 2 - remaining underdetermined cases.
</span><span class="comment">*</span><span class="comment">
</span> ITAUQ = 1
ITAUP = ITAUQ + M
NWORK = ITAUP + M
IE = 1
NRWORK = IE + M
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Bidiagonalize A.
</span><span class="comment">*</span><span class="comment"> (RWorkspace: need M)
</span><span class="comment">*</span><span class="comment"> (CWorkspace: need 2*M+N, prefer 2*M+(M+N)*NB)
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CGEBRD.516"></a><a href="cgebrd.f.html#CGEBRD.1">CGEBRD</a>( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
$ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
$ INFO )
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Multiply B by transpose of left bidiagonalizing vectors.
</span><span class="comment">*</span><span class="comment"> (CWorkspace: need 2*M+NRHS, prefer 2*M+NRHS*NB)
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CUNMBR.523"></a><a href="cunmbr.f.html#CUNMBR.1">CUNMBR</a>( <span class="string">'Q'</span>, <span class="string">'L'</span>, <span class="string">'C'</span>, M, NRHS, N, A, LDA, WORK( ITAUQ ),
$ B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Solve the bidiagonal least squares problem.
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CLALSD.528"></a><a href="clalsd.f.html#CLALSD.1">CLALSD</a>( <span class="string">'L'</span>, SMLSIZ, M, NRHS, S, RWORK( IE ), B, LDB,
$ RCOND, RANK, WORK( NWORK ), RWORK( NRWORK ),
$ IWORK, INFO )
IF( INFO.NE.0 ) THEN
GO TO 10
END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Multiply B by right bidiagonalizing vectors of A.
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="CUNMBR.537"></a><a href="cunmbr.f.html#CUNMBR.1">CUNMBR</a>( <span class="string">'P'</span>, <span class="string">'L'</span>, <span class="string">'N'</span>, N, NRHS, M, A, LDA, WORK( ITAUP ),
$ B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
<span class="comment">*</span><span class="comment">
</span> END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Undo scaling.
</span><span class="comment">*</span><span class="comment">
</span> IF( IASCL.EQ.1 ) THEN
CALL <a name="CLASCL.545"></a><a href="clascl.f.html#CLASCL.1">CLASCL</a>( <span class="string">'G'</span>, 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
CALL <a name="SLASCL.546"></a><a href="slascl.f.html#SLASCL.1">SLASCL</a>( <span class="string">'G'</span>, 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
$ INFO )
ELSE IF( IASCL.EQ.2 ) THEN
CALL <a name="CLASCL.549"></a><a href="clascl.f.html#CLASCL.1">CLASCL</a>( <span class="string">'G'</span>, 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
CALL <a name="SLASCL.550"></a><a href="slascl.f.html#SLASCL.1">SLASCL</a>( <span class="string">'G'</span>, 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
$ INFO )
END IF
IF( IBSCL.EQ.1 ) THEN
CALL <a name="CLASCL.554"></a><a href="clascl.f.html#CLASCL.1">CLASCL</a>( <span class="string">'G'</span>, 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
ELSE IF( IBSCL.EQ.2 ) THEN
CALL <a name="CLASCL.556"></a><a href="clascl.f.html#CLASCL.1">CLASCL</a>( <span class="string">'G'</span>, 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
END IF
<span class="comment">*</span><span class="comment">
</span> 10 CONTINUE
WORK( 1 ) = MAXWRK
IWORK( 1 ) = LIWORK
RWORK( 1 ) = LRWORK
RETURN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> End of <a name="CGELSD.565"></a><a href="cgelsd.f.html#CGELSD.1">CGELSD</a>
</span><span class="comment">*</span><span class="comment">
</span> END
</pre>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?