getLInfNorm() uses wrong formula in both ArrayRealVector and OpenMapRealVector
(in different ways)
--------------------------------------------------------------------------------------------------
Key: MATH-326
URL: https://issues.apache.org/jira/browse/MATH-326
Project: Commons Math
Issue Type: Bug
Affects Versions: 2.0
Environment: all
Reporter: Jake Mannix
the L_infinity norm of a finite dimensional vector is just the max of the
absolute value of its entries.
The current implementation in ArrayRealVector has a typo:
{code}
public double getLInfNorm() {
double max = 0;
for (double a : data) {
max += Math.max(max, Math.abs(a));
}
return max;
}
{code}
the += should just be an =.
There is sadly a unit test assuring us that this is the correct behavior
(effectively a regression-only test, not a test for correctness).
Worse, the implementation in OpenMapRealVector is not even positive
semi-definite:
{code}
public double getLInfNorm() {
double max = 0;
Iterator iter = entries.iterator();
while (iter.hasNext()) {
iter.advance();
max += iter.value();
}
return max;
}
{code}
I would suggest that this method be moved up to the AbstractRealVector
superclass and implemented using the sparseIterator():
{code}
public double getLInfNorm() {
double norm = 0;
Iterator<Entry> it = sparseIterator();
Entry e;
while(it.hasNext() && (e = it.next()) != null) {
norm = Math.max(norm, Math.abs(e.getValue()));
}
return norm;
}
{code}
Unit tests with negative valued vectors would be helpful to check for this kind
of thing in the future.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.