Example usage for org.apache.commons.math.linear RealMatrixImpl RealMatrixImpl

List of usage examples for org.apache.commons.math.linear RealMatrixImpl RealMatrixImpl

Introduction

In this page you can find the example usage for org.apache.commons.math.linear RealMatrixImpl RealMatrixImpl.

Prototype

public RealMatrixImpl(final double[][] d, final boolean copyArray)
        throws IllegalArgumentException, NullPointerException 

Source Link

Document

Create a new RealMatrix using the input array as the underlying data array.

Usage

From source file:com.lzy.heartset.sg.SGFilter.java

/**
 * Computes Savitzky-Golay coefficients for given parameters
 * /*w w  w .  j  a v a  2  s.  c o  m*/
 * @param nl
 *            numer of past data points filter will use
 * @param nr
 *            number of future data points filter will use
 * @param degree
 *            order of smoothin polynomial
 * @return Savitzky-Golay coefficients
 * @throws IllegalArgumentException
 *             if {@code nl < 0} or {@code nr < 0} or {@code nl + nr <
 *             degree}
 */
public static double[] computeSGCoefficients(int nl, int nr, int degree) {
    if (nl < 0 || nr < 0 || nl + nr < degree)
        throw new IllegalArgumentException("Bad arguments");
    RealMatrixImpl matrix = new RealMatrixImpl(degree + 1, degree + 1);
    double[][] a = matrix.getDataRef();
    double sum;
    for (int i = 0; i <= degree; i++) {
        for (int j = 0; j <= degree; j++) {
            sum = (i == 0 && j == 0) ? 1 : 0;
            for (int k = 1; k <= nr; k++)
                sum += pow(k, i + j);
            for (int k = 1; k <= nl; k++)
                sum += pow(-k, i + j);
            a[i][j] = sum;
        }
    }
    double[] b = new double[degree + 1];
    b[0] = 1;
    b = matrix.solve(b);
    double[] coeffs = new double[nl + nr + 1];
    for (int n = -nl; n <= nr; n++) {
        sum = b[0];
        for (int m = 1; m <= degree; m++)
            sum += b[m] * pow(n, m);
        coeffs[n + nl] = sum;
    }
    return coeffs;
}

From source file:geogebra.kernel.implicit.GeoImplicitPoly.java

/**
 * make curve through given points//from w w w  . ja  v a 2  s  .com
 * @param points ArrayList of points
 */
public void throughPoints(ArrayList<GeoPoint> points) {
    if ((int) Math.sqrt(9 + 8 * points.size()) != Math.sqrt(9 + 8 * points.size())) {
        setUndefined();
        return;
    }

    int degree = (int) (0.5 * Math.sqrt(8 * (1 + points.size()))) - 1;
    int realDegree = degree;

    RealMatrix extendMatrix = new RealMatrixImpl(points.size(), points.size() + 1);
    RealMatrix matrix = new RealMatrixImpl(points.size(), points.size());
    double[][] coeffMatrix = new double[degree + 1][degree + 1];

    DecompositionSolver solver;

    double[] matrixRow = new double[points.size() + 1];
    double[] results;

    for (int i = 0; i < points.size(); i++) {
        double x = points.get(i).x / points.get(i).z;
        double y = points.get(i).y / points.get(i).z;

        for (int j = 0, m = 0; j < degree + 1; j++)
            for (int k = 0; j + k != degree + 1; k++)
                matrixRow[m++] = Math.pow(x, j) * Math.pow(y, k);
        extendMatrix.setRow(i, matrixRow);
    }

    int solutionColumn = 0, noPoints = points.size();

    do {
        if (solutionColumn > noPoints) {
            noPoints = noPoints - realDegree - 1;

            if (noPoints < 2) {
                setUndefined();
                return;
            }

            extendMatrix = new RealMatrixImpl(noPoints, noPoints + 1);
            realDegree -= 1;
            matrixRow = new double[noPoints + 1];

            for (int i = 0; i < noPoints; i++) {
                double x = points.get(i).x;
                double y = points.get(i).y;

                for (int j = 0, m = 0; j < realDegree + 1; j++)
                    for (int k = 0; j + k != realDegree + 1; k++)
                        matrixRow[m++] = Math.pow(x, j) * Math.pow(y, k);
                extendMatrix.setRow(i, matrixRow);
            }

            matrix = new RealMatrixImpl(noPoints, noPoints);
            solutionColumn = 0;
        }

        results = extendMatrix.getColumn(solutionColumn);

        for (int i = 0, j = 0; i < noPoints + 1; i++)
            if (i == solutionColumn)
                continue;
            else
                matrix.setColumn(j++, extendMatrix.getColumn(i));
        solutionColumn++;

        solver = new LUDecompositionImpl(matrix).getSolver();
    } while (!solver.isNonSingular());

    for (int i = 0; i < results.length; i++)
        results[i] *= -1;

    double[] partialSolution = solver.solve(results);

    double[] solution = new double[partialSolution.length + 1];

    for (int i = 0, j = 0; i < solution.length; i++)
        if (i == solutionColumn - 1)
            solution[i] = 1;
        else {
            solution[i] = (Kernel.isZero(partialSolution[j])) ? 0 : partialSolution[j];
            j++;
        }

    for (int i = 0, k = 0; i < realDegree + 1; i++)
        for (int j = 0; i + j < realDegree + 1; j++)
            coeffMatrix[i][j] = solution[k++];

    this.setCoeff(coeffMatrix, true);

    this.defined = true;
    for (int i = 0; i < points.size(); i++)
        if (!this.isOnPath(points.get(i), 1)) {
            this.setUndefined();
            return;
        }

}

From source file:geogebra.kernel.GeoImplicitPoly.java

/**
 * make curve through given points//  w  w w  .  j  a v  a2 s  .  com
 * @param points ArrayList of points
 */
public void throughPoints(ArrayList<GeoPoint> points) {
    if ((int) Math.sqrt(9 + 8 * points.size()) != Math.sqrt(9 + 8 * points.size())) {
        setUndefined();
        return;
    }

    if (pointsOnCurve == null)
        pointsOnCurve = new Coords[points.size()];

    for (int i = 0; i < points.size(); i++) {
        if (pointsOnCurve[i] == null)
            pointsOnCurve[i] = new Coords(points.get(i).x, points.get(i).y, points.get(i).z);
        else {
            pointsOnCurve[i].setX(points.get(i).x);
            pointsOnCurve[i].setY(points.get(i).y);
            pointsOnCurve[i].setZ(points.get(i).z);
        }
    }

    int degree = (int) (0.5 * Math.sqrt(8 * (1 + points.size()))) - 1;
    int realDegree = degree;

    RealMatrix extendMatrix = new RealMatrixImpl(points.size(), points.size() + 1);
    RealMatrix matrix = new RealMatrixImpl(points.size(), points.size());
    double[][] coeffMatrix = new double[degree + 1][degree + 1];

    DecompositionSolver solver;

    double[] matrixRow = new double[points.size() + 1];
    double[] results = new double[points.size()];

    for (int i = 0; i < points.size(); i++) {
        double x = points.get(i).x / points.get(i).z;
        double y = points.get(i).y / points.get(i).z;

        for (int j = 0, m = 0; j < degree + 1; j++)
            for (int k = 0; j + k != degree + 1; k++)
                matrixRow[m++] = Math.pow(x, j) * Math.pow(y, k);
        extendMatrix.setRow(i, matrixRow);
    }

    int solutionColumn = 0, noPoints = points.size();

    do {
        if (solutionColumn > noPoints) {
            noPoints = noPoints - realDegree - 1;

            if (noPoints < 2) {
                setUndefined();
                return;
            }

            extendMatrix = new RealMatrixImpl(noPoints, noPoints + 1);
            realDegree -= 1;
            matrixRow = new double[noPoints + 1];

            for (int i = 0; i < noPoints; i++) {
                double x = points.get(i).x;
                double y = points.get(i).y;

                for (int j = 0, m = 0; j < realDegree + 1; j++)
                    for (int k = 0; j + k != realDegree + 1; k++)
                        matrixRow[m++] = Math.pow(x, j) * Math.pow(y, k);
                extendMatrix.setRow(i, matrixRow);
            }

            matrix = new RealMatrixImpl(noPoints, noPoints);
            solutionColumn = 0;
        }

        results = extendMatrix.getColumn(solutionColumn);

        for (int i = 0, j = 0; i < noPoints; i++)
            if (i == solutionColumn)
                continue;
            else
                matrix.setColumn(j++, extendMatrix.getColumn(i));
        solutionColumn++;

        solver = new LUDecompositionImpl(matrix).getSolver();
    } while (!solver.isNonSingular());

    for (int i = 0; i < results.length; i++)
        results[i] *= -1;

    double[] partialSolution = solver.solve(results);

    for (int i = 0; i < partialSolution.length; i++)
        if (Kernel.isZero(partialSolution[i]))
            partialSolution[i] = 0;

    for (int i = 0; i < partialSolution.length; i++)
        if (Kernel.isZero(partialSolution[i]))
            partialSolution[i] = 0;

    for (int i = 0, k = 0; i < realDegree + 1; i++)
        for (int j = 0; j + i != realDegree + 1; j++)
            if (k == solutionColumn - 1)
                coeffMatrix[i][j] = 1;
            else
                coeffMatrix[i][j] = partialSolution[k++];

    this.setCoeff(coeffMatrix);
    this.update();
    this.defined = true;
    for (int i = 0; i < points.size(); i++)
        if (!this.isOnPath(points.get(i))) {
            this.setUndefined();
            return;
        }

    this.type = IMPLICIT_POLY_THROUGH_POINTS;
}