// result = a + alpha * b public static Array <Real> Add(this Array <Real> a, Array <Real> b, Real alpha = 1, Array <Real> result = null) { return(Array_.ElementwiseOp(a, b, result, (n, x, offsetx, incx, y, offsety, incy, z, offsetz, incz) => { if (alpha == 1 && incx == 1 && incy == 1 && incz == 1) { Blas.vadd(n, x, offsetx, y, offsety, z, offsetz); } else if (alpha == -1 && incx == 1 && incy == 1 && incz == 1) { Blas.vsub(n, x, offsetx, y, offsety, z, offsetz); } else if (z == x) { Blas.axpy(n, alpha, y, offsety, incy, x, offsetx, incx); } else if (z == y && alpha == 1) { Blas.axpy(n, alpha, x, offsetx, incx, y, offsety, incy); } // TODO: else if (incx == 0) => broadcast x ?? // TODO: else if (incy == 0) => broadcast y ?? else { for (int i = 0; i < n; i++) // TODO: Blas.copy y => x, Blas.axpy(1, x, y) { z[offsetz] = x[offsetx] + alpha * y[offsety]; offsetx += incx; offsety += incy; offsetz += incz; } } // See also: mkl_?omatadd => C := alpha*op(A) + beta*op(B) })); }