Bool operator == (const TSparseVec &a, const TSparseVec &b) { Assert(a.Elts() == b.Elts(), "(SparseVec::==) Vec sizes don't match"); if (a.NumItems() != b.NumItems()) return(false); else { Int i; for (i = 0; i < a.NumItems(); i++) if (a[i] != b[i]) return(false); return(true); } }
TVReal sqrlen(const TSparseVec &v) { TVReal sum = vl_zero; Int i; for (i = 0; i < v.NumItems() - 1; i++) sum += sqrlen(v[i].elt); return(sum); }
TSparseVec operator * (const TSparseVec &v, TVReal s) { TSparseVec result(v.Elts()); Int i; for (i = 0; i < v.NumItems() - 1; i++) result.AddElt(v[i].index, s * v[i].elt); result.End(); return(result); }
TSparseVec operator - (const TSparseVec &v) { TSparseVec result(v.Elts()); Int i; for (i = 0; i < v.NumItems() - 1; i++) result.AddNZElt(v[i].index, -v[i].elt); result.End(); return(result); }
TVReal dot(const TSparseVec &a, const TVec &b) { Assert(a.Elts() == b.Elts(), "(SparseVec::dot) Vec sizes don't match"); TMReal sum = vl_zero; Int i; for (i = 0; i < a.NumItems() - 1; i++) sum += a[i].elt * b[a[i].index]; return(sum); }
TVReal dot(const TSparseVec &a, const TSparseVec &b) { Assert(a.Elts() == b.Elts(), "(SparseVec::dot) Vec sizes don't match"); TMReal sum = vl_zero; TSVIter j(a); Int i; for (i = 0; i < b.NumItems() - 1; i++) if (j.IncTo(b[i].index)) sum += j.Data() * b[i].elt; return(sum); }
TSparseVec operator / (const TSparseVec &a, const TSparseVec &b) { Assert(a.Elts() == b.Elts(), "(SparseVec::/) Vec sizes don't match"); TSparseVec result(a.Elts()); TSVIter j(a); Int i; for (i = 0; i < b.NumItems() - 1; i++) if (j.IncTo(b[i].index)) result.AddElt(b[i].index, j.Data() / b[i].elt); result.End(); return(result); }