📄 dqrsl.c
字号:
/* linpack/dqrsl.f -- translated by f2c (version 20050501).
You must link the resulting object file with libf2c:
on Microsoft Windows system, link with libf2c.lib;
on Linux or Unix systems, link with .../path/to/libf2c.a -lm
or, if you install libf2c.a in a standard place, with -lf2c -lm
-- in that order, at the end of the command line, as in
cc *.o -lf2c -lm
Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
http://www.netlib.org/f2c/libf2c.zip
*/
#ifdef __cplusplus
extern "C" {
#endif
#include "v3p_netlib.h"
/* Table of constant values */
static integer c__1 = 1;
/*< subroutine dqrsl(x,ldx,n,k,qraux,y,qy,qty,b,rsd,xb,job,info) >*/
/* Subroutine */ int dqrsl_(doublereal *x, integer *ldx, integer *n, integer *
k, doublereal *qraux, doublereal *y, doublereal *qy, doublereal *qty,
doublereal *b, doublereal *rsd, doublereal *xb, integer *job, integer
*info)
{
/* System generated locals */
integer x_dim1, x_offset, i__1, i__2;
/* Local variables */
integer i__, j;
doublereal t;
logical cb;
integer jj;
logical cr;
integer ju, kp1;
logical cxb, cqy;
extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *,
integer *);
doublereal temp;
logical cqty;
extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *,
doublereal *, integer *), daxpy_(integer *, doublereal *,
doublereal *, integer *, doublereal *, integer *);
/*< integer ldx,n,k,job,info >*/
/*< >*/
/* dqrsl applies the output of dqrdc to compute coordinate */
/* transformations, projections, and least squares solutions. */
/* for k .le. min(n,p), let xk be the matrix */
/* xk = (x(jpvt(1)),x(jpvt(2)), ... ,x(jpvt(k))) */
/* formed from columns jpvt(1), ... ,jpvt(k) of the original */
/* n x p matrix x that was input to dqrdc (if no pivoting was */
/* done, xk consists of the first k columns of x in their */
/* original order). dqrdc produces a factored orthogonal matrix q */
/* and an upper triangular matrix r such that */
/* xk = q * (r) */
/* (0) */
/* this information is contained in coded form in the arrays */
/* x and qraux. */
/* on entry */
/* x double precision(ldx,p). */
/* x contains the output of dqrdc. */
/* ldx integer. */
/* ldx is the leading dimension of the array x. */
/* n integer. */
/* n is the number of rows of the matrix xk. it must */
/* have the same value as n in dqrdc. */
/* k integer. */
/* k is the number of columns of the matrix xk. k */
/* must nnot be greater than min(n,p), where p is the */
/* same as in the calling sequence to dqrdc. */
/* qraux double precision(p). */
/* qraux contains the auxiliary output from dqrdc. */
/* y double precision(n) */
/* y contains an n-vector that is to be manipulated */
/* by dqrsl. */
/* job integer. */
/* job specifies what is to be computed. job has */
/* the decimal expansion abcde, with the following */
/* meaning. */
/* if a.ne.0, compute qy. */
/* if b,c,d, or e .ne. 0, compute qty. */
/* if c.ne.0, compute b. */
/* if d.ne.0, compute rsd. */
/* if e.ne.0, compute xb. */
/* note that a request to compute b, rsd, or xb */
/* automatically triggers the computation of qty, for */
/* which an array must be provided in the calling */
/* sequence. */
/* on return */
/* qy double precision(n). */
/* qy conntains q*y, if its computation has been */
/* requested. */
/* qty double precision(n). */
/* qty contains trans(q)*y, if its computation has */
/* been requested. here trans(q) is the */
/* transpose of the matrix q. */
/* b double precision(k) */
/* b contains the solution of the least squares problem */
/* minimize norm2(y - xk*b), */
/* if its computation has been requested. (note that */
/* if pivoting was requested in dqrdc, the j-th */
/* component of b will be associated with column jpvt(j) */
/* of the original matrix x that was input into dqrdc.) */
/* rsd double precision(n). */
/* rsd contains the least squares residual y - xk*b, */
/* if its computation has been requested. rsd is */
/* also the orthogonal projection of y onto the */
/* orthogonal complement of the column space of xk. */
/* xb double precision(n). */
/* xb contains the least squares approximation xk*b, */
/* if its computation has been requested. xb is also */
/* the orthogonal projection of y onto the column space */
/* of x. */
/* info integer. */
/* info is zero unless the computation of b has */
/* been requested and r is exactly singular. in */
/* this case, info is the index of the first zero */
/* diagonal element of r and b is left unaltered. */
/* the parameters qy, qty, b, rsd, and xb are not referenced */
/* if their computation is not requested and in this case */
/* can be replaced by dummy variables in the calling program. */
/* to save storage, the user may in some cases use the same */
/* array for different parameters in the calling sequence. a */
/* frequently occurring example is when one wishes to compute */
/* any of b, rsd, or xb and does not need y or qty. in this */
/* case one may identify y, qty, and one of b, rsd, or xb, while */
/* providing separate arrays for anything else that is to be */
/* computed. thus the calling sequence */
/* call dqrsl(x,ldx,n,k,qraux,y,dum,y,b,y,dum,110,info) */
/* will result in the computation of b and rsd, with rsd */
/* overwriting y. more generally, each item in the following */
/* list contains groups of permissible identifications for */
/* a single callinng sequence. */
/* 1. (y,qty,b) (rsd) (xb) (qy) */
/* 2. (y,qty,rsd) (b) (xb) (qy) */
/* 3. (y,qty,xb) (b) (rsd) (qy) */
/* 4. (y,qy) (qty,b) (rsd) (xb) */
/* 5. (y,qy) (qty,rsd) (b) (xb) */
/* 6. (y,qy) (qty,xb) (b) (rsd) */
/* in any group the value returned in the array allocated to */
/* the group corresponds to the last member of the group. */
/* linpack. this version dated 08/14/78 . */
/* g.w. stewart, university of maryland, argonne national lab. */
/* dqrsl uses the following functions and subprograms. */
/* blas daxpy,dcopy,ddot */
/* fortran dabs,min0,mod */
/* internal variables */
/*< integer i,j,jj,ju,kp1 >*/
/*< double precision ddot,t,temp >*/
/*< logical cb,cqy,cqty,cr,cxb >*/
/* set info flag. */
/*< info = 0 >*/
/* Parameter adjustments */
x_dim1 = *ldx;
x_offset = 1 + x_dim1;
x -= x_offset;
--qraux;
--y;
--qy;
--qty;
--b;
--rsd;
--xb;
/* Function Body */
*info = 0;
/* determine what is to be computed. */
/*< cqy = job/10000 .ne. 0 >*/
cqy = *job / 10000 != 0;
/*< cqty = mod(job,10000) .ne. 0 >*/
cqty = *job % 10000 != 0;
/*< cb = mod(job,1000)/100 .ne. 0 >*/
cb = *job % 1000 / 100 != 0;
/*< cr = mod(job,100)/10 .ne. 0 >*/
cr = *job % 100 / 10 != 0;
/*< cxb = mod(job,10) .ne. 0 >*/
cxb = *job % 10 != 0;
/*< ju = min0(k,n-1) >*/
/* Computing MIN */
i__1 = *k, i__2 = *n - 1;
ju = min(i__1,i__2);
/* special action when n=1. */
/*< if (ju .ne. 0) go to 40 >*/
if (ju != 0) {
goto L40;
}
/*< if (cqy) qy(1) = y(1) >*/
if (cqy) {
qy[1] = y[1];
}
/*< if (cqty) qty(1) = y(1) >*/
if (cqty) {
qty[1] = y[1];
}
/*< if (cxb) xb(1) = y(1) >*/
if (cxb) {
xb[1] = y[1];
}
/*< if (.not.cb) go to 30 >*/
if (! cb) {
goto L30;
}
/*< if (x(1,1) .ne. 0.0d0) go to 10 >*/
if (x[x_dim1 + 1] != 0.) {
goto L10;
}
/*< info = 1 >*/
*info = 1;
/*< go to 20 >*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -