예제 #1
0
  public static DoubleMatrix polyval(
      final DoubleMatrix x, final DoubleMatrix y, final DoubleMatrix coeff, int degree) {

    if (!x.isColumnVector()) {
      logger.warn("polyValGrid: require (x) standing data vectors!");
      throw new IllegalArgumentException("polyval functions require (x) standing data vectors!");
    }

    if (!y.isColumnVector()) {
      logger.warn("polyValGrid: require (y) standing data vectors!");
      throw new IllegalArgumentException("polyval functions require (y) standing data vectors!");
    }

    if (!coeff.isColumnVector()) {
      logger.warn("polyValGrid: require (coeff) standing data vectors!");
      throw new IllegalArgumentException(
          "polyval functions require (coeff) standing data vectors!");
    }

    if (degree < -1) {
      logger.warn("polyValGrid: degree < -1 ????");
    }

    if (x.length > y.length) {
      logger.warn("polValGrid: x larger than y, while optimized for y larger x");
    }

    if (degree == -1) {
      degree = degreeFromCoefficients(coeff.length);
    }

    // evaluate polynomial //
    DoubleMatrix result = new DoubleMatrix(x.length, y.length);
    int i;
    int j;
    double c00,
        c10,
        c01,
        c20,
        c11,
        c02,
        c30,
        c21,
        c12,
        c03,
        c40,
        c31,
        c22,
        c13,
        c04,
        c50,
        c41,
        c32,
        c23,
        c14,
        c05;

    switch (degree) {
      case 0:
        result.put(0, 0, coeff.get(0, 0));
        break;
      case 1:
        c00 = coeff.get(0, 0);
        c10 = coeff.get(1, 0);
        c01 = coeff.get(2, 0);
        for (j = 0; j < result.columns; j++) {
          double c00pc01y1 = c00 + c01 * y.get(j, 0);
          for (i = 0; i < result.rows; i++) {
            result.put(i, j, c00pc01y1 + c10 * x.get(i, 0));
          }
        }
        break;
      case 2:
        c00 = coeff.get(0, 0);
        c10 = coeff.get(1, 0);
        c01 = coeff.get(2, 0);
        c20 = coeff.get(3, 0);
        c11 = coeff.get(4, 0);
        c02 = coeff.get(5, 0);
        for (j = 0; j < result.columns; j++) {
          double y1 = y.get(j, 0);
          double c00pc01y1 = c00 + c01 * y1;
          double c02y2 = c02 * Math.pow(y1, 2);
          double c11y1 = c11 * y1;
          for (i = 0; i < result.rows; i++) {
            double x1 = x.get(i, 0);
            result.put(i, j, c00pc01y1 + c10 * x1 + c20 * Math.pow(x1, 2) + c11y1 * x1 + c02y2);
          }
        }
        break;
      case 3:
        c00 = coeff.get(0, 0);
        c10 = coeff.get(1, 0);
        c01 = coeff.get(2, 0);
        c20 = coeff.get(3, 0);
        c11 = coeff.get(4, 0);
        c02 = coeff.get(5, 0);
        c30 = coeff.get(6, 0);
        c21 = coeff.get(7, 0);
        c12 = coeff.get(8, 0);
        c03 = coeff.get(9, 0);
        for (j = 0; j < result.columns; j++) {
          double y1 = y.get(j, 0);
          double y2 = Math.pow(y1, 2);
          double c00pc01y1 = c00 + c01 * y1;
          double c02y2 = c02 * y2;
          double c11y1 = c11 * y1;
          double c21y1 = c21 * y1;
          double c12y2 = c12 * y2;
          double c03y3 = c03 * y1 * y2;
          for (i = 0; i < result.rows; i++) {
            double x1 = x.get(i, 0);
            double x2 = Math.pow(x1, 2);
            result.put(
                i,
                j,
                c00pc01y1
                    + c10 * x1
                    + c20 * x2
                    + c11y1 * x1
                    + c02y2
                    + c30 * x1 * x2
                    + c21y1 * x2
                    + c12y2 * x1
                    + c03y3);
          }
        }
        break;

      case 4:
        c00 = coeff.get(0, 0);
        c10 = coeff.get(1, 0);
        c01 = coeff.get(2, 0);
        c20 = coeff.get(3, 0);
        c11 = coeff.get(4, 0);
        c02 = coeff.get(5, 0);
        c30 = coeff.get(6, 0);
        c21 = coeff.get(7, 0);
        c12 = coeff.get(8, 0);
        c03 = coeff.get(9, 0);
        c40 = coeff.get(10, 0);
        c31 = coeff.get(11, 0);
        c22 = coeff.get(12, 0);
        c13 = coeff.get(13, 0);
        c04 = coeff.get(14, 0);
        for (j = 0; j < result.columns; j++) {
          double y1 = y.get(j, 0);
          double y2 = Math.pow(y1, 2);
          double c00pc01y1 = c00 + c01 * y1;
          double c02y2 = c02 * y2;
          double c11y1 = c11 * y1;
          double c21y1 = c21 * y1;
          double c12y2 = c12 * y2;
          double c03y3 = c03 * y1 * y2;
          double c31y1 = c31 * y1;
          double c22y2 = c22 * y2;
          double c13y3 = c13 * y2 * y1;
          double c04y4 = c04 * y2 * y2;
          for (i = 0; i < result.rows; i++) {
            double x1 = x.get(i, 0);
            double x2 = Math.pow(x1, 2);
            result.put(
                i,
                j,
                c00pc01y1
                    + c10 * x1
                    + c20 * x2
                    + c11y1 * x1
                    + c02y2
                    + c30 * x1 * x2
                    + c21y1 * x2
                    + c12y2 * x1
                    + c03y3
                    + c40 * x2 * x2
                    + c31y1 * x2 * x1
                    + c22y2 * x2
                    + c13y3 * x1
                    + c04y4);
          }
        }
        break;
      case 5:
        c00 = coeff.get(0, 0);
        c10 = coeff.get(1, 0);
        c01 = coeff.get(2, 0);
        c20 = coeff.get(3, 0);
        c11 = coeff.get(4, 0);
        c02 = coeff.get(5, 0);
        c30 = coeff.get(6, 0);
        c21 = coeff.get(7, 0);
        c12 = coeff.get(8, 0);
        c03 = coeff.get(9, 0);
        c40 = coeff.get(10, 0);
        c31 = coeff.get(11, 0);
        c22 = coeff.get(12, 0);
        c13 = coeff.get(13, 0);
        c04 = coeff.get(14, 0);
        c50 = coeff.get(15, 0);
        c41 = coeff.get(16, 0);
        c32 = coeff.get(17, 0);
        c23 = coeff.get(18, 0);
        c14 = coeff.get(19, 0);
        c05 = coeff.get(20, 0);
        for (j = 0; j < result.columns; j++) {
          double y1 = y.get(j, 0);
          double y2 = Math.pow(y1, 2);
          double y3 = y2 * y1;
          double c00pc01y1 = c00 + c01 * y1;
          double c02y2 = c02 * y2;
          double c11y1 = c11 * y1;
          double c21y1 = c21 * y1;
          double c12y2 = c12 * y2;
          double c03y3 = c03 * y3;
          double c31y1 = c31 * y1;
          double c22y2 = c22 * y2;
          double c13y3 = c13 * y3;
          double c04y4 = c04 * y2 * y2;
          double c41y1 = c41 * y1;
          double c32y2 = c32 * y2;
          double c23y3 = c23 * y3;
          double c14y4 = c14 * y2 * y2;
          double c05y5 = c05 * y3 * y2;
          for (i = 0; i < result.rows; i++) {
            double x1 = x.get(i, 0);
            double x2 = Math.pow(x1, 2);
            double x3 = x1 * x2;
            result.put(
                i,
                j,
                c00pc01y1
                    + c10 * x1
                    + c20 * x2
                    + c11y1 * x1
                    + c02y2
                    + c30 * x3
                    + c21y1 * x2
                    + c12y2 * x1
                    + c03y3
                    + c40 * x2 * x2
                    + c31y1 * x3
                    + c22y2 * x2
                    + c13y3 * x1
                    + c04y4
                    + c50 * x3 * x2
                    + c41y1 * x2 * x2
                    + c32y2 * x3
                    + c23y3 * x2
                    + c14y4 * x1
                    + c05y5);
          }
        }
        break;

        // TODO: solve up to 5 efficiently, do rest in loop
      default:
        for (j = 0; j < result.columns; j++) {
          double yy = y.get(j, 0);
          for (i = 0; i < result.rows; i++) {
            double xx = x.get(i, 0);
            result.put(i, j, polyval(xx, yy, coeff, degree));
          }
        }
    } // switch degree

    return result;
  }