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; };};
この機能は、特定のユーザーとの接触を避け、トラブルを防止するためにご用意しております。ブロックされたユーザーは、今後あなたの質問に回答ができなくなり、またそのユーザーの質問に対して、あなたも回答を投稿できなくなるという、重大な機能です。一度設定すると簡単に解除することができませんので、以下の点にご注意ください。
Sooda! は、ご利用者様同士の助け合いによって成り立つ知識共有サービスです。 多くの方に気持ちよくこのサイトを利用していただくために、事務局からのお願いごとがあります。
この投稿が、「禁止事項」のどの項目に違反しているのかを教えてください。 ご連絡いただいた内容がSooda! 事務局以外の第三者に伝わることはありません。
ご連絡いただきました内容は、当サイトの禁止事項に基づいて、事務局にて確認後、適切な対応をとらせていただきます。場合によっては、検討・対応に多少お時間を頂戴する場合もございます。
なお、誠に恐れ入りますが、今回のご連絡に関する対応のご報告は、結果をもって代えさせていただきます。対応の有無や判断基準に関しましては悪用を避けるため、事務局宛にお問合せいただきましても、ご回答およびメールのご返信はいたしかねますので、予めご了承くださいませ。
この質問を終了しますか?
質問をカテゴライズして、Sooda!をより良くしよう!
この質問を削除してもよろしいですか?
この回答を削除してもよろしいですか?
設定中のニックネームで質問したくない場合は、匿名で質問をすることが出来ます。 匿名で投稿する このニックネームを記憶する
一覧を見る