/*---------------------------------------------------------------------------*
 *                                   IT++			             *
 *---------------------------------------------------------------------------*
 * Copyright (c) 1995-2001 by Tony Ottosson, Thomas Eriksson, Pål Frenger,   *
 * Tobias Ringström, and Jonas Samuelsson.                                   *
 *                                                                           *
 * Permission to use, copy, modify, and distribute this software and its     *
 * documentation under the terms of the GNU General Public License is hereby *
 * granted. No representations are made about the suitability of this        *
 * software for any purpose. It is provided "as is" without expressed or     *
 * implied warranty. See the GNU General Public License for more details.    *
 *---------------------------------------------------------------------------*/

/*! 
  \file 
  \brief Implementation of special operations on vectors and matricies optimized for speed
  \author Tony Ottosson

  1.5

  2003/05/22 08:55:19
*/

#include "base/binary.h"
#include "base/fastmath.h"
 
namespace itpp { 

  // m=m-v*v'*m
  void sub_v_vT_m(mat &m, const vec &v)
  {
    vec v2(m.cols());
    double tmp, *v2p;
    const double *vp;
    int i, j;

    it_assert(v.size() == m.rows(), "sub_v_vT_m()");

    v2p = v2._data();
    for (j=0; j<m.cols(); j++) {
      tmp = 0.0;
      vp=v._data();
      for (i=0; i<m.rows(); i++)
	tmp += *(vp++) * m._elem(i,j);
      *(v2p++) = tmp;
    }

    vp=v._data();
    for (i=0; i<m.rows(); i++) {
      v2p = v2._data();
      for (j=0; j<m.cols(); j++)
	m._elem(i,j) -= *vp * *(v2p++);
      vp++;
    }
  }

  // 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++;
    }
  }

} //namespace itpp


syntax highlighted by Code2HTML, v. 0.9.1