/// <summary>
 /// A = A + B*s <=> A[row,col] = A[row,col] + B[row,col]*s
 /// </summary>
 /// <param name="A">the matrix to modify.</param>
 /// <param name="B">the matrix to stay unaffected.</param>
 /// <param name="s">the scalar; can have any value.</param>
 /// <returns><i>A</i> (for convenience only).</returns>
 public static DoubleMatrix2D PlusMult(DoubleMatrix2D A, DoubleMatrix2D B, double s)
 {
     return A.Assign(B, F2.PlusMult(s));
 }
 /// <summary>
 /// A = A - B*s <=> A[i] = A[i] - B[i]*s
 /// </summary>
 /// <param name="A">the matrix to modify.</param>
 /// <param name="B">the matrix to stay unaffected.</param>
 /// <param name="s">the scalar; can have any value.</param>
 /// <returns><i>A</i> (for convenience only).</returns>
 public static DoubleMatrix1D MinusMult(DoubleMatrix1D A, DoubleMatrix1D B, double s)
 {
     return A.Assign(B, F2.MinusMult(s));
 }
 /// <summary>
 /// Manhattan distance function; <i>Sum( abs(x[i]-y[i]) )</i>.
 /// </summary>
 /// <returns></returns>
 public static VectorVectorFunction MANHATTAN()
 {
     return((a, b) => a.Aggregate(b, F2.Plus, F2.Chain(F1.Abs, F2.Minus)));
 }
 /// <summary>
 /// Maximum distance function; <i>Max( abs(x[i]-y[i]) )</i>.
 /// </summary>
 /// <returns></returns>
 public static VectorVectorFunction MAXIMUM()
 {
     return((a, b) => a.Aggregate(b, F2.Max, F2.Chain(F1.Abs, F2.Minus)));
 }
 /// <summary>
 /// Bray-Curtis distance function; <i>Sum( abs(x[i]-y[i]) )  /  Sum( x[i]+y[i] )</i>.
 /// </summary>
 /// <returns></returns>
 public static VectorVectorFunction BRAY_CURTIS()
 {
     return((a, b) => a.Aggregate(b, F2.Plus, F2.Chain(F1.Abs, F2.Minus)) / a.Aggregate(b, F2.Plus, F2.Plus));
 }
        //private static Cern.Jet.Math.Functions.DoubleDoubleFunctions F;

        /// <summary>
        /// Euclidean distance function; <i>Sqrt(Sum( (x[i]-y[i])^2 ))</i>.
        /// </summary>
        /// <returns></returns>
        public static VectorVectorFunction EUCLID()
        {
            return((a, b) => System.Math.Sqrt(a.Aggregate(b, F2.Plus, F2.Chain(F1.Square, F2.Minus))));
        }