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; }
// Pass interpolation datapoints as tvectors. void spline::vectors (tvector<nr_double_t> y, tvector<nr_double_t> t) { int i = t.getSize (); assert (y.getSize () == i && i >= 3); // create local copy of f(x) realloc (i); for (i = 0; i <= n; i++) { f0[i] = y_(i); x[i] = t_(i); } }
tvector<nr_type_t> tvector<nr_type_t>::operator -= (tvector<nr_type_t> a) { assert (a.getSize () == size); nr_type_t * src = a.getData (); nr_type_t * dst = data; for (int i = 0; i < size; i++) *dst++ -= *src++; return *this; }
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 }
void tmatrix<nr_type_t>::setCol (int c, tvector<nr_type_t> v) { assert (c >= 0 && c < cols && v.getSize () == rows); nr_type_t * dst = &data[c]; nr_type_t * src = v.getData (); for (int r = 0; r < rows; r++, src++, dst += cols) *dst = *src; }
void tmatrix<nr_type_t>::setRow (int r, tvector<nr_type_t> v) { assert (r >= 0 && r < rows && v.getSize () == cols); nr_type_t * dst = &data[r * cols]; nr_type_t * src = v.getData (); memcpy (dst, src, sizeof (nr_type_t) * cols); }
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; }