矩阵不能解析为变量 import java.util.*; 公共类算法{ 公共类矩阵{ 私人双[]x; } 公共静态扫描仪扫描=新扫描仪(System.in); 私有静态字符串str; 公共静态无效读取数据(双[]度,双[]升){ l[0]=0.0; int i; 对于(i=0;i

矩阵不能解析为变量 import java.util.*; 公共类算法{ 公共类矩阵{ 私人双[]x; } 公共静态扫描仪扫描=新扫描仪(System.in); 私有静态字符串str; 公共静态无效读取数据(双[]度,双[]升){ l[0]=0.0; int i; 对于(i=0;i,java,arrays,matrix,declaration,Java,Arrays,Matrix,Declaration,Yes),请尝试以下操作:Matrix M=new Matrix(); 这个Matrix[]Ts=new Matrix[10];是有效的,但是您也应该循环数组元素并通过调用构造函数来初始化它们。否则,它们将保持null值。更改 import java.util.*; public class Algorithm { public class Matrix{ private Double[][] x; } public static Scanner scan = new

Yes),请尝试以下操作:
Matrix M=new Matrix();

这个
Matrix[]Ts=new Matrix[10];
是有效的,但是您也应该循环数组元素并通过调用构造函数来初始化它们。否则,它们将保持
null
值。

更改

import java.util.*;


public class Algorithm {

public class Matrix{     
    private Double[][] x;
}

public static Scanner scan = new Scanner(System.in);
private static String str;

public static void read_data(Double[] degrees, Double[] l) {
    l[0] = 0.0;
    int i;
    for (i = 0; i < 9; i++) {
        str = scan.next();  //passem la primera columna
        str = scan.next();  //agafem el valor del desplaçament
        str = str.substring(0, str.length()-1); //traiem la coma
        l[i+1] = Double.parseDouble(str);

        str = scan.next();  //passem la primera columna
        str = scan.next();  //agafem el valor del desplaçament
        str = str.substring(0, str.length()-1); //traiem la coma
        degrees[i] = Double.parseDouble(str);
    }
    degrees[i] = 0.0;
}

public static void init_Matrix(Double[][] M, int i, Double[] degrees, Double[] l) {

    M[0][3] = l[i];
    M[0][0] = Math.cos(degrees[i]);
    M[0][1] = -Math.sin(degrees[i]);
    M[1][0] = Math.sin(degrees[i]);
    M[1][1] = Math.cos(degrees[i]);

    for (int k = 0; i < 4; k++) {
        for (int j = 0; j < 4; j++) {
            if (k == j && (M[k][j] == null)) M[k][j] = 1.0;
            else if(M[k][j] == null) M[k][j] = 0.0;
        }
    }
}

public static void init_Ultima_Matrix(Double[][] M, int i, Double[] l) {
    M[0][3] = l[i];
    for (int k = 0; k < 4; k++) {
        for (int j = 0; j < 4; j++) {
            if (k == j) M[k][j] = 1.0;
            else if(M[k][j] == null) M[k][j] = 0.0;
        }
    }
}

public static void init_Derivada(Double[][] M, int i, Double[] degrees) {
    M[0][0] = -Math.sin(degrees[i]);
    M[0][1] = -Math.cos(degrees[i]);
    M[1][0] = Math.cos(degrees[i]);
    M[1][1] = -Math.sin(degrees[i]);

    for (int k = 0; k < 4; k++) {
        for (int j = 0; j < 4; j++) {
            if(M[k][j] == null) M[k][j] = 0.0;
        }
    }
}

public static void init_Ultima_Derivada(Double[][] M, int i) {
    for (int k = 0; k < 4; k++) {
        for (int j = 0; j < 4; j++) {
            M[k][j] = 0.0;
        }
    }
}

public static void fulfill_Ts(Matrix[] Ts, Double[] degrees, Double[] l) {
    int i;
    for (i = 0; i < 9; i++) {
        Ts[i].x = new Double[4][4];
        init_Matrix(Ts[i].x, i, degrees, l);
    }
    init_Ultima_Matrix(Ts[i].x, i, l);

}

public static void fulfill_Ds(Matrix[] Ds, Double[] degrees) {
    int i;
    for (i = 0; i < 9; i++) {
        Ds[i].x = new Double[4][4];
        init_Derivada(Ds[i].x, i, degrees);
    }
    init_Ultima_Derivada(Ds[i].x, i);
}

private static Double[][] product(Double[][] A, Double[][] B){  
    Double suma = 0.0;  
    Double result[][] = new Double[4][4];  
    for(int i = 0; i < 4; i++){  
        for(int j = 0; j < 4; j++){  
            suma = 0.0;  
            for(int k = 0; k < 4; k++){  
                suma += A[i][k] * B[k][j];  
            }  
            result[i][j] = suma;  
        }  
    }  
    return result;  
}

private static void calc_Jacobian(Matrix[] Ts, Matrix[] Ds, int i, Double[][] jacobian) {
    Double[][] tmp;
    if (i == 0) tmp = Ds[0].x;
    else tmp = Ts[0].x;
    for (int j = 1; j < 10; j++) {
        if (j == i) tmp = product(tmp, Ds[j].x);
        else tmp = product(tmp, Ts[j].x);
    }
    jacobian[0][i] = tmp[0][3];
    jacobian[1][i] = tmp[1][3];
    jacobian[2][i] = tmp[0][0];
}

public static void main(String[] args) {
    Matrix[] Ts = new Matrix[10];
    Matrix[] Ds = new Matrix[10];
    for (int i = 0; i < 10; i++) {
        Ts[i].x = new Double[4][4];
        Ds[i].x = new Double[4][4];
    }
    Double[] degrees = new Double[10];
    Double[] l = new Double[10];
    read_data(degrees, l);
    fulfill_Ts(Ts, degrees, l);
    fulfill_Ds(Ds, degrees);

    Matrix jacobian = new Matrix();
    jacobian.x = new Double[3][9];
    for (int j=0; j<9; j++)
        calc_Jacobian(Ts, Ds, j, jacobian.x);
    //La matriu Jacobiana hauria d'estar acabada
}

在不使用静态修饰符的情况下创建嵌套类将创建一个闭包,该闭包允许您引用封闭实例的非静态成员。如果您不将其声明为
static
,则需要一个封闭实例(即
this
)来创建它,而
static void main()
中没有该实例


解释一个闭包超出了这个答案的范围,但它将是
矩阵
中的私有成员
算法
,当您提到
算法
的非静态成员时,它会被隐式引用(与
这个
相同)不是来自静态上下文,它是
main
方法。在这种情况下,我们需要显式的外部对象来创建内部类的实例。我们也可以将
矩阵
移动到
算法
类之外,或者使其静态。我已经修改了它,但它也不起作用,peter。我还编辑了帖子
public class Matrix
public static class Matrix