Author: erans Date: Thu Mar 17 10:38:19 2011 New Revision: 1082442 URL: http://svn.apache.org/viewvc?rev=1082442&view=rev Log: MATH-545 Added "cosine" method in "RealVector" interface and default implementation in "AbstractRealVector".
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/RealVector.java commons/proper/math/trunk/src/site/xdoc/changes.xml commons/proper/math/trunk/src/test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java?rev=1082442&r1=1082441&r2=1082442&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java Thu Mar 17 10:38:19 2011 @@ -23,6 +23,7 @@ import java.util.NoSuchElementException; import org.apache.commons.math.exception.MathUnsupportedOperationException; import org.apache.commons.math.exception.DimensionMismatchException; import org.apache.commons.math.exception.OutOfRangeException; +import org.apache.commons.math.exception.MathArithmeticException; import org.apache.commons.math.analysis.FunctionUtils; import org.apache.commons.math.analysis.function.Add; import org.apache.commons.math.analysis.function.Multiply; @@ -184,6 +185,23 @@ public abstract class AbstractRealVector } /** {@inheritDoc} */ + public double cosine(RealVector v) { + final double norm = getNorm(); + final double vNorm = v.getNorm(); + + if (norm == 0 || + vNorm == 0) { + throw new MathArithmeticException(LocalizedFormats.ZERO_NORM); + } + return dotProduct(v) / (norm * vNorm); + } + + /** {@inheritDoc} */ + public double cosine(double[] v) { + return cosine(new ArrayRealVector(v, false)); + } + + /** {@inheritDoc} */ public RealVector ebeDivide(double[] v) { return ebeDivide(new ArrayRealVector(v, false)); } Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/RealVector.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/RealVector.java?rev=1082442&r1=1082441&r2=1082442&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/RealVector.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/RealVector.java Thu Mar 17 10:38:19 2011 @@ -307,6 +307,24 @@ public interface RealVector { double dotProduct(double[] v); /** + * Computes the cosine of the angle between this vector and the + * argument. + * + * @param v Vector. + * @return the cosine of the angle between this vector and {@code v}. + */ + double cosine(RealVector v); + + /** + * Computes the cosine of the angle between this vector and the + * vector whose components are given as argument. + * + * @param v Components of a vector. + * @return the cosine of the angle between this vector and {@code v}. + */ + double cosine(double[] v); + + /** * Returns the L<sub>2</sub> norm of the vector. * <p>The L<sub>2</sub> norm is the root of the sum of * the squared elements.</p> Modified: commons/proper/math/trunk/src/site/xdoc/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/site/xdoc/changes.xml?rev=1082442&r1=1082441&r2=1082442&view=diff ============================================================================== --- commons/proper/math/trunk/src/site/xdoc/changes.xml (original) +++ commons/proper/math/trunk/src/site/xdoc/changes.xml Thu Mar 17 10:38:19 2011 @@ -52,6 +52,10 @@ The <action> type attribute can be add,u If the output is not quite correct, check for invisible trailing spaces! --> <release version="3.0" date="TBD" description="TBD"> + <action dev="erans" type="update" issue="MATH-545"> + Added "cosine" method in "RealVector" interface and default implementation + in "AbstractRealVector". + </action> <action dev="erans" type="fix" issue="MATH-546" due-to="Nate Paymer"> Fixed bug in "KMeansPlusPlusClusterer". </action> Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java?rev=1082442&r1=1082441&r2=1082442&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java (original) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java Thu Mar 17 10:38:19 2011 @@ -27,6 +27,7 @@ import org.apache.commons.math.util.Fast import org.apache.commons.math.exception.OutOfRangeException; import org.apache.commons.math.exception.MathIllegalArgumentException; import org.apache.commons.math.exception.MathArithmeticException; +import org.apache.commons.math.exception.DimensionMismatchException; import org.apache.commons.math.analysis.function.Abs; import org.apache.commons.math.analysis.function.Acos; import org.apache.commons.math.analysis.function.Asin; @@ -221,6 +222,14 @@ public class ArrayRealVectorTest { return dot; } + public double cosine(RealVector v) { + throw unsupported(); + } + + public double cosine(double[] v) { + throw unsupported(); + } + public double getNorm() { throw unsupported(); } @@ -1137,6 +1146,49 @@ public class ArrayRealVectorTest { Assert.assertTrue(Double.isNaN(v4.getMaxValue())); } + @Test + public void testCosine() { + final ArrayRealVector v = new ArrayRealVector(new double[] {1, 0, 0}); + + double[] wData = new double[] {1, 1, 0}; + RealVector w = new ArrayRealVector(wData); + Assert.assertEquals(FastMath.sqrt(2) / 2, v.cosine(wData), normTolerance); + Assert.assertEquals(FastMath.sqrt(2) / 2, v.cosine(w), normTolerance); + + wData = new double[] {1, 0, 0}; + w = new ArrayRealVector(wData); + Assert.assertEquals(1, v.cosine(wData), normTolerance); + Assert.assertEquals(1, v.cosine(w), normTolerance); + + wData = new double[] {0, 1, 0}; + w = new ArrayRealVector(wData); + Assert.assertEquals(0, v.cosine(wData), normTolerance); + Assert.assertEquals(0, v.cosine(w), 0); + + wData = new double[] {-1, 0, 0}; + w = new ArrayRealVector(wData); + Assert.assertEquals(-1, v.cosine(wData), normTolerance); + Assert.assertEquals(-1, v.cosine(w), normTolerance); + } + + @Test(expected=MathArithmeticException.class) + public void testCosinePrecondition1() { + final ArrayRealVector v = new ArrayRealVector(new double[] {0, 0, 0}); + final ArrayRealVector w = new ArrayRealVector(new double[] {1, 0, 0}); + v.cosine(w); + } + @Test(expected=MathArithmeticException.class) + public void testCosinePrecondition2() { + final ArrayRealVector v = new ArrayRealVector(new double[] {0, 0, 0}); + final ArrayRealVector w = new ArrayRealVector(new double[] {1, 0, 0}); + w.cosine(v); + } + @Test(expected=DimensionMismatchException.class) + public void testCosinePrecondition3() { + final ArrayRealVector v = new ArrayRealVector(new double[] {1, 2, 3}); + final ArrayRealVector w = new ArrayRealVector(new double[] {1, 2, 3, 4}); + v.cosine(w); + } /** verifies that two vectors are close (sup norm) */ protected void assertClose(String msg, double[] m, double[] n,