/**
  * Find the orthogonal projection of this vector onto another vector.
  *
  * @param v vector onto which instance must be projected
  * @return projection of the instance onto v
  * @throws IllegalArgumentException if v is not the same size as this
  */
 public ArrayFieldVector<T> projection(ArrayFieldVector<T> v) {
   return (ArrayFieldVector<T>) v.mapMultiply(dotProduct(v).divide(v.dotProduct(v)));
 }