static char Sccsid[] = "a8.c @(#)a8.c 1.1 10/1/82 Berkeley "; #include "apl.h" ex_mdom() { register data *dp; register a; int i, j; struct item *p, *q; p = fetch1(); if(p->rank != 2) error("mdom C"); a = p->dim[0]; q = newdat(DA, 2, a*a); q->dim[0] = a; q->dim[1] = a; *sp++ = q; dp = q->datap; for(i=0; itype != DA || q->type != DA) error("domino T"); if((p->rank != 1 && p->rank != 2) || q->rank != 2) error("domino C"); m = q->dim[0]; n = q->dim[1]; if(m < n || m != p->dim[0]) error("domino R"); o = 1; if(p->rank == 2) o = p->dim[1]; al = alloc(n*(SINT + SDAT*m + SDAT*3) + SDAT*m); if(al == 0) error("domino M"); dmn = (data *)al; dn1 = dmn + m*n; dn2 = dn1 + n; dn3 = dn2 + n; dm = dn3 + n; in = (int *)(dm + m); d1 = q->datap; for(b=0; bdatap, q->datap); free(dmn); if(a) error("domino D"); sp--; pop(); *sp++ = p; p->dim[0] = n; p->size = n*o; } lsq(dmn, dn1, dn2, dn3, dm, in, m, n, p, d1, d2) data *dmn, *dn1, *dn2, *dn3, *dm; data *d1, *d2; int *in; { register data *dp1, *dp2; double f1, f2, f3, f4; int i, j, k, l; dp1 = dmn; dp2 = dn1; for(j=0; j= 0.) f2 = -f2; dn2[k] = f2; f1 = 1./(f1 - f3*f2); dmn[k*m+k] = f3 - f2; for(j=k+1; j 0.0625*f4) return(1); loop: if(intflg) return(1); dp1 = dn3; dp2 = dn1; for(i=0; i=0; i--) { f1 = -*--dp1; k = (i+1)*m + i; for(j=i+1; j