예제 #1
0
 // 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)
     }));
 }