TMReal dot(const TMVec &a, const TVec &b) { Assert(a.Elts() == b.Elts(), "(Vec::dot) Vec sizes don't match"); TMReal sum = vl_zero; Int i; for (i = 0; i < a.Elts(); i++) sum += a[i] * b[i]; return(sum); }
TMVec operator * (const TSparseMat &m, const TMVec &v) { Assert(m.Cols() == v.Elts(), "(SparseMat::*v) matrix and vector sizes don't match"); Int i; TMVec result(m.Rows()); for (i = 0; i < m.Rows(); i++) result[i] = dot(m[i], v); return(result); }
TMVec operator * (const TMVec &v, const TSparseMat &m) // v * m { Assert(v.Elts() == m.Rows(), "(Mat::v*m) vector/matrix sizes don't match"); TMVec result(m.Cols()); Int i, j; result = vl_zero; // v * M = v[0] * m[0] + v[1] * m[1] + ... for (i = 0; i < m.Rows(); i++) if (len(v[i]) > 0) for (j = 0; j < m[i].NumItems() - 1; j++) result[m[i][j].index] += v[i] * m[i][j].elt; return(result); }