1 #include <../../nrnconf.h>
42 static char rcsid[] =
"qrfactor.c,v 1.1 1997/12/04 17:55:45 hines Exp";
52 #define sign(x) ((x) > 0.0 ? 1 : ((x) < 0.0 ? -1 : 0 ))
75 limit =
min(
A->m,
A->n);
76 if (
diag->dim < limit )
82 for (
k=0;
k<limit;
k++ )
109 Real beta, maxgamma, sum, tmp;
111 if ( !
A || !
diag || ! px )
113 limit =
min(
A->m,
A->n);
114 if (
diag->dim < limit || px->
size !=
A->n )
125 for (
j=0;
j<
A->n;
j++ )
129 for (
i=0;
i<
A->m;
i++ )
134 for (
k=0;
k<limit;
k++ )
137 i_max =
k; maxgamma = gamma->
ve[
k];
138 for (
i=
k+1;
i<
A->n;
i++ )
141 if ( gamma->
ve[
i] > maxgamma )
142 { maxgamma = gamma->
ve[
i]; i_max =
i; }
149 gamma->
ve[
k] = gamma->
ve[i_max];
150 gamma->
ve[i_max] = tmp;
156 for (
i=0;
i<
A->m;
i++ )
159 A->me[
i][
k] =
A->me[
i][i_max];
160 A->me[
i][i_max] = tmp;
168 diag->ve[
k] = tmp1->ve[
k];
175 for (
j=
k+1;
j<
A->n;
j++ )
191 Real beta, r_ii, tmp_val;
193 limit =
min(QR->m,QR->n);
195 if ( ! QR || !
diag || ! b )
197 if (
diag->dim < limit || b->
dim != QR->m )
206 for (
k = 0 ;
k < limit ;
k++ )
212 beta = ( tmp_val == 0.0 ) ? 0.0 : 1.0/tmp_val;
232 Real beta, r_ii, tmp_val;
235 limit =
min(QR->m,QR->n);
236 if ( ! QR || !
diag )
238 if (
diag->dim < limit )
240 if ( Qout==(
MAT *)
NULL || Qout->m < QR->m || Qout->n < QR->m )
241 Qout =
m_get(QR->m,QR->m);
248 for (
i=0;
i<QR->m ;
i++ )
251 for (
j=0;
j<QR->m ;
j++ )
256 for (
j=limit-1;
j>=0;
j-- )
259 r_ii =
fabs(tmp2->ve[
j]);
260 tmp2->ve[
j] =
diag->ve[
j];
262 beta = ( tmp_val == 0.0 ) ? 0.0 : 1.0/tmp_val;
285 for (
i=1;
i<QR->m;
i++ )
286 for (
j=0;
j<QR->n &&
j<
i;
j++ )
287 Rout->me[
i][
j] = 0.0;
302 if ( ! QR || !
diag || ! b )
304 limit =
min(QR->m,QR->n);
305 if (
diag->dim < limit || b->
dim != QR->m )
329 if ( ! QR || !
diag || ! pivot || ! b )
331 if ( (QR->m >
diag->dim &&QR->n >
diag->dim) || QR->n != pivot->
size )
351 limit =
min(U->m,U->n);
352 if ( limit != x->
dim )
354 if ( out ==
VNULL || out->
dim < limit )
357 for (
i = 0;
i < limit;
i++ )
372 limit =
min(U->m,U->n);
373 if ( out ==
VNULL || out->
dim < limit )
376 for (
i = limit-1;
i >= 0;
i-- )
379 for (
j = 0;
j <=
i;
j++ )
380 sum += U->me[
j][
i]*x->
ve[
j];
395 Real beta, r_ii, s, tmp_val;
397 if ( !
A || !
diag || !
c )
409 sc->
ve[0] =
c->ve[0]/
A->me[0][0];
414 for (
i = 1;
i <
p;
i++ )
417 for (
j = 0;
j <
i;
j++ )
418 s +=
A->me[
j][
i]*sc->
ve[
j];
419 if (
A->me[
i][
i] == 0.0 )
424 for (
i =
k;
i >= 0;
i--)
427 for (
j =
i+1;
j <
n;
j++ )
428 s +=
A->me[
j][
i]*sc->
ve[
j];
431 beta = ( tmp_val == 0.0 ) ? 0.0 : 1.0/tmp_val;
434 for (
j =
i+1;
j <
n;
j++ )
435 sc->
ve[
j] -= tmp_val*
A->me[
j][
i];
453 Real norm1, norm2, sum, tmp1, tmp2;
459 limit =
min(QR->m,QR->n);
460 for (
i = 0;
i < limit;
i++ )
461 if ( QR->me[
i][
i] == 0.0 )
468 for (
i = 0;
i < limit;
i++ )
471 for (
j = 0;
j <
i;
j++ )
472 sum -= QR->me[
j][
i]*y->
ve[
j];
473 sum -= (sum < 0.0) ? 1.0 : -1.0;
474 y->
ve[
i] = sum / QR->me[
i][
i];
479 for (
i = 0;
i < 3;
i++ )
492 for (
i = limit-1;
i >= 0;
i-- )
495 for (
j =
i+1;
j < limit;
j++ )
496 sum += QR->me[
i][
j]*y->
ve[
j];
497 y->
ve[
i] = (sum >= 0.0) ? 1.0 : -1.0;
498 y->
ve[
i] = (QR->me[
i][
i] >= 0.0) ? y->
ve[
i] : - y->
ve[
i];
502 for (
i = 0;
i < 3;
i++ )
#define error(err_num, fn_name)
MAT * hhtrcols(MAT *M, u_int i0, u_int j0, VEC *hh, double beta)
VEC * hhtrvec(VEC *hh, double beta, u_int i0, VEC *in, VEC *out)
VEC * hhvec(VEC *vec, u_int i0, Real *beta, VEC *out, Real *newval)
static Object ** v_resize(void *v)
double __ip__(Real *dp1, Real *dp2, int len)
VEC * UTsolve(MAT *A, VEC *b, VEC *x, double diag_val)
PERM * px_transp(PERM *px, u_int i, u_int j)
#define set_col(mat, col, vec)
VEC * pxinv_vec(PERM *, VEC *, VEC *)
VEC * sv_mlt(double, VEC *, VEC *)
VEC * get_col(MAT *, u_int, VEC *)
#define MEM_STAT_REG(var, type)
int const size_t const size_t n
static philox4x32_key_t k
MAT * makeQ(MAT *QR, diag, MAT *Qout)
MAT * makeR(MAT *QR, MAT *Rout)
static VEC * Umlt(MAT *U, VEC *x, VEC *out)
MAT * QRfactor(MAT *A, diag)
VEC * _Qsolve(MAT *QR, diag, VEC *diag *b, VEC *diag *x, VEC *diag *tmp)
static VEC * UTmlt(MAT *U, VEC *x, VEC *out)
double QRcondest(MAT *QR)
MAT * QRCPfactor(MAT *A, diag, PERM *px)
VEC * QRTsolve(MAT *A, VEC *diag, VEC *c, VEC *sc)
VEC * QRCPsolve(MAT *QR, diag, PERM *pivot, VEC *b, VEC *x)
VEC * QRsolve(MAT *QR, diag, VEC *diag *b, VEC *diag *x)