线程" main"中的例外情况带有expm的java.lang.StackOverflowError

时间:2014-07-22 19:14:32

标签: java

我正在尝试使用附加网站http://mikiobraun.github.io/jblas/javadoc/org/jblas/MatrixFunctions.html上定义的jblas库计算方阵的矩阵指数 但我不知道该怎么做我根据网站编写了以下代码我应该将其定义为一种方法,但我不知道如何做到这一点任何帮助将不胜感激

package org.jblas;

import java.util.Random;

public class MatrixFunctions {

public static  Double expm(Double A[][]) {
    return expm(A);
}
public static void main(String[] args){
    Double Q[][]=new Double[3][3];
    Random random=new Random();
    for (int i=0;i<3;i++){
        for (int j=0;j<3;j++){
            Q[i][j]=random.nextDouble();
        }
    }
    Double B;
    B=expm(Q);
    System.out.println(B[1][1]);
}
}

我一直有这个错误:

Exception in thread "main" java.lang.StackOverflowError
    at org.jblas.MatrixFunctions.expm(MatrixFunctions.java:8)
    at org.jblas.MatrixFunctions.expm(MatrixFunctions.java:8)

5 个答案:

答案 0 :(得分:1)

public static  Double expm(Double A[][]) {
    return expm(A);
}

这只是一遍又一遍地调用自己,直到堆栈溢出。

答案 1 :(得分:1)

您只需重新调用此函数,直到堆栈内存已满

public static Double expm(Double A[][]) { return expm(A); //remove of modify this line //because this line will re-call your function //need to return Double value }

答案 2 :(得分:1)

我假设您并没有真正尝试重新创建JBLAS包,而只是简单地使用它。

首先,删除package声明或将其更改为适当的声明:

package com.example.mymatrixtest;

其次,导入JBLAS类(并确保在类路径上有JBLAS):

import org.jblas.MatrixFunctions;
import org.jblas.DoubleMatrix;

第三,将你的类重命名为与JBLAS类名相同的东西,这只会引起混淆:

public class MatrixTest {

最后,使用double而不是Double创建矩阵,从中创建DoubleMatrix,并调用JBLAS expm方法:

double[][] q = . . . // your logic to create the matrix here
DoubleMatrix qmatrix = new DoubleMatrix(q); // create a JBLAS object
DoubleMatrix b = MatrixFunctions.expm(qmatrix); // let JBLAS calculate expm

您可以使用get(int, int)方法访问矩阵b的各个元素:

System.out.println(b.get(1, 1));

答案 3 :(得分:0)

你有一个无限递归循环

public static  Double expm(Double A[][]) {
    return expm(A);
}

您每次都只需重新调用递归函数而不更改参数。

每次进行新的函数调用时,额外的数据都会被推送到调用堆栈,最终,系统处理起来太多了,并且抛出了堆栈溢出异常。

如果您希望异常消失,您将不得不更改expm功能,最终停止自行调用。

答案 4 :(得分:0)

当您调用许多JVM无法跟踪所有状态的函数时,通常会发生堆栈溢出异常。当函数在无限循环中调用自身时,99%的情况会发生这种情况。你的情况就是这样:

public static  Double expm(Double A[][]) {
    return expm(A);
}

这种方法一次又一次地调用自己。什么都没有阻止它。我不确定这个函数应该做什么,所以我不能为你建议一个特定的解决方案,但一般来说,为了解决这个问题,你有一个if语句最终将停止无限循环。

为了帮助您想象您的问题,我将展示您正在做的事情,就好像您没有使用递归一样:

public static  Double expm1(Double A[][]) {
    return expm2(A);
}

public static  Double expm2(Double A[][]) {
    return expm3(A);
}

public static  Double expm3(Double A[][]) {
    return expm4(A);
}

//and it keeps going forever

正如您所看到的,这将永远不会结束。最终,您的内存不足,并且会被报告为StackOverflowError