From c2801940ef84c3399f3288972dcd0244062e6d40 Mon Sep 17 00:00:00 2001 From: Thomas Neidhart Date: Fri, 11 Oct 2013 21:39:09 +0000 Subject: [PATCH] [MATH-1033] Fix input parameter check in KalmanFilter. Thanks to Yuan Qu. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1531430 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 4 ++++ .../apache/commons/math3/filter/KalmanFilter.java | 15 ++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 2b934d060..50686f29d 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -51,6 +51,10 @@ If the output is not quite correct, check for invisible trailing spaces! + + The "KalmanFilter" wrongly enforced a column dimension of 1 for + the provided control and measurement noise matrix. + Fix a typo in the "GeometricDistributionTest" and ensure that a meaningful tolerance value is used when comparing test results with expected values. diff --git a/src/main/java/org/apache/commons/math3/filter/KalmanFilter.java b/src/main/java/org/apache/commons/math3/filter/KalmanFilter.java index 423689d98..1080f9b66 100644 --- a/src/main/java/org/apache/commons/math3/filter/KalmanFilter.java +++ b/src/main/java/org/apache/commons/math3/filter/KalmanFilter.java @@ -182,14 +182,15 @@ public class KalmanFilter { } // row dimension of B must be equal to A + // if no control matrix is available, the row and column dimension will be 0 if (controlMatrix != null && controlMatrix.getRowDimension() > 0 && controlMatrix.getColumnDimension() > 0 && - (controlMatrix.getRowDimension() != transitionMatrix.getRowDimension() || - controlMatrix.getColumnDimension() != 1)) { + controlMatrix.getRowDimension() != transitionMatrix.getRowDimension()) { throw new MatrixDimensionMismatchException(controlMatrix.getRowDimension(), controlMatrix.getColumnDimension(), - transitionMatrix.getRowDimension(), 1); + transitionMatrix.getRowDimension(), + controlMatrix.getColumnDimension()); } // Q must be equal to A @@ -204,11 +205,11 @@ public class KalmanFilter { } // row dimension of R must be equal to row dimension of H - if (measNoise.getRowDimension() != measurementMatrix.getRowDimension() || - measNoise.getColumnDimension() != 1) { + if (measNoise.getRowDimension() != measurementMatrix.getRowDimension()) { throw new MatrixDimensionMismatchException(measNoise.getRowDimension(), measNoise.getColumnDimension(), - measurementMatrix.getRowDimension(), 1); + measurementMatrix.getRowDimension(), + measNoise.getColumnDimension()); } } @@ -356,7 +357,7 @@ public class KalmanFilter { measurementMatrix.getRowDimension()); } - // S = H * P(k) - * H' + R + // S = H * P(k) * H' + R RealMatrix s = measurementMatrix.multiply(errorCovariance) .multiply(measurementMatrixT) .add(measurementModel.getMeasurementNoise());