gpt4 book ai didi

java - 一旦我退出函数(Java),对象的值为空

转载 作者:行者123 更新时间:2023-12-01 12:55:32 25 4
gpt4 key购买 nike

import java.util.*;


public class Algorithm {

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

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

public static void read_data(Double[] radians, 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
if (i < 9) str = str.substring(0, str.length()-1); //traiem la coma
radians[i] = Math.toRadians(Double.parseDouble(str));
}
radians[i] = 0.0;
}

public static void print_Matrix(Double[][] M) {
for (int k = 0; k < 4; k++) {
System.out.print("\n");
for (int j = 0; j < 4; j++) {
System.out.print(String.valueOf(M[k][j]) + " , ");
}
}
}

public static void print_Jacobian(Double[][] M) {
System.out.print("Jacobian Matrix =");
for (int k = 0; k < 3; k++) {
System.out.print("\n");
for (int j = 0; j < 9; j++) {
System.out.print(String.valueOf(M[k][j]) + " , ");
}
}
}

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

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

for (int k = 0; k < 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;
//System.out.print(String.valueOf(M[k][j]) + "\n");
}
}
}

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[] radians) {
M[0][0] = -Math.sin(radians[i]);
M[0][1] = -Math.cos(radians[i]);
M[1][0] = Math.cos(radians[i]);
M[1][1] = -Math.sin(radians[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[] radians, Double[] l) {
int i;
for (i = 0; i < 9; i++) {
Ts[i].x = new Double[4][4];
init_Matrix(Ts[i].x, i, radians, l);
//print_Matrix(Ts[i].x);
}
init_Ultima_Matrix(Ts[i].x, i, l);

}

public static void fulfill_Ds(Matrix[] Ds, Double[] radians) {
int i;
for (i = 0; i < 9; i++) {
Ds[i].x = new Double[4][4];
init_Derivada(Ds[i].x, i, radians);
}
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_T(Matrix[] Ts, Double[][] T) {
T = Ts[0].x;
for (int j = 1; j < 10; j++) {
T = product(T, Ts[j].x);
}
}

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] = new Matrix();
Ts[i].x = new Double[4][4];
Ds[i] = new Matrix();
Ds[i].x = new Double[4][4];
}

Double[] radians = new Double[10];
Double[] l = new Double[10];
read_data(radians, l);
fulfill_Ts(Ts, radians, l);
fulfill_Ds(Ds, radians);
Matrix T = new Matrix();
T.x = new Double[4][4];
System.out.print("\n Ts Matrix =");
for (int q=0; q<10; ++q) print_Matrix(Ts[q].x);
calc_T(Ts, T.x);
System.out.print("\n T Matrix =");
print_Matrix(T.x);
Matrix jacobian = new Matrix();
jacobian.x = new Double[3][9];

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

大家好这是我的代码。问题是,在函数“calc_T(Matrix[] Ts, Double[][] T)”中,如果我在退出函数之前打印 T 的值,那就没问题了;但如果我在退出该功能后执行此操作,它会显示:

T 矩阵 =空,空,空,空,空,空,空,空,空,空,空,空,空,空,空,空

有人可以帮我吗?

非常感谢

最佳答案

这就是问题:

private static void calc_T(Matrix[] Ts, Double[][] T) {
T = Ts[0].x;
...
}

Java 中的参数按值传递。所以基本上,您会忽略 T 的原始值,为其分配一个新值,然后不对它执行任何操作 - 这不会为调用者带来任何改变。你想要这样的东西:

private static Double[][] calc_T(Matrix[] Ts) {
Double[] t = Ts[0].x;
for (int j = 1; j < 10; j++) {
t = product(t, Ts[j].x);
}
return t;
}

然后将其称为:

T.x = calc_T(Ts);

您还应该强烈考虑使用double[][]而不是Double[][],除非您需要能够表示null,并开始遵循 Java 命名约定。

关于java - 一旦我退出函数(Java),对象的值为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23939770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com