すべてのカテゴリ » 知識・教養・学問 » 知識・学問 » 数学・サイエンス

質問

終了

Householder変換を行うプログラムをjava言語で実行し行列の固有値を求めようと試みてみました.
しかし,
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at Out.Mhouse(House.java:90)
at House.main(House.java:10)
のようなエラーが表示され上手く動作させる事が出来ませんでした.なぜか配列の数が合わない...どなたかこの問題を解決できる方お力をかしてください.
//Householder変換
public class House{
public static void main(String[] args){
double[][] A = new double[3][3];
int n = A.length;
Out out = new Out();
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(j < n-1){
System.out.print(out.Mhouse(A)[i][j] + " ");
}else if (j == n-1)
System.out.println(out.Mhouse(A)[i][j]);
};
};
};
};
class Out{
double[][] outpro(double[] x){
int n;
n = x.length;
double[][] A = new double[n][n];
for(int i = 0;i < n;i++ ){
for(int j = 0;j < n;j++){
A[i][j] = x[i] * x[j];
}
}
return A;
};
double[][] Msca(double a,double[][] A){
int n = A.length;
for(int i = 0;i < n; i++){
for(int j = 0;j < n;j++){
A[i][j] = a * A[i][j];
}
}
return A;
};
double selfpro(double[] x){
double a = 0;
int n = x.length;
for(int i = 0;i < n; i++){
a = a + x[i] * x[i];
};
return a;
};
double[] minus(double[] x, double[] y){
int n = x.length;
double[] z = new double[n];
for(int i = 0;i < n;i++){
z[i] = x[i] - y[i];
};
return z;
};
double[][] house_1(double[] x){
int n = x.length;
double[][] A = new double[n][n];
for(int i=0;i < n;i++){
for(int j = 0;j < n;j++){
if(i == j){
A[i][j] = 1 - Msca(2/selfpro(x),outpro(x))[i][j];
}else{
A[i][j] = - Msca(2/selfpro(x),outpro(x))[i][j];
};
};
};
return A;
};
double[][] house_2(double[] x){
double[][] z = new double[1][1];
z[1][1] = 1 - 2;
return z;
};
double[][] Mhouse(double[][] A){
int n = A.length;
double[][] H = new double[n][n];
for(int i = 0;i < n;i++){
double[] x = new double[n-i];
double[] y = new double[n-i];
double[][][] L = new double[i][n-i][n-i];
for(int j = 0;j < n-i;j++){
x[j] = A[i][i+j];
if(j == 0){
y[j] = 1;
}else{
y[j] = 0;
};
x[j] = y[j] - x[j];
};
if(i < n-1){
L[i] = house_1(x);
for(int k = 0;k < n-i;k++){
for(int l = 0;l < n-i;l++){
H[i+k][i+l] = L[i][k][l];
};
};
}else if(i == n-1){
L[i] = house_2(x);
for(int k = 0;k < n-i;k++){
for(int l = 0;l < n-i;l++){
H[i+k][i+l] = L[i][k][l];
};
};
};
};
double[][] B = new double[n][n];
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
for(int k = 0;k < n;k++){
B[i][j] = H[i][k] * A[k][j];
};
};
};
return A;
};
};

  • 質問者:Quantumstar
  • 質問日時:2021-07-06 21:13:45
  • 0

関連する質問・相談

Sooda!からのお知らせ

一覧を見る