2013-04-03 3 views
0

Может кто-нибудь помочь мне найти ошибку в следующем коде. Я получаю исключение Java, но я понятия не имею, почему это происходит. Спасибо за внимание! Описание исключения выглядит следующим образом:Нужна помощь в отладке Java-кода (библиотека EJML)

> Exception in thread "main" java.lang.ExceptionInInitializerError 
> Caused by: java.lang.ArrayIndexOutOfBoundsException 
>  at java.lang.System.arraycopy(Native Method) 
>  at org.ejml.data.DenseMatrix64F.set(Unknown Source) 
>  at org.ejml.data.DenseMatrix64F.<init>(Unknown Source) 
>  at org.ejml.simple.SimpleMatrix.<init>(Unknown Source) 
>  at test1.<clinit>(test1.java:14) 

для этого кода:

import org.ejml.simple.SimpleMatrix; 
    import java.lang.Math; 

    import java.util.Scanner; 

    public class test1 { 
     class testcase3 { 
      public testcase3() { 
       Mkt = 100000; 
       E1name = new SimpleMatrix(2, 5, true, -10, -5, 0, 5, 10, 1, 2, 3, 
         4, 5); 
       E1name2 = new SimpleMatrix(2, 5, true, 1, 2, 3, 4, 5, -10, -5, 0, 
         5, 10); 
       E2name = new SimpleMatrix(2, 2, true, 1, 3, 1, 2); 
       E2name2 = new SimpleMatrix(2, 2, true, 1, 2, 1, 3); 
       EM1 = new SimpleMatrix(2, 5, true, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 
       EM2 = new SimpleMatrix(2, 2, true, 0, 0, 0, 0); 
       T = new SimpleMatrix(2, 2, true, 0, 0, 0, 0); 
       Pa = new SimpleMatrix(1, 2, true, 0, 0); 
       Position = 0; 
      } 

      public double Mkt; 
      public SimpleMatrix E1name; 
      public SimpleMatrix E2name; 
      public SimpleMatrix E1name2; 
      public SimpleMatrix E2name2; 
      public SimpleMatrix EM1; 
      public SimpleMatrix EM2; 
      public SimpleMatrix T; 
      public SimpleMatrix Pa; 
      public int Position; 

      public int newBidAsk(double bidPrice, double askPrice) { 
       // log("I received a new Top-of-Book update, bid=" + bidPrice + 
       // ", offer=" + askPrice); 

       // data transformation 
       double newMkt = (bidPrice + askPrice)/2; 
       double Grow = newMkt - Mkt; 
       double Spread = (askPrice - bidPrice)/2; 

       SimpleMatrix seq = new SimpleMatrix(1, 2, true, Grow, Spread); 
       SimpleMatrix z = new SimpleMatrix(1, 2, true, 0, 0); 

       z.set(0, 0, Nametrans(seq.getIndex(0, 0), E1name)); 
       z.set(0, 1, Nametrans(seq.getIndex(0, 1), E2name)); 
       int act = 0; 

       // parameter updating 
       SimpleMatrix Px = Hmmupdate(Pa, z, EM1, EM2); 
       SimpleMatrix newPa = Hmmpredict(Px, T); 
       SimpleMatrix E1n = Hmmempredict(newPa, EM1, EM2, 5); 
       SimpleMatrix E2n = Hmmempredict(newPa, EM1, EM2, 2); 
       SimpleMatrix E = Eab(newMkt, E1n, E2n, E1name2, E2name2); 
       int E1 = E.getIndex(0, 0); 
       int E2 = E.getIndex(0, 1); 

       // action 
       if (Position == 0) { 
        int L = (int) Math.max(0, 
          Math.max(E1 - askPrice, bidPrice - E2)); 
        switch (L) { 
        case 1: 
         act = 0; 
         break; 
        case 2: 
         act = 1; 
         break; 
        case 3: 
         act = -1; 
         break; 
        } 
       } else if (Position == -1) { 
        int L = (int) Math.max(-askPrice, -E1); 
        switch (L) { 
        case 1: 
         act = 1; 
         break; 
        case 2: 
         act = 0; 
         break; 
        } 
       } else if (Position == 1) { 
        int L = (int) Math.max(bidPrice, E2); 
        switch (L) { 
        case 1: 
         act = -1; 
         break; 
        case 2: 
         act = 0; 
         break; 
        } 
       } 

       Position = act + Position; 
       // log("The act is " + Position); 
       return Position; 
      } 

      public SimpleMatrix Eab(double Mkt, SimpleMatrix E1, SimpleMatrix E2, 
        SimpleMatrix E1name2, SimpleMatrix E2name2) { 
       SimpleMatrix Easkbid = new SimpleMatrix(1, 2, true, Mkt, Mkt); 
       for (int i = 0; i < 5; i++) { 
        for (int j = 0; j < 2; j++) { 
         Easkbid.set(0, 0, 
           Easkbid.getIndex(0, 0) + (Nametrans(i, E1name2)) 
             * E1.getIndex(0, i) * E2.getIndex(0, j)); 
         Easkbid.set(0, 1, 
           Easkbid.getIndex(0, 1) + (Nametrans(i, E2name2)) 
             * E1.getIndex(0, i) * E2.getIndex(0, j)); 
        } 
       } 
       return Easkbid; 
      } 

      public SimpleMatrix Hmmempredict(SimpleMatrix Pxkla, SimpleMatrix EM1, 
        SimpleMatrix EM2, int length) { 
       SimpleMatrix E = new SimpleMatrix(1, length, true); 
       for (int i = 0; i < 2; i++) { 
        for (int j = 0; j < length; j++) { 
         E.set(1, 
           j, 
           E.getIndex(1, j) + EM2.getIndex(i, j) 
             * Pxkla.getIndex(1, i)); 
        } 
       } 
       E = normalize(E); 
       return E; 
      } 

      public SimpleMatrix Hmmpredict(SimpleMatrix Pxk, SimpleMatrix T) { 
       SimpleMatrix Pxkla = new SimpleMatrix(1, 2, true, 0, 0); 
       for (int i = 0; i < 2; i++) { 
        for (int j = 0; j < 2; j++) { 
         Pxkla.set(0, i, Pxkla.getIndex(0, i) + Pxkla.getIndex(0, j) 
           * T.getIndex(j, i)); 
        } 
       } 
       Pxkla = normalize(Pxkla); 
       return Pxkla; 
      } 

      public SimpleMatrix Hmmupdate(SimpleMatrix Pxka, SimpleMatrix zk, 
        SimpleMatrix EM1, SimpleMatrix EM2) { 
       SimpleMatrix Pxk = new SimpleMatrix(1, 2, true, 0, 0); 
       for (int i = 0; i < 2; i++) { 
        Pxk.set(0, 
          i, 
          (Pxka.getIndex(0, i) 
            * EM1.getIndex(i, zk.getIndex(0, 0)) * EM2 
            .getIndex(i, zk.getIndex(0, 1)))); 
       } 
       Pxk = normalize(Pxk); 
       return Pxk; 
      } 

      public SimpleMatrix normalize(SimpleMatrix B) { 
       double temp = 0; 
       for (int i = 0; i < B.numCols(); i++) { 
        temp = B.getIndex(0, i); 
       } 
       SimpleMatrix A = B; 
       for (int j = 0; j < A.numCols(); j++) { 
        A.set(0, j, B.getIndex(0, j)/temp); 
       } 
       return A; 
      } 

      public double Nametrans(double a, SimpleMatrix Nama) { 
       int n = Nama.numCols(); 
       double b = 0; 
       for (int i = 0; i < n; i++) { 
        if (a == Nama.getIndex(0, i)) { 
         b = Nama.getIndex(1, i); 
        } 
       } 
       return b; 
      } 
     } 

     public static void main(String[] args) { 
      Scanner s = new Scanner(System.in); 
      double bid = s.nextDouble(); 
      double ask = s.nextDouble(); 
      testcase3 tc3; 
      int act = tc3.newBidAsk(bid, ask); 
      System.out.printf("%d", act); 

     } 
    } 

ответ

0

стека следы велики, они говорят вам саму линию - или саму линию после того, как - возникает ошибка. Единственное, что я вижу в вашем коде, - это отрицательные числа; попробуйте сделать свою матрицу без них и посмотреть, не устраняет ли это ошибку. Если это так, вы можете попробовать пропустить настоящие двойники вместо целых чисел, которые нужно преобразовать во время выполнения.

И, если это так, авторы библиотек должны были упомянуть об этом в своем javadoc, или, возможно, вы обнаружили в своем коде серьезную ошибку (ужасы!).