예제 #1
0
// 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++;
  }
}
예제 #2
0
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];
    }
}
예제 #3
0
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];
    }
}