/// <summary>
        /// Updates the state of the system based on the given noisy measurements,
        /// a description of how those measurements relate to the system, and a
        /// covariance <c>Matrix</c> to describe the noise of the system.
        /// </summary>
        /// <param name="z">The measurements of the system.</param>
        /// <param name="H">Measurement model.</param>
        /// <param name="R">Covariance of measurements.</param>
        /// <exception cref="System.ArgumentException">Thrown when given matrices
        /// are of the incorrect size.</exception>
        public void Update(Matrix <double> z, Matrix <double> H, Matrix <double> R)
        {
            KalmanFilter.CheckUpdateParameters(z, H, R, this);

            // Fiddle with the matrices
            Matrix <double> HT = H.Transpose();
            Matrix <double> RI = R.Inverse();

            // Perform the update
            y = y + (HT * RI * z);
            J = J + (HT * RI * H);
        }
        /// <summary>
        /// Updates the state of the system based on the given noisy measurements,
        /// a description of how those measurements relate to the system, and a
        /// covariance <c>Matrix</c> to describe the noise of the system.
        /// </summary>
        /// <param name="z">The measurements of the system.</param>
        /// <param name="H">Measurement model.</param>
        /// <param name="R">Covariance of measurements.</param>
        /// <exception cref="System.ArgumentException">Thrown when given matrices
        /// are of the incorrect size.</exception>
        public void Update(Matrix <double> z, Matrix <double> H, Matrix <double> R)
        {
            KalmanFilter.CheckUpdateParameters(z, H, R, this);

            // We need to use transpose of H a couple of times.
            Matrix <double> Ht = H.Transpose();
            Matrix <double> I  = Matrix <double> .Build.DenseIdentity(x.RowCount, x.RowCount);

            Matrix <double> S = (H * P * Ht) + R;     // Measurement covariance
            Matrix <double> K = P * Ht * S.Inverse(); // Kalman Gain

            P = (I - (K * H)) * P;                    // Covariance update
            x = x + (K * (z - (H * x)));              // State update
        }