Esempio n. 1
0
T SparseVectorCompressed<T>::distanceSquared(const MyT& rhs) const
{
  Assert(isValid() && rhs.isValid());
  Assert(n == rhs.n);
  int ak=0,bk=0;
  int ai,bi;
  T res = 0;
  while(ak<num_entries || bk<rhs.num_entries) {
    ai = (ak<num_entries? indices[ak] : n);
    bi = (bk<rhs.num_entries? rhs.indices[bk] : n);
    if(ai < bi) {
	  res += Sqr(vals[ak]);
      ak++;
    }
    else if(bi < ai) {
      res += Sqr(rhs.vals[bk]);
      bk++;
    }
    else {
	  res += Sqr(vals[ak]-rhs.vals[bk]);
      ak++; bk++;
    }
  }
  return res;
}
Esempio n. 2
0
void SparseVectorCompressed<T>::sub(const MyT& a, const MyT& b)
{
  Assert(this != &a && this != &b);
  Assert(a.n == b.n);
  Assert(a.isValid() && b.isValid());
  int ak=0,bk=0;
  int ai,bi;
  int nnz=0;

  while(ak<a.num_entries || bk<b.num_entries) {
    ai = (ak<a.num_entries? a.indices[ak] : n);
    bi = (bk<b.num_entries? b.indices[bk] : n);
    if(ai < bi) ak++;
    else if (bi < ai) bk++;
    else { ak++; bk++; }
    nnz++;
  }
  resize(a.n,nnz);

  nnz=0; ak=0;bk=0;
  while(ak<a.num_entries || bk<b.num_entries) {
    ai = (ak<a.num_entries? a.indices[ak] : n);
    bi = (bk<b.num_entries? b.indices[bk] : n);
    if(ai < bi) {
      indices[nnz] = ai;
      vals[nnz] = a.vals[ak];
      ak++;
    }
    else if(bi < ai) {
      indices[nnz] = bi;
      vals[nnz] = b.vals[bk];
      bk++;
    }
    else {
      indices[nnz] = ai;
      vals[nnz] = a.vals[ak]-b.vals[bk];
      ak++; bk++;
    }
    nnz++;
  }
}