// SubVec subtracts the vector b from a, placing the result in the receiver. func (v *Vector) SubVec(a, b *Vector) { ar := a.Len() br := b.Len() if ar != br { panic(matrix.ErrShape) } v.reuseAs(ar) if v.mat.Inc == 1 && a.mat.Inc == 1 && b.mat.Inc == 1 { // Fast path for a common case. asm.DaxpyUnitaryTo(v.mat.Data, -1, b.mat.Data, a.mat.Data) return } asm.DaxpyIncTo(v.mat.Data, uintptr(v.mat.Inc), 0, -1, b.mat.Data, a.mat.Data, uintptr(ar), uintptr(b.mat.Inc), uintptr(a.mat.Inc), 0, 0) }
// AddScaledVec adds the vectors a and alpha*b, placing the result in the receiver. func (v *Vector) AddScaledVec(a *Vector, alpha float64, b *Vector) { if alpha == 1 { v.AddVec(a, b) return } if alpha == -1 { v.SubVec(a, b) return } ar := a.Len() br := b.Len() if ar != br { panic(matrix.ErrShape) } v.reuseAs(ar) switch { case alpha == 0: // v <- a v.CopyVec(a) case v == a && v == b: // v <- v + alpha * v = (alpha + 1) * v blas64.Scal(ar, alpha+1, v.mat) case v == a && v != b: // v <- v + alpha * b if v.mat.Inc == 1 && b.mat.Inc == 1 { // Fast path for a common case. asm.DaxpyUnitaryTo(v.mat.Data, alpha, b.mat.Data, a.mat.Data) } else { asm.DaxpyInc(alpha, b.mat.Data, v.mat.Data, uintptr(ar), uintptr(b.mat.Inc), uintptr(v.mat.Inc), 0, 0) } default: // v <- a + alpha * b or v <- a + alpha * v if v.mat.Inc == 1 && a.mat.Inc == 1 && b.mat.Inc == 1 { // Fast path for a common case. asm.DaxpyUnitaryTo(v.mat.Data, alpha, b.mat.Data, a.mat.Data) } else { asm.DaxpyIncTo(v.mat.Data, uintptr(v.mat.Inc), 0, alpha, b.mat.Data, a.mat.Data, uintptr(ar), uintptr(b.mat.Inc), uintptr(a.mat.Inc), 0, 0) } } }