commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Phil Steitz <p...@steitz.com>
Subject Re: svn commit: r680162 - in /commons/proper/math/branches/MATH_2_0/src: java/org/apache/commons/math/stat/regression/ site/xdoc/ test/org/apache/commons/math/stat/regression/
Date Sun, 27 Jul 2008 19:22:04 GMT
Any ideas on where this stuff can go???
> -
> +    
> +    /** TODO:  Find a home for the following methods in the linear package */   
> +    
> +    /**
> +     * <p>Uses back substitution to solve the system</p>
> +     * 
> +     * <p>coefficients X = constants</p>
> +     * 
> +     * <p>coefficients must upper-triangular and constants must be a column 
> +     * matrix.  The solution is returned as a column matrix.</p>
> +     * 
> +     * <p>The number of columns in coefficients determines the length
> +     * of the returned solution vector (column matrix).  If constants
> +     * has more rows than coefficients has columns, excess rows are ignored.
> +     * Similarly, extra (zero) rows in coefficients are ignored</p>
> +     * 
> +     * @param coefficients upper-triangular coefficients matrix
> +     * @param constants column RHS constants matrix
> +     * @return solution matrix as a column matrix
> +     * 
> +     */
> +    private static RealMatrix solveUpperTriangular(RealMatrixImpl coefficients,
> +            RealMatrixImpl constants) {
> +        if (!isUpperTriangular(coefficients, 1E-12)) {
> +            throw new IllegalArgumentException(
> +                   "Coefficients is not upper-triangular");
> +        }
> +        if (constants.getColumnDimension() != 1) {
> +            throw new IllegalArgumentException(
> +                    "Constants not a column matrix.");
> +        }
> +        int length = coefficients.getColumnDimension();
> +        double[][] cons = constants.getDataRef();
> +        double[][] coef = coefficients.getDataRef();
> +        double x[] = new double[length];
> +        for (int i = 0; i < length; i++) {
> +            int index = length - 1 - i;
> +            double sum = 0;
> +            for (int j = index + 1; j < length; j++) {
> +                sum += coef[index][j] * x[j];
> +            }
> +            x[index] = (cons[index][0] - sum) / coef[index][index];
> +        } 
> +        return new RealMatrixImpl(x);
> +    }
> +    
> +    /**
> +     * <p>Returns true iff m is an upper-triangular matrix.</p>
> +     * 
> +     * <p>Makes sure all below-diagonal elements are within epsilon of 0.</p>
> +     * 
> +     * @param m matrix to check
> +     * @param epsilon maximum allowable absolute value for elements below
> +     * the main diagonal
> +     * 
> +     * @return true if m is upper-triangular; false otherwise
> +     * @throws NullPointerException if m is null
> +     */
> +    private static boolean isUpperTriangular(RealMatrixImpl m, double epsilon) {
> +        double[][] data = m.getDataRef();
> +        int nCols = m.getColumnDimension();
> +        int nRows = m.getRowDimension();
> +        for (int r = 0; r < nRows; r++) {
> +            int bound = Math.min(r, nCols);
> +            for (int c = 0; c < bound; c++) {
> +                if (Math.abs(data[r][c]) > epsilon) {
> +                    return false;
> +                }
> +            }
> +        }
> +        return true;
> +    }
>  }
>
>   
 

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Mime
View raw message