You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ce...@apache.org on 2012/07/06 07:18:40 UTC
svn commit: r1358044 - in /commons/proper/math/trunk/src:
main/java/org/apache/commons/math3/linear/
test/java/org/apache/commons/math3/linear/
Author: celestin
Date: Fri Jul 6 05:18:39 2012
New Revision: 1358044
URL: http://svn.apache.org/viewvc?rev=1358044&view=rev
Log:
MATH-795:
- Added default implementation to RealVector RealVector.projection(RealVector)
- Removed implementation in concrete classes (to avoid code duplication).
- Created unit tests accordingly.
Modified:
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/OpenMapRealVector.java
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/RealVector.java
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/ArrayRealVectorTest.java
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/RealVectorAbstractTest.java
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/RealVectorTest.java
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/SparseRealVectorTest.java
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java?rev=1358044&r1=1358043&r2=1358044&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java Fri Jul 6 05:18:39 2012
@@ -568,12 +568,6 @@ public class ArrayRealVector extends Rea
/** {@inheritDoc} */
@Override
- public RealVector projection(RealVector v) {
- return v.mapMultiply(dotProduct(v) / v.dotProduct(v));
- }
-
- /** {@inheritDoc} */
- @Override
public RealMatrix outerProduct(RealVector v) {
if (v instanceof ArrayRealVector) {
final double[] vData = ((ArrayRealVector) v).data;
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/OpenMapRealVector.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/OpenMapRealVector.java?rev=1358044&r1=1358043&r2=1358044&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/OpenMapRealVector.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/OpenMapRealVector.java Fri Jul 6 05:18:39 2012
@@ -588,13 +588,6 @@ public class OpenMapRealVector extends S
/** {@inheritDoc} */
@Override
- public RealVector projection(RealVector v) {
- checkVectorDimensions(v.getDimension());
- return v.mapMultiply(dotProduct(v) / v.dotProduct(v));
- }
-
- /** {@inheritDoc} */
- @Override
public void setEntry(int index, double value) {
checkIndex(index);
if (!isDefaultValue(value)) {
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/RealVector.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/RealVector.java?rev=1358044&r1=1358043&r2=1358044&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/RealVector.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/RealVector.java Fri Jul 6 05:18:39 2012
@@ -671,10 +671,18 @@ public abstract class RealVector {
*
* @param v vector onto which instance must be projected.
* @return projection of the instance onto {@code v}.
+ * @throws MathArithmeticException if {@code this} or {@code v} is the null
+ * vector
* @throws org.apache.commons.math3.exception.DimensionMismatchException
* if {@code v} is not the same size as this vector.
*/
- public abstract RealVector projection(RealVector v);
+ public RealVector projection(final RealVector v) {
+ final double norm2 = v.dotProduct(v);
+ if (norm2 == 0.0) {
+ throw new MathArithmeticException(LocalizedFormats.ZERO_NORM);
+ }
+ return v.mapMultiply(dotProduct(v) / v.dotProduct(v));
+ }
/**
* Set all elements to a single value.
@@ -1371,12 +1379,6 @@ public abstract class RealVector {
/** {@inheritDoc} */
@Override
- public RealVector projection(RealVector w) {
- return v.projection(w);
- }
-
- /** {@inheritDoc} */
- @Override
public RealMatrix outerProduct(RealVector w) {
return v.outerProduct(w);
}
Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/ArrayRealVectorTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/ArrayRealVectorTest.java?rev=1358044&r1=1358043&r2=1358044&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/ArrayRealVectorTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/ArrayRealVectorTest.java Fri Jul 6 05:18:39 2012
@@ -259,11 +259,6 @@ public class ArrayRealVectorTest extends
throw unsupported();
}
- @Override
- public RealVector projection(RealVector v) {
- throw unsupported();
- }
-
public RealVector projection(double[] v) {
throw unsupported();
}
Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/RealVectorAbstractTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/RealVectorAbstractTest.java?rev=1358044&r1=1358043&r2=1358044&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/RealVectorAbstractTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/RealVectorAbstractTest.java Fri Jul 6 05:18:39 2012
@@ -964,6 +964,59 @@ public abstract class RealVectorAbstract
doTestOuterProduct(true);
}
+ private void doTestProjection(final boolean mixed) {
+ final double x = getPreferredEntryValue();
+ final double[] data1 = {
+ x, 1d, x, x, 2d, x, x, x, 3d, x, x, x, x
+ };
+ final double[] data2 = {
+ 5d, -6d, 7d, x, x, -8d, -9d, 10d, 11d, x, 12d, 13d, -15d
+ };
+ double dotProduct = 0d;
+ double norm2 = 0d;
+ for (int i = 0; i < data1.length; i++){
+ dotProduct += data1[i] * data2[i];
+ norm2 += data2[i] * data2[i];
+ }
+ final double s = dotProduct / norm2;
+ final double[] expected = new double[data1.length];
+ for (int i = 0; i < data2.length; i++) {
+ expected[i] = s * data2[i];
+ }
+ final RealVector v1 = create(data1);
+ final RealVector v2;
+ if (mixed) {
+ v2 = createAlien(data2);
+ } else {
+ v2 = create(data2);
+ }
+ final RealVector actual = v1.projection(v2);
+ TestUtils.assertEquals("", expected, actual, 0d);
+ }
+
+ @Test
+ public void testProjectionSameType() {
+ doTestProjection(false);
+ }
+
+ @Test
+ public void testProjectionMixedTypes() {
+ doTestProjection(true);
+ }
+
+ @Test(expected = MathArithmeticException.class)
+ public void testProjectionNullVector() {
+ create(new double[4]).projection(create(new double[4]));
+ }
+
+ @Test(expected = DimensionMismatchException.class)
+ public void testProjectionDimensionMismatch() {
+ final RealVector v1 = create(new double[4]);
+ final RealVector v2 = create(new double[5]);
+ v2.set(1.0);
+ v1.projection(v2);
+ }
+
@Test
public void testSet() {
for (int i = 0; i < values.length; i++) {
Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/RealVectorTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/RealVectorTest.java?rev=1358044&r1=1358043&r2=1358044&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/RealVectorTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/RealVectorTest.java Fri Jul 6 05:18:39 2012
@@ -109,11 +109,6 @@ public class RealVectorTest extends Real
}
@Override
- public RealVector projection(RealVector v) {
- throw unsupported();
- }
-
- @Override
public double getEntry(int index) {
try {
return values[index];
Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/SparseRealVectorTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/SparseRealVectorTest.java?rev=1358044&r1=1358043&r2=1358044&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/SparseRealVectorTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/SparseRealVectorTest.java Fri Jul 6 05:18:39 2012
@@ -186,11 +186,6 @@ public class SparseRealVectorTest extend
}
@Override
- public RealVector projection(RealVector v) {
- throw unsupported();
- }
-
- @Override
public RealMatrix outerProduct(RealVector v) {
throw unsupported();
}