Login  Register

Calling CurveFitter from Java; only 4 fit functions work

Posted by Tihamer on Apr 18, 2019; 8:00pm
URL: http://imagej.273.s1.nabble.com/Calling-CurveFitter-from-Java-only-4-fit-functions-work-tp5022103.html

I've used ImageJ in the past purely as a graphic application and it's great.

Today I needed to use some of its functionality in my own Java program, so I
loaded up my project pom:

             
                <dependency>
                    <groupId>net.imagej</groupId>
                    <artifactId>ij</artifactId>
                    <version>1.52n</version>
                    <scope>test</scope>
                </dependency>

I generated some test data and called CurveFitter from main:

public static void main(String[] args) {
                double[] xData = {0.0, 1.0, 2.0,  3.0,  4.0,  5.0,  6.0,  7.0,  8.0,  9.0,
10.0};
                double[] yData = {2.0, 5.0, 8.0, 11.0, 14.0, 17.0, 20.0, 23.0, 26.0, 29.0,
32.0}; // linear
                double[] zData = {0.0, 2.0, 16.0, 54.0, 128.0, 250.0, 432.0, 686.0,
1024.0, 1458.0, 2000.0};
                System.out.println("\nLinear Test:");
                fitMyData(xData, yData);
                System.out.println("\nPower (linear regression) Test:");
                fitMyData(xData, zData);
        }
       
        public static void fitMyData(double[] xData, double[] yData) {
                CurveFitter curveFitter = new CurveFitter(xData, yData);
                for (int functionType : CurveFitter.sortedTypes) {
                        if ( functionType != POLY3 && functionType != POLY4 && functionType !=
POLY5 &&
                                        functionType != POLY6 && functionType != POLY7 && functionType != POLY8
&&
                                        functionType != EXPONENTIAL && functionType != EXP_REGRESSION &&
                                        functionType != EXP_WITH_OFFSET && functionType != EXP_RECOVERY &&
                                        functionType != EXP_RECOVERY_NOOFFSET && functionType != LOG &&
functionType != LOG2 &&
                                        functionType != GAUSSIAN && functionType != GAUSSIAN_NOOFFSET &&
functionType != ERF &&
                                        functionType != RODBARD && functionType != RODBARD2 && functionType !=
INV_RODBARD &&
                                        functionType != GAMMA_VARIATE && functionType != CHAPMAN) {
                        System.out.print("\n\n " + functionType + " Function Type: " +
CurveFitter.fitList[functionType] + " ");
                        curveFitter.doFit(functionType);
                        System.out.print(curveFitter.getResultString());
                        }
                }
        }

The results are very nice. E.g.:

Linear Test:

 0 Function Type: Straight Line
Formula: y = a+bx
Status: Success
Number of iterations: 1
Time: 0 ms
Sum of residuals squared: 1.53560E-11
Standard deviation: 0.00000E0
R^2: 1.00000
Parameters:
        a = 2.00000
        b = 3.00000

<snip>

Power (linear regression) Test:
16 Function Type: Power (linear regression)
Formula: y = a*x^b
Status: Success
Number of iterations: 1
Time: 0 ms
Sum of residuals squared: 1.14026E-12
Standard deviation: 2.46117E-13
R^2: 1.00000
Parameters:
        a = 2.00000
        b = 3.00000

However, you can see my problem:  only four of the fit functions work; the
rest of them throw a ava.lang.ArrayIndexOutOfBoundsException.  For example:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
        at
ij.measure.CurveFitter.modifyInitialParamsAndVariations(CurveFitter.java:891)
        at ij.measure.CurveFitter.doFit(CurveFitter.java:204)
        at ij.measure.CurveFitter.doFit(CurveFitter.java:169)
        at myproject.MyTest.fitMyData(MyTest.java:85)

I looked at the source code, and I can't figure out what
modifyInitialParamsAndVariations is trying to do.

What am I doing wrong?



--
Sent from: http://imagej.1557.x6.nabble.com/

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html