public DoubleMatrix1D Assign(DoubleMatrix1D y, Cern.Colt.Function.DoubleDoubleFunction function, IntArrayList nonZeroIndexes)
        {
            CheckSize(y);
            int[] nonZeroElements = nonZeroIndexes.ToArray();

            // specialized for speed
            if (function == Cern.Jet.Math.Functions.DoubleDoubleFunctions.Mult)
            {  // x[i] = x[i] * y[i]
                int j = 0;
                for (int index = nonZeroIndexes.Count; --index >= 0;)
                {
                    int i = nonZeroElements[index];
                    for (; j < i; j++)
                    {
                        this[j] = 0;            // x[i] = 0 for all zeros
                    }
                    this[i] = this[i] * y[i];   // x[i] * y[i] for all nonZeros
                    j++;
                }
            }
            //else if (function is Cern.Jet.Math.PlusMult.Apply)
            //{

            //}
            else
            { // the general case x[i] = f(x[i],y[i])
                return(Assign(y, function));
            }
            return(this);
        }
        public DoubleMatrix2D Assign(DoubleMatrix2D matrixY, Cern.Colt.Function.DoubleDoubleFunction function, Double x = 0, Double y = 0)
        {
            CheckShape(matrixY);

            if (Cern.Jet.Math.Functions.EvaluateDoubleDoubleFunctionEquality(function, F2.PlusMult(x)))
            {                     // x[i] = x[i] + alpha*y[i]
                double alpha = x; // ((Cern.Jet.Math.PlusMult)function).multiplicator;
                if (alpha == 0)
                {
                    return(this);            // nothing to do
                }
                matrixY.ForEachNonZero(
                    new Cern.Colt.Function.IntIntDoubleFunction((i, j, value) =>
                {
                    this[i, j] = this[i, j] + alpha * value;
                    return(value);
                }
                                                                ));
                return(this);
            }

            if (Cern.Jet.Math.Functions.EvaluateFunctionEquality(function.Method, F2.Mult.Method))
            { // x[i] = x[i] * y[i]
                ForEachNonZero(

                    new Cern.Colt.Function.IntIntDoubleFunction((i, j, value) =>
                {
                    this[i, j] = this[i, j] * matrixY[i, j];
                    return(value);
                }
                                                                ));
                return(this);
            }

            if (Cern.Jet.Math.Functions.EvaluateFunctionEquality(function.Method, F2.Div.Method))
            { // x[i] = x[i] / y[i]
                ForEachNonZero(

                    new Cern.Colt.Function.IntIntDoubleFunction((i, j, value) =>
                {
                    this[i, j] = this[i, j] / matrixY[i, j];
                    return(value);
                }
                                                                ));
                return(this);
            }

            return(base.Assign(matrixY, function));
        }
Beispiel #3
0
        public double Aggregate(Cern.Colt.Function.DoubleDoubleFunction aggr, Cern.Colt.Function.DoubleFunction f)
        {
            int s = Size;

            if (s == 0)
            {
                return(Double.NaN);
            }
            double a = f(_elements[s - 1]);

            for (int i = s - 1; --i >= 0;)
            {
                a = aggr(a, f(_elements[i]));
            }
            return(a);
        }
Beispiel #4
0
 public void Assign(DoubleMatrix2D A, DoubleMatrix2D B, Cern.Colt.Function.DoubleDoubleFunction function)
 {
     A.Assign(B, function);
 }
        public DoubleMatrix2D Assign(DoubleMatrix2D matrixY, Cern.Colt.Function.DoubleDoubleFunction function, Double x = 0, Double y = 0)
        {
            CheckShape(matrixY);

            if (Cern.Jet.Math.Functions.EvaluateDoubleDoubleFunctionEquality(function, F2.PlusMult(x)))
            {
                double alpha = x;

                //if (function is Cern.Jet.Math.PlusMult) { // x[i] = x[i] + alpha*y[i]
                //double alpha = ((Cern.Jet.Math.PlusMult)function).multiplicator;
                if (alpha == 0)
                {
                    return(this);            // nothing to do
                }
                matrixY.ForEachNonZero(
                    new Cern.Colt.Function.IntIntDoubleFunction((i, j, value) =>
                {
                    this[i, j] = this[i, j] + alpha * value;
                    return(value);
                }
                                                                ));
                return(this);
            }

            //if (function==Cern.Jet.Math.Functions.mult) { // x[i] = x[i] * y[i]
            var mult = F2.Mult(x, y);

            if (Cern.Jet.Math.Functions.EvaluateFunctionEquality(function.Method, F2.Mult.Method))
            {
                int[]    idx  = Indexes.ToArray();
                double[] vals = Values.ToArray();

                for (int i = Starts.Length - 1; --i >= 0;)
                {
                    int low = Starts[i];
                    for (int k = Starts[i + 1]; --k >= low;)
                    {
                        int j = idx[k];
                        vals[k] *= matrixY[i, j];
                        if (vals[k] == 0)
                        {
                            Remove(i, j);
                        }
                    }
                }
                return(this);
            }

            if (Cern.Jet.Math.Functions.EvaluateFunctionEquality(function.Method, F2.Div.Method))
            {
                //	if (function==Cern.Jet.Math.Functions.Div) { // x[i] = x[i] / y[i]
                int[]    idx  = Indexes.ToArray();
                double[] vals = Values.ToArray();

                for (int i = Starts.Length - 1; --i >= 0;)
                {
                    int low = Starts[i];
                    for (int k = Starts[i + 1]; --k >= low;)
                    {
                        int j = idx[k];
                        vals[k] /= matrixY[i, j];
                        if (vals[k] == 0)
                        {
                            Remove(i, j);
                        }
                    }
                }
                return(this);
            }

            return(base.Assign(matrixY, function));
        }