Bill Barker a écrit : > > > -------------------------------------------------- > From: "Luc Maisonobe" <luc.maison...@free.fr> > Sent: Friday, January 29, 2010 12:49 AM > To: "Commons Developers List" <dev@commons.apache.org> > Subject: Re: svn commit: r904231 - in > /commons/proper/math/trunk/src:main/java/org/apache/commons/math/linear/AbstractRealVector.javasite/xdoc/changes.xml > test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java > >> Bill Barker a écrit : >>> >>> >>> -------------------------------------------------- >>> From: "Luc Maisonobe" <luc.maison...@free.fr> >>> Sent: Thursday, January 28, 2010 12:14 PM >>> To: "Commons Developers List" <dev@commons.apache.org> >>> Subject: Re: svn commit: r904231 - in >>> /commons/proper/math/trunk/src:main/java/org/apache/commons/math/linear/AbstractRealVector.javasite/xdoc/changes.xml >>> >>> test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java >>> >>>> Mikkel Meyer Andersen a écrit : >>>>> Hi. >>>>> >>>>> Thanks! >>>>> >>>>> Why use an iterator instead of just a simple for-loop? And what about >>>>> saving >>>>> the values until the vector invalidates - I see pros and cons for both >>>>> approaches, so it's more to hear what your thoughts were? >>>> >>>> It is because there already are several implementations of the class >>>> and >>>> they may use different strategies to access elements. Such iterators >>>> have been introduced by recent changes so I thought it was better to >>>> stick with them now. >>>> >>> >>> +1 >>> There is a case for using the sparseIterator, but that probably makes >>> the methods overly complicated (since zero values have to be handled >>> specially). >> >> I did hesitate to add this. I thought adding special getSparseMinIndex >> and so on, that would explicitely ignore non-zeros. We can add them too >> if you think ignoring zeros is the right thing to do. In that case, we >> simply copy the methods and change iterator into sparse iterator, that's >> all. >> > > I personally have no interest in getSparseMinIndex. Granted, the > iterator for OpenMapRealVector is slightly expensive (does a map lookup > for each index), but the more I think about it the less I like using > sparseIterator here. This would involve something like: > if(minValue > 0) { > //repeat loop with iterator to find a zero value > } > possibly traversing the vector twice. > > For 2.1 I'd just go with this addition, and deal with any user > complaints in a later version.
I agree. Luc > >> Luc >> >>> >>>> As for saving the values, we cannot be sure when the vector changes. >>>> Users may do this several ways and we simply did not implement any >>>> control on that. >>>> >>>> Luc >>>> >>>>> >>>>> Cheers, Mikkel. >>>>> >>>>> On 28/01/2010 8:42 PM, <l...@apache.org> wrote: >>>>> >>>>> Author: luc >>>>> Date: Thu Jan 28 19:42:31 2010 >>>>> New Revision: 904231 >>>>> >>>>> URL: http://svn.apache.org/viewvc?rev=904231&view=rev >>>>> Log: >>>>> added min/max getters for real vectors >>>>> For compatibility reasons, these methods have been put in the topmost >>>>> abstract class but not in the interface yet. It could be pushed to the >>>>> interface when next major version will be released. >>>>> JIRA: MATH-334 >>>>> >>>>> Modified: >>>>> >>>>> >>>>> commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.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=904231&r1=904230&r2=904231&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 Jan 28 19:42:31 2010 >>>>> @@ -292,6 +292,58 @@ >>>>> return d; >>>>> } >>>>> >>>>> + /** Get the index of the minimum entry. >>>>> + * @return index of the minimum entry or -1 if vector length is 0 >>>>> + * or all entries are NaN >>>>> + */ >>>>> + public int getMinIndex() { >>>>> + int minIndex = -1; >>>>> + double minValue = Double.POSITIVE_INFINITY; >>>>> + Iterator<Entry> iterator = iterator(); >>>>> + while (iterator.hasNext()) { >>>>> + final Entry entry = iterator.next(); >>>>> + if (entry.getValue() <= minValue) { >>>>> + minIndex = entry.getIndex(); >>>>> + minValue = entry.getValue(); >>>>> + } >>>>> + } >>>>> + return minIndex; >>>>> + } >>>>> + >>>>> + /** Get the value of the minimum entry. >>>>> + * @return value of the minimum entry or NaN if all entries >>>>> are NaN >>>>> + */ >>>>> + public double getMinValue() { >>>>> + final int minIndex = getMinIndex(); >>>>> + return minIndex < 0 ? Double.NaN : getEntry(minIndex); >>>>> + } >>>>> + >>>>> + /** Get the index of the maximum entry. >>>>> + * @return index of the maximum entry or -1 if vector length is 0 >>>>> + * or all entries are NaN >>>>> + */ >>>>> + public int getMaxIndex() { >>>>> + int maxIndex = -1; >>>>> + double maxValue = Double.NEGATIVE_INFINITY; >>>>> + Iterator<Entry> iterator = iterator(); >>>>> + while (iterator.hasNext()) { >>>>> + final Entry entry = iterator.next(); >>>>> + if (entry.getValue() >= maxValue) { >>>>> + maxIndex = entry.getIndex(); >>>>> + maxValue = entry.getValue(); >>>>> + } >>>>> + } >>>>> + return maxIndex; >>>>> + } >>>>> + >>>>> + /** Get the value of the maximum entry. >>>>> + * @return value of the maximum entry or NaN if all entries >>>>> are NaN >>>>> + */ >>>>> + public double getMaxValue() { >>>>> + final int maxIndex = getMaxIndex(); >>>>> + return maxIndex < 0 ? Double.NaN : getEntry(maxIndex); >>>>> + } >>>>> + >>>>> /** {...@inheritdoc} */ >>>>> public RealVector mapAbs() { >>>>> return copy().mapAbsToSelf(); >>>>> >>>>> 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=904231&r1=904230&r2=904231&view=diff >>>>> >>>>> >>>>> ============================================================================== >>>>> >>>>> >>>>> --- commons/proper/math/trunk/src/site/xdoc/changes.xml (original) >>>>> +++ commons/proper/math/trunk/src/site/xdoc/changes.xml Thu Jan 28 >>>>> 19:42:31 >>>>> 2010 >>>>> @@ -39,6 +39,10 @@ >>>>> </properties> >>>>> <body> >>>>> <release version="2.1" date="TBD" description="TBD"> >>>>> + <action dev="luc" type="add" issue="MATH-334" > >>>>> + Added min/max getters for real vectors (not yet in the >>>>> RealVector >>>>> interface for >>>>> + compatibility purposes, but in the AbstractRealVector >>>>> abstract >>>>> class). >>>>> + </action> >>>>> <action dev="luc" type="fix" issue="MATH-338" due-to="Vincent >>>>> Morand"> >>>>> Fixed automatic step initialization in embedded Runge-Kutta >>>>> integrators. >>>>> The relative tolerance setting was never used, only the >>>>> absolute >>>>> tolerance >>>>> >>>>> 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=904231&r1=904230&r2=904231&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 Jan 28 19:42:31 2010 >>>>> @@ -1308,6 +1308,30 @@ >>>>> } >>>>> >>>>> >>>>> + public void testMinMax() { >>>>> + ArrayRealVector v1 = new ArrayRealVector(new double[] { 0, >>>>> -6, 4, >>>>> 12, 7 }); >>>>> + assertEquals(1, v1.getMinIndex()); >>>>> + assertEquals(-6, v1.getMinValue(), 1.0e-12); >>>>> + assertEquals(3, v1.getMaxIndex()); >>>>> + assertEquals(12, v1.getMaxValue(), 1.0e-12); >>>>> + ArrayRealVector v2 = new ArrayRealVector(new double[] { >>>>> Double.NaN, >>>>> 3, Double.NaN, -2 }); >>>>> + assertEquals(3, v2.getMinIndex()); >>>>> + assertEquals(-2, v2.getMinValue(), 1.0e-12); >>>>> + assertEquals(1, v2.getMaxIndex()); >>>>> + assertEquals(3, v2.getMaxValue(), 1.0e-12); >>>>> + ArrayRealVector v3 = new ArrayRealVector(new double[] { >>>>> Double.NaN, >>>>> Double.NaN }); >>>>> + assertEquals(-1, v3.getMinIndex()); >>>>> + assertTrue(Double.isNaN(v3.getMinValue())); >>>>> + assertEquals(-1, v3.getMaxIndex()); >>>>> + assertTrue(Double.isNaN(v3.getMaxValue())); >>>>> + ArrayRealVector v4 = new ArrayRealVector(new double[0]); >>>>> + assertEquals(-1, v4.getMinIndex()); >>>>> + assertTrue(Double.isNaN(v4.getMinValue())); >>>>> + assertEquals(-1, v4.getMaxIndex()); >>>>> + assertTrue(Double.isNaN(v4.getMaxValue())); >>>>> + } >>>>> + >>>>> + >>>>> /** verifies that two vectors are close (sup norm) */ >>>>> protected void assertClose(String msg, double[] m, double[] n, >>>>> double tolerance) { >>>>> >>>> >>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>> For additional commands, e-mail: dev-h...@commons.apache.org >>> >>> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> For additional commands, e-mail: dev-h...@commons.apache.org >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org