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