tvector<nr_type_t> operator * (tvector<nr_type_t> a, tvector<nr_type_t> b) { assert (a.getSize () == b.getSize ()); int n = a.getSize (); tvector<nr_type_t> res (n); for (int i = 0; i < n; i++) res.set (i, a.get (i) * b.get (i)); return res; }
nr_double_t maxnorm (tvector<nr_type_t> a) { nr_double_t nMax = 0, n; for (int i = 0; i < a.getSize (); i++) { n = norm (a.get (i)); if (n > nMax) nMax = n; } return nMax; }
tvector<nr_type_t> operator * (tvector<nr_type_t> a, tmatrix<nr_type_t> b) { assert (a.getSize () == b.getRows ()); int r, c, n = b.getRows (); nr_type_t z; tvector<nr_type_t> res (n); for (c = 0; c < n; c++) { for (r = 0, z = 0; r < n; r++) z += a.get (r) * b.get (r, c); res.set (c, z); } return res; }
nr_double_t norm (tvector<nr_type_t> a) { #if 0 nr_double_t k = 0; for (int i = 0; i < a.getSize (); i++) k += norm (a.get (i)); return n; #else nr_double_t scale = 0, n = 1, x, ax; for (int i = 0; i < a.getSize (); i++) { if ((x = real (a (i))) != 0) { ax = fabs (x); if (scale < ax) { x = scale / ax; n = 1 + n * x * x; scale = ax; } else { x = ax / scale; n += x * x; } } if ((x = imag (a (i))) != 0) { ax = fabs (x); if (scale < ax) { x = scale / ax; n = 1 + n * x * x; scale = ax; } else { x = ax / scale; n += x * x; } } } return scale * scale * n; #endif }
tvector<nr_type_t> conj (tvector<nr_type_t> a) { int n = a.getSize (); tvector<nr_type_t> res (n); for (int i = 0; i < n; i++) res.set (i, conj (a.get (i))); return res; }
tvector<nr_type_t> operator + (nr_type_t s, tvector<nr_type_t> a) { int n = a.getSize (); tvector<nr_type_t> res (n); for (int i = 0; i < n; i++) res.set (i, s + a.get (i)); return res; }
bool operator > (tvector<nr_type_t> a, tvector<nr_type_t> b) { assert (a.getSize () == b.getSize ()); int n = a.getSize (); for (int i = 0; i < n; i++) if (a.get (i) <= b.get (i)) return false; return true; }
nr_type_t sum (tvector<nr_type_t> a) { nr_type_t res = 0; for (int i = 0; i < a.getSize (); i++) res += a.get (i); return res; }
nr_type_t scalar (tvector<nr_type_t> a, tvector<nr_type_t> b) { assert (a.getSize () == b.getSize ()); nr_type_t n = 0; for (int i = 0; i < a.getSize (); i++) n += a.get (i) * b.get (i); return n; }
void tvector<nr_type_t>::set (tvector<nr_type_t> a, int start, int stop) { for (int i = start; i < stop; i++) data[i] = a.get (i); }