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)); }
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); }
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)); }