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
}
}
嗯,这是我的代码。错误出现在第一行,其中表示&#34; Matrix jacobian = new Matrix();&#34;。我说错了吗? Matrix的定义位于代码的开头。 它说:不能访问类型为Algorithm的封闭实例。必须使用Algorithm类型的封闭实例限定分配(例如x.new A(),其中x是算法的实例)。
此外,我得到一个例外:&#34; Matrix [] Ts = new Matrix [10];&#34;。我不能声明一个元素数组Matrix吗?
非常感谢。
答案 0 :(得分:1)
是的,试试这个:Matrix M = new Matrix();
这一个Matrix[] Ts = new Matrix[10];
是有效的,但你也应该遍历数组元素并通过调用构造函数初始化它们。否则,它们将保持null
值。
答案 1 :(得分:0)
更改
public class Matrix
到
public static class Matrix
创建没有static修饰符的嵌套类会创建一个闭包,它允许您引用封闭实例的非静态成员。如果您没有声明它static
,则需要一个封闭的实例(即this
)来创建它,static void main()
中没有。
解释闭包超出了本答案的范围,但它将是Algorithm _closure
中的私有成员Matrix
,它被隐式引用(与this
相同),当你提到Algorithm
的非静态成员。