📄 multi-method.txt
字号:
temp = a[j - 1 + l * a_dim1];
a[j - 1 + l * a_dim1] = cc * temp + ss * a[j + l * a_dim1]
;
a[j + l * a_dim1] = -ss * temp + cc * a[j + l * a_dim1];
}
/* L270: */
}
/* Apply procedure G2 (CC,SS,B(J-1),B(J)) */
temp = b[j - 1];
b[j - 1] = cc * temp + ss * b[j];
b[j] = -ss * temp + cc * b[j];
/* L280: */
}
}
npp1 = nsetp;
--nsetp;
--iz1;
index[iz1] = i__;
/* SEE IF THE REMAINING COEFFS IN SET P ARE FEASIBLE. THEY SHOULD
*/
/* BE BECAUSE OF THE WAY ALPHA WAS DETERMINED. */
/* IF ANY ARE INFEASIBLE IT IS DUE TO ROUND-OFF ERROR. ANY */
/* THAT ARE NONPOSITIVE WILL BE SET TO ZERO */
/* AND MOVED FROM SET P TO SET Z. */
i__1 = nsetp;
for (jj = 1; jj <= i__1; ++jj) {
i__ = index[jj];
if (x[i__] <= 0.) {
goto L260;
}
/* L300: */
}
/* COPY B( ) INTO ZZ( ). THEN SOLVE AGAIN AND LOOP BACK. */
i__1 = *m;
for (i__ = 1; i__ <= i__1; ++i__) {
/* L310: */
zz[i__] = b[i__];
}
rtnkey = 2;
goto L400;
L320:
goto L210;
/* ****** END OF SECONDARY LOOP ****** */
L330:
i__1 = nsetp;
for (ip = 1; ip <= i__1; ++ip) {
i__ = index[ip];
/* L340: */
x[i__] = zz[ip];
}
/* ALL NEW COEFFS ARE POSITIVE. LOOP BACK TO BEGINNING. */
goto L30;
/* ****** END OF MAIN LOOP ****** */
/* COME TO HERE FOR TERMINATION. */
/* COMPUTE THE NORM OF THE FINAL RESIDUAL VECTOR. */
L350:
sm = 0.;
if (npp1 <= *m) {
i__1 = *m;
for (i__ = npp1; i__ <= i__1; ++i__) {
/* L360: */
/* Computing 2nd power */
d__1 = b[i__];
sm += d__1 * d__1;
}
} else {
i__1 = *n;
for (j = 1; j <= i__1; ++j) {
/* L380: */
w[j] = 0.;
}
}
*rnorm = sqrt(sm);
return 0;
/* THE FOLLOWING BLOCK OF CODE IS USED AS AN INTERNAL SUBROUTINE */
/* TO SOLVE THE TRIANGULAR SYSTEM, PUTTING THE SOLUTION IN ZZ(). */
L400:
i__1 = nsetp;
for (l = 1; l <= i__1; ++l) {
ip = nsetp + 1 - l;
if (l != 1) {
i__2 = ip;
for (ii = 1; ii <= i__2; ++ii) {
zz[ii] -= a[ii + jj * a_dim1] * zz[ip + 1];
/* L410: */
}
}
jj = index[ip];
zz[ip] /= a[ip + jj * a_dim1];
/* L430: */
}
switch ((int)rtnkey) {
case 1: goto L200;
case 2: goto L320;
}
/* The next line was added after the f2c translation to keep
compilers from complaining about a void return from a non-void
function. */
return 0;
} /* nnls_ */
/* Subroutine */ int g1_(a, b, cterm, sterm, sig)
doublereal *a, *b, *cterm, *sterm, *sig;
{
/* System generated locals */
doublereal d__1;
/* Builtin functions */
/* The following line was commented out after the f2c translation */
/* double sqrt(), d_sign(); */
/* Local variables */
static doublereal xr, yr;
/* COMPUTE ORTHOGONAL ROTATION MATRIX.. */
/* The original version of this code was developed by */
/* Charles L. Lawson and Richard J. Hanson at Jet Propulsion Laboratory
*/
/* 1973 JUN 12, and published in the book */
/* "SOLVING LEAST SQUARES PROBLEMS", Prentice-HalL, 1974. */
/* Revised FEB 1995 to accompany reprinting of the book by SIAM. */
/* COMPUTE.. MATRIX (C, S) SO THAT (C, S)(A) = (SQRT(A**2+B**2)) */
/* (-S,C) (-S,C)(B) ( 0 ) */
/* COMPUTE SIG = SQRT(A**2+B**2) */
/* SIG IS COMPUTED LAST TO ALLOW FOR THE POSSIBILITY THAT */
/* SIG MAY BE IN THE SAME LOCATION AS A OR B . */
/* ------------------------------------------------------------------
*/
/* ------------------------------------------------------------------
*/
if (nnls_abs(*a) > nnls_abs(*b)) {
xr = *b / *a;
/* Computing 2nd power */
d__1 = xr;
yr = sqrt(d__1 * d__1 + 1.);
d__1 = 1. / yr;
*cterm = d_sign(&d__1, a);
*sterm = *cterm * xr;
*sig = nnls_abs(*a) * yr;
return 0;
}
if (*b != 0.) {
xr = *a / *b;
/* Computing 2nd power */
d__1 = xr;
yr = sqrt(d__1 * d__1 + 1.);
d__1 = 1. / yr;
*sterm = d_sign(&d__1, b);
*cterm = *sterm * xr;
*sig = nnls_abs(*b) * yr;
return 0;
}
*sig = 0.;
*cterm = 0.;
*sterm = 1.;
return 0;
} /* g1_ */
/* SUBROUTINE H12 (MODE,LPIVOT,L1,M,U,IUE,UP,C,ICE,ICV,NCV) */
/* CONSTRUCTION AND/OR APPLICATION OF A SINGLE */
/* HOUSEHOLDER TRANSFORMATION.. Q = I + U*(U**T)/B */
/* The original version of this code was developed by */
/* Charles L. Lawson and Richard J. Hanson at Jet Propulsion Laboratory */
/* 1973 JUN 12, and published in the book */
/* "SOLVING LEAST SQUARES PROBLEMS", Prentice-HalL, 1974. */
/* Revised FEB 1995 to accompany reprinting of the book by SIAM. */
/* ------------------------------------------------------------------ */
/* Subroutine Arguments */
/* MODE = 1 OR 2 Selects Algorithm H1 to construct and apply a */
/* Householder transformation, or Algorithm H2 to apply a */
/* previously constructed transformation. */
/* LPIVOT IS THE INDEX OF THE PIVOT ELEMENT. */
/* L1,M IF L1 .LE. M THE TRANSFORMATION WILL BE CONSTRUCTED TO */
/* ZERO ELEMENTS INDEXED FROM L1 THROUGH M. IF L1 GT. M */
/* THE SUBROUTINE DOES AN IDENTITY TRANSFORMATION. */
/* U(),IUE,UP On entry with MODE = 1, U() contains the pivot */
/* vector. IUE is the storage increment between elements. */
/* On exit when MODE = 1, U() and UP contain quantities */
/* defining the vector U of the Householder transformation. */
/* on entry with MODE = 2, U() and UP should contain */
/* quantities previously computed with MODE = 1. These will */
/* not be modified during the entry with MODE = 2. */
/* C() ON ENTRY with MODE = 1 or 2, C() CONTAINS A MATRIX WHICH */
/* WILL BE REGARDED AS A SET OF VECTORS TO WHICH THE */
/* HOUSEHOLDER TRANSFORMATION IS TO BE APPLIED. */
/* ON EXIT C() CONTAINS THE SET OF TRANSFORMED VECTORS. */
/* ICE STORAGE INCREMENT BETWEEN ELEMENTS OF VECTORS IN C(). */
/* ICV STORAGE INCREMENT BETWEEN VECTORS IN C(). */
/* NCV NUMBER OF VECTORS IN C() TO BE TRANSFORMED. IF NCV .LE. 0 */
/* NO OPERATIONS WILL BE DONE ON C(). */
/* ------------------------------------------------------------------ */
/* Subroutine */ int h12_(mode, lpivot, l1, m, u, iue, up, c__, ice, icv, ncv)
integer *mode, *lpivot, *l1, *m;
doublereal *u;
integer *iue;
doublereal *up, *c__;
integer *ice, *icv, *ncv;
{
/* System generated locals */
integer u_dim1, u_offset, i__1, i__2;
doublereal d__1, d__2;
/* Builtin functions */
/* The following line was commented out after the f2c translation */
/* double sqrt(); */
/* Local variables */
static integer incr;
static doublereal b;
static integer i__, j;
static doublereal clinv;
static integer i2, i3, i4;
static doublereal cl, sm;
/* ------------------------------------------------------------------
*/
/* double precision U(IUE,M) */
/* ------------------------------------------------------------------
*/
/* Parameter adjustments */
u_dim1 = *iue;
u_offset = u_dim1 + 1;
u -= u_offset;
--c__;
/* Function Body */
if (0 >= *lpivot || *lpivot >= *l1 || *l1 > *m) {
return 0;
}
cl = (d__1 = u[*lpivot * u_dim1 + 1], nnls_abs(d__1));
if (*mode == 2) {
goto L60;
}
/* ****** CONSTRUCT THE TRANSFORMATION. ******
*/
i__1 = *m;
for (j = *l1; j <= i__1; ++j) {
/* L10: */
/* Computing MAX */
d__2 = (d__1 = u[j * u_dim1 + 1], nnls_abs(d__1));
cl = nnls_max(d__2,cl);
}
if (cl <= 0.) {
goto L130;
} else {
goto L20;
}
L20:
clinv = 1. / cl;
/* Computing 2nd power */
d__1 = u[*lpivot * u_dim1 + 1] * clinv;
sm = d__1 * d__1;
i__1 = *m;
for (j = *l1; j <= i__1; ++j) {
/* L30: */
/* Computing 2nd power */
d__1 = u[j * u_dim1 + 1] * clinv;
sm += d__1 * d__1;
}
cl *= sqrt(sm);
if (u[*lpivot * u_dim1 + 1] <= 0.) {
goto L50;
} else {
goto L40;
}
L40:
cl = -cl;
L50:
*up = u[*lpivot * u_dim1 + 1] - cl;
u[*lpivot * u_dim1 + 1] = cl;
goto L70;
/* ****** APPLY THE TRANSFORMATION I+U*(U**T)/B TO C. ******
*/
L60:
if (cl <= 0.) {
goto L130;
} else {
goto L70;
}
L70:
if (*ncv <= 0) {
return 0;
}
b = *up * u[*lpivot * u_dim1 + 1];
/* B MUST BE NONPOSITIVE HERE. IF B = 0., RETURN.
*/
if (b >= 0.) {
goto L130;
} else {
goto L80;
}
L80:
b = 1. / b;
i2 = 1 - *icv + *ice * (*lpivot - 1);
incr = *ice * (*l1 - *lpivot);
i__1 = *ncv;
for (j = 1; j <= i__1; ++j) {
i2 += *icv;
i3 = i2 + incr;
i4 = i3;
sm = c__[i2] * *up;
i__2 = *m;
for (i__ = *l1; i__ <= i__2; ++i__) {
sm += c__[i3] * u[i__ * u_dim1 + 1];
/* L90: */
i3 += *ice;
}
if (sm != 0.) {
goto L100;
} else {
goto L120;
}
L100:
sm *= b;
c__[i2] += sm * *up;
i__2 = *m;
for (i__ = *l1; i__ <= i__2; ++i__) {
c__[i4] += sm * u[i__ * u_dim1 + 1];
/* L110: */
i4 += *ice;
}
L120:
;
}
L130:
return 0;
} /* h12_ */
doublereal diff_(x, y)
doublereal *x, *y;
{
/* System generated locals */
doublereal ret_val;
/* Function used in tests that depend on machine precision. */
/* The original version of this code was developed by */
/* Charles L. Lawson and Richard J. Hanson at Jet Propulsion Laboratory
*/
/* 1973 JUN 7, and published in the book */
/* "SOLVING LEAST SQUARES PROBLEMS", Prentice-HalL, 1974. */
/* Revised FEB 1995 to accompany reprinting of the book by SIAM. */
ret_val = *x - *y;
return ret_val;
} /* diff_ */
/* The following subroutine was added after the f2c translation */
int nnls_c(double* a, const int* mda, const int* m, const int* n, double* b,
double* x, double* rnorm, double* w, double* zz, int* index,
int* mode)
{
return (nnls_(a, mda, m, n, b, x, rnorm, w, zz, index, mode));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -