// m=m-m*v*v' void sub_m_v_vT(mat &m, const vec &v) { vec v2(m.rows()); double tmp, *v2p; const double *vp; int i, j; it_assert(v.size() == m.cols(), "sub_m_v_vT()"); v2p = v2._data(); for (i = 0; i < m.rows(); i++) { tmp = 0.0; vp = v._data(); for (j = 0; j < m.cols(); j++) tmp += *(vp++) * m._elem(i, j); *(v2p++) = tmp; } v2p = v2._data(); for (i = 0; i < m.rows(); i++) { vp = v._data(); for (j = 0; j < m.cols(); j++) m._elem(i, j) -= *v2p * *(vp++); v2p++; } }
void backward_substitution(const mat &U, const vec &b, vec &x) { assert( U.rows() == U.cols() && U.cols() == b.size() && b.size() == x.size() ); int n = U.rows(), i, j; double temp; x(n-1)=b(n-1)/U(n-1,n-1); for (i=n-2; i>=0; i--) { // Should be: x(i)=((b(i)-U(i,i,i+1,n-1)*x(i+1,n-1))/U(i,i))(0); but this is too slow. temp=0; //i_pos=i*U._row_offset(); for (j=i+1; j<n; j++) { temp += U._elem(i,j) * x(j); //temp+=U._data()[i_pos+j]*x(j); } x(i) = (b(i)-temp)/U._elem(i,i); //x(i)=(b(i)-temp)/U._data()[i_pos+i]; } }
void forward_substitution(const mat &L, const vec &b, vec &x) { assert( L.rows() == L.cols() && L.cols() == b.size() && b.size() == x.size() ); int n = L.rows(), i, j; double temp; x(0)=b(0)/L(0,0); for (i=1;i<n;i++) { // Should be: x(i)=((b(i)-L(i,i,0,i-1)*x(0,i-1))/L(i,i))(0); but this is to slow. //i_pos=i*L._row_offset(); temp=0; for (j=0; j<i; j++) { temp += L._elem(i,j) * x(j); //temp+=L._data()[i_pos+j]*x(j); } x(i) = (b(i)-temp)/L._elem(i,i); //x(i)=(b(i)-temp)/L._data()[i_pos+i]; } }