Repository: commons-math Updated Branches: refs/heads/master 5cfd99f0d -> 3ac3ff62b
Added mapping functions to MathArrays. These methods allow to map any univariate or bivariate function to arrays. This fixes several pull requests on github, but uses a generalized mapping approach rather than specific api for each function (closes #6, closes #7, closes #8). Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/088d0f92 Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/088d0f92 Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/088d0f92 Branch: refs/heads/master Commit: 088d0f9222337a1b3be44b99523094ff0af06cde Parents: 5cfd99f Author: Luc Maisonobe <l...@apache.org> Authored: Sun Jul 5 10:10:54 2015 +0200 Committer: Luc Maisonobe <l...@apache.org> Committed: Sun Jul 5 10:19:10 2015 +0200 ---------------------------------------------------------------------- src/changes/changes.xml | 4 ++ .../apache/commons/math4/util/MathArrays.java | 71 ++++++++++++++++++++ .../commons/math4/util/MathArraysTest.java | 34 +++++++++- 3 files changed, 108 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/088d0f92/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index e201c3b..83d03e1 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -54,6 +54,10 @@ If the output is not quite correct, check for invisible trailing spaces! </release> <release version="4.0" date="XXXX-XX-XX" description=""> + <action dev="luc" type="add" > + Added mapping functions to MathArrays. These methods allow to map + any univariate or bivariate functions to arrays. + </action> <action dev="tn" type="fix" issue="MATH-1240"> <!-- backported to 3.6 --> "KolmogorovSmirnovTest#ksSum(...)" returned wrong result in case the provided t-parameters was zero. This affected the calculation of "approximateP(...)" for http://git-wip-us.apache.org/repos/asf/commons-math/blob/088d0f92/src/main/java/org/apache/commons/math4/util/MathArrays.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math4/util/MathArrays.java b/src/main/java/org/apache/commons/math4/util/MathArrays.java index f4e7f4e..a6784a6 100644 --- a/src/main/java/org/apache/commons/math4/util/MathArrays.java +++ b/src/main/java/org/apache/commons/math4/util/MathArrays.java @@ -25,6 +25,8 @@ import java.util.Comparator; import java.util.List; import org.apache.commons.math4.Field; +import org.apache.commons.math4.analysis.BivariateFunction; +import org.apache.commons.math4.analysis.UnivariateFunction; import org.apache.commons.math4.distribution.UniformIntegerDistribution; import org.apache.commons.math4.exception.DimensionMismatchException; import org.apache.commons.math4.exception.MathArithmeticException; @@ -109,6 +111,75 @@ public class MathArrays { /** * Creates an array whose contents will be the element-by-element + * mapping of the function to argument. + * + * @param f function to map on elements + * @param a array of function parameters. + * @return a new array {@code r} where {@code r[i] = f(a[i])}. + * @since 4.0 + */ + public static double[] map(final UnivariateFunction f, final double[] a) { + + final double[] result = new double[a.length]; + for (int i = 0; i < result.length; ++i) { + result[i] = f.value(a[i]); + } + + return result; + + } + + /** + * Creates an array whose contents will be the element-by-element + * mapping of the function to arguments. + * + * @param f function to map on elements + * @param a array of first parameters of the function. + * @param b array of second parameters of the function. + * @return a new array {@code r} where {@code r[i] = f(a[i], b[i])}. + * @throws DimensionMismatchException if the array lengths differ. + * @since 4.0 + */ + public static double[] map(final BivariateFunction f, + final double[] a, final double[] b) { + + if (a.length != b.length) { + throw new DimensionMismatchException(a.length, b.length); + } + + final double[] result = new double[a.length]; + for (int i = 0; i < result.length; ++i) { + result[i] = f.value(a[i], b[i]); + } + + return result; + + } + + /** + * Creates an array whose contents will be the element-by-element + * mapping of the function to arguments. + * + * @param f function to map on elements + * @param a array of first parameters of the function. + * @param b fixed value for second function parameter. + * @return a new array {@code r} where {@code r[i] = f(a[i])}. + * @since 4.0 + */ + public static double[] map(final BivariateFunction f, + final double[] a, final double b) { + + final double[] result = new double[a.length]; + for (int i = 0; i < result.length; ++i) { + result[i] = f.value(a[i], b); + } + + return result; + + } + + /** + * Creates an array whose contents will be the element-by-element * addition of the arguments. * * @param a First term of the addition. http://git-wip-us.apache.org/repos/asf/commons-math/blob/088d0f92/src/test/java/org/apache/commons/math4/util/MathArraysTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/util/MathArraysTest.java b/src/test/java/org/apache/commons/math4/util/MathArraysTest.java index 3abd0cd..fedd11c 100644 --- a/src/test/java/org/apache/commons/math4/util/MathArraysTest.java +++ b/src/test/java/org/apache/commons/math4/util/MathArraysTest.java @@ -16,6 +16,8 @@ package org.apache.commons.math4.util; import java.util.Arrays; import org.apache.commons.math4.TestUtils; +import org.apache.commons.math4.analysis.function.Abs; +import org.apache.commons.math4.analysis.function.Add; import org.apache.commons.math4.exception.DimensionMismatchException; import org.apache.commons.math4.exception.MathArithmeticException; import org.apache.commons.math4.exception.MathIllegalArgumentException; @@ -74,7 +76,37 @@ public class MathArraysTest { Assert.assertEquals(correctScaled[i], test[i], 0); } } - + + @Test + public void testMapUnivariate() { + final double[] expected = new double[] { 1, 2, 4, 8 }; + final double[] observed = + MathArrays.map(new Abs(), new double[] { 1, -2, -4, 8}); + TestUtils.assertEquals(expected, observed, 1.0e-15); + } + + @Test + public void testMapBivariateTwoArrays() { + final double[] expected = new double[] { 1, 3, 6, 11 }; + final double[] observed = + MathArrays.map(new Add(), + new double[] { 1, 2, 4, 8}, new double[] { 0, 1, 2, 3}); + TestUtils.assertEquals(expected, observed, 1.0e-15); + } + + @Test + public void testMapBivariateOneArray() { + final double[] expected = new double[] { 3.5, 4.5, 6.5, 10.5 }; + final double[] observed = + MathArrays.map(new Add(), new double[] { 1, 2, 4, 8}, 2.5); + TestUtils.assertEquals(expected, observed, 1.0e-15); + } + + @Test(expected=DimensionMismatchException.class) + public void testMapBivariatePrecondition() { + MathArrays.map(new Add(), new double[3], new double[4]); + } + @Test(expected=DimensionMismatchException.class) public void testEbeAddPrecondition() { MathArrays.ebeAdd(new double[3], new double[4]);