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; }