📄 dsvdc.c
字号:
;
}
/*< 400 continue >*/
L400:
/*< if (l .ne. m - 1) go to 410 >*/
if (l != m - 1) {
goto L410;
}
/*< kase = 4 >*/
kase = 4;
/*< go to 480 >*/
goto L480;
/*< 410 continue >*/
L410:
/*< lp1 = l + 1 >*/
lp1 = l + 1;
/*< mp1 = m + 1 >*/
mp1 = m + 1;
/*< do 430 lls = lp1, mp1 >*/
i__1 = mp1;
for (lls = lp1; lls <= i__1; ++lls) {
/*< ls = m - lls + lp1 >*/
ls = m - lls + lp1;
/* ...exit */
/*< if (ls .eq. l) go to 440 >*/
if (ls == l) {
goto L440;
}
/*< test = 0.0d0 >*/
test = 0.;
/*< if (ls .ne. m) test = test + dabs(e(ls)) >*/
if (ls != m) {
test += (d__1 = e[ls], abs(d__1));
}
/*< if (ls .ne. l + 1) test = test + dabs(e(ls-1)) >*/
if (ls != l + 1) {
test += (d__1 = e[ls - 1], abs(d__1));
}
/*< ztest = test + dabs(s(ls)) >*/
ztest = test + (d__1 = s[ls], abs(d__1));
/*< if (ztest .ne. test) go to 420 >*/
if (ztest != test) {
goto L420;
}
/*< s(ls) = 0.0d0 >*/
s[ls] = 0.;
/* ......exit */
/*< go to 440 >*/
goto L440;
/*< 420 continue >*/
L420:
/*< 430 continue >*/
/* L430: */
;
}
/*< 440 continue >*/
L440:
/*< if (ls .ne. l) go to 450 >*/
if (ls != l) {
goto L450;
}
/*< kase = 3 >*/
kase = 3;
/*< go to 470 >*/
goto L470;
/*< 450 continue >*/
L450:
/*< if (ls .ne. m) go to 460 >*/
if (ls != m) {
goto L460;
}
/*< kase = 1 >*/
kase = 1;
/*< go to 470 >*/
goto L470;
/*< 460 continue >*/
L460:
/*< kase = 2 >*/
kase = 2;
/*< l = ls >*/
l = ls;
/*< 470 continue >*/
L470:
/*< 480 continue >*/
L480:
/*< l = l + 1 >*/
++l;
/* perform the task indicated by kase. */
/*< go to (490,520,540,570), kase >*/
switch (kase) {
case 1: goto L490;
case 2: goto L520;
case 3: goto L540;
case 4: goto L570;
}
/* deflate negligible s(m). */
/*< 490 continue >*/
L490:
/*< mm1 = m - 1 >*/
mm1 = m - 1;
/*< f = e(m-1) >*/
f = e[m - 1];
/*< e(m-1) = 0.0d0 >*/
e[m - 1] = 0.;
/*< do 510 kk = l, mm1 >*/
i__1 = mm1;
for (kk = l; kk <= i__1; ++kk) {
/*< k = mm1 - kk + l >*/
k = mm1 - kk + l;
/*< t1 = s(k) >*/
t1 = s[k];
/*< call drotg(t1,f,cs,sn) >*/
drotg_(&t1, &f, &cs, &sn);
/*< s(k) = t1 >*/
s[k] = t1;
/*< if (k .eq. l) go to 500 >*/
if (k == l) {
goto L500;
}
/*< f = -sn*e(k-1) >*/
f = -sn * e[k - 1];
/*< e(k-1) = cs*e(k-1) >*/
e[k - 1] = cs * e[k - 1];
/*< 500 continue >*/
L500:
/*< if (wantv) call drot(p,v(1,k),1,v(1,m),1,cs,sn) >*/
if (wantv) {
drot_(p, &v[k * v_dim1 + 1], &c__1, &v[m * v_dim1 + 1], &c__1, &
cs, &sn);
}
/*< 510 continue >*/
/* L510: */
}
/*< go to 610 >*/
goto L610;
/* split at negligible s(l). */
/*< 520 continue >*/
L520:
/*< f = e(l-1) >*/
f = e[l - 1];
/*< e(l-1) = 0.0d0 >*/
e[l - 1] = 0.;
/*< do 530 k = l, m >*/
i__1 = m;
for (k = l; k <= i__1; ++k) {
/*< t1 = s(k) >*/
t1 = s[k];
/*< call drotg(t1,f,cs,sn) >*/
drotg_(&t1, &f, &cs, &sn);
/*< s(k) = t1 >*/
s[k] = t1;
/*< f = -sn*e(k) >*/
f = -sn * e[k];
/*< e(k) = cs*e(k) >*/
e[k] = cs * e[k];
/*< if (wantu) call drot(n,u(1,k),1,u(1,l-1),1,cs,sn) >*/
if (wantu) {
drot_(n, &u[k * u_dim1 + 1], &c__1, &u[(l - 1) * u_dim1 + 1], &
c__1, &cs, &sn);
}
/*< 530 continue >*/
/* L530: */
}
/*< go to 610 >*/
goto L610;
/* perform one qr step. */
/*< 540 continue >*/
L540:
/* calculate the shift. */
/*< >*/
/* Computing MAX */
d__6 = (d__1 = s[m], abs(d__1)), d__7 = (d__2 = s[m - 1], abs(d__2)),
d__6 = max(d__6,d__7), d__7 = (d__3 = e[m - 1], abs(d__3)), d__6 =
max(d__6,d__7), d__7 = (d__4 = s[l], abs(d__4)), d__6 = max(d__6,
d__7), d__7 = (d__5 = e[l], abs(d__5));
scale = max(d__6,d__7);
/*< sm = s(m)/scale >*/
sm = s[m] / scale;
/*< smm1 = s(m-1)/scale >*/
smm1 = s[m - 1] / scale;
/*< emm1 = e(m-1)/scale >*/
emm1 = e[m - 1] / scale;
/*< sl = s(l)/scale >*/
sl = s[l] / scale;
/*< el = e(l)/scale >*/
el = e[l] / scale;
/*< b = ((smm1 + sm)*(smm1 - sm) + emm1**2)/2.0d0 >*/
/* Computing 2nd power */
d__1 = emm1;
b = ((smm1 + sm) * (smm1 - sm) + d__1 * d__1) / 2.;
/*< c = (sm*emm1)**2 >*/
/* Computing 2nd power */
d__1 = sm * emm1;
c__ = d__1 * d__1;
/*< shift = 0.0d0 >*/
shift = 0.;
/*< if (b .eq. 0.0d0 .and. c .eq. 0.0d0) go to 550 >*/
if (b == 0. && c__ == 0.) {
goto L550;
}
/*< shift = dsqrt(b**2+c) >*/
/* Computing 2nd power */
d__1 = b;
shift = sqrt(d__1 * d__1 + c__);
/*< if (b .lt. 0.0d0) shift = -shift >*/
if (b < 0.) {
shift = -shift;
}
/*< shift = c/(b + shift) >*/
shift = c__ / (b + shift);
/*< 550 continue >*/
L550:
/*< f = (sl + sm)*(sl - sm) + shift >*/
f = (sl + sm) * (sl - sm) + shift;
/*< g = sl*el >*/
g = sl * el;
/* chase zeros. */
/*< mm1 = m - 1 >*/
mm1 = m - 1;
/*< do 560 k = l, mm1 >*/
i__1 = mm1;
for (k = l; k <= i__1; ++k) {
/*< call drotg(f,g,cs,sn) >*/
drotg_(&f, &g, &cs, &sn);
/*< if (k .ne. l) e(k-1) = f >*/
if (k != l) {
e[k - 1] = f;
}
/*< f = cs*s(k) + sn*e(k) >*/
f = cs * s[k] + sn * e[k];
/*< e(k) = cs*e(k) - sn*s(k) >*/
e[k] = cs * e[k] - sn * s[k];
/*< g = sn*s(k+1) >*/
g = sn * s[k + 1];
/*< s(k+1) = cs*s(k+1) >*/
s[k + 1] = cs * s[k + 1];
/*< if (wantv) call drot(p,v(1,k),1,v(1,k+1),1,cs,sn) >*/
if (wantv) {
drot_(p, &v[k * v_dim1 + 1], &c__1, &v[(k + 1) * v_dim1 + 1], &
c__1, &cs, &sn);
}
/*< call drotg(f,g,cs,sn) >*/
drotg_(&f, &g, &cs, &sn);
/*< s(k) = f >*/
s[k] = f;
/*< f = cs*e(k) + sn*s(k+1) >*/
f = cs * e[k] + sn * s[k + 1];
/*< s(k+1) = -sn*e(k) + cs*s(k+1) >*/
s[k + 1] = -sn * e[k] + cs * s[k + 1];
/*< g = sn*e(k+1) >*/
g = sn * e[k + 1];
/*< e(k+1) = cs*e(k+1) >*/
e[k + 1] = cs * e[k + 1];
/*< >*/
if (wantu && k < *n) {
drot_(n, &u[k * u_dim1 + 1], &c__1, &u[(k + 1) * u_dim1 + 1], &
c__1, &cs, &sn);
}
/*< 560 continue >*/
/* L560: */
}
/*< e(m-1) = f >*/
e[m - 1] = f;
/*< iter = iter + 1 >*/
++iter;
/*< go to 610 >*/
goto L610;
/* convergence. */
/*< 570 continue >*/
L570:
/* make the singular value positive. */
/*< if (s(l) .ge. 0.0d0) go to 580 >*/
if (s[l] >= 0.) {
goto L580;
}
/*< s(l) = -s(l) >*/
s[l] = -s[l];
/*< if (wantv) call dscal(p,-1.0d0,v(1,l),1) >*/
if (wantv) {
dscal_(p, &c_b44, &v[l * v_dim1 + 1], &c__1);
}
/*< 580 continue >*/
L580:
/* order the singular value. */
/*< 590 if (l .eq. mm) go to 600 >*/
L590:
if (l == mm) {
goto L600;
}
/* ...exit */
/*< if (s(l) .ge. s(l+1)) go to 600 >*/
if (s[l] >= s[l + 1]) {
goto L600;
}
/*< t = s(l) >*/
t = s[l];
/*< s(l) = s(l+1) >*/
s[l] = s[l + 1];
/*< s(l+1) = t >*/
s[l + 1] = t;
/*< >*/
if (wantv && l < *p) {
dswap_(p, &v[l * v_dim1 + 1], &c__1, &v[(l + 1) * v_dim1 + 1], &c__1);
}
/*< >*/
if (wantu && l < *n) {
dswap_(n, &u[l * u_dim1 + 1], &c__1, &u[(l + 1) * u_dim1 + 1], &c__1);
}
/*< l = l + 1 >*/
++l;
/*< go to 590 >*/
goto L590;
/*< 600 continue >*/
L600:
/*< iter = 0 >*/
iter = 0;
/*< m = m - 1 >*/
--m;
/*< 610 continue >*/
L610:
/*< go to 360 >*/
goto L360;
/*< 620 continue >*/
L620:
/*< return >*/
return 0;
/*< end >*/
} /* dsvdc_ */
#ifdef __cplusplus
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -