public static boolean jacobian( FunctionNtoM func, FunctionNtoMxN jacobian, double param[], double tol, double differenceScale) { NumericalJacobianForward numerical = new NumericalJacobianForward(func, differenceScale); if (numerical.getNumOfOutputsM() != jacobian.getNumOfOutputsM()) throw new RuntimeException( "M is not equal " + numerical.getNumOfOutputsM() + " " + jacobian.getNumOfOutputsM()); if (numerical.getNumOfInputsN() != jacobian.getNumOfInputsN()) throw new RuntimeException( "N is not equal: " + numerical.getNumOfInputsN() + " " + jacobian.getNumOfInputsN()); DenseMatrix64F found = new DenseMatrix64F(func.getNumOfOutputsM(), func.getNumOfInputsN()); DenseMatrix64F expected = new DenseMatrix64F(func.getNumOfOutputsM(), func.getNumOfInputsN()); jacobian.process(param, found.data); numerical.process(param, expected.data); return MatrixFeatures.isIdentical(expected, found, tol); }