【Java】行列のトレースとノルムを求めるプログラムの作成方法
本記事では、Javaを使って与えられた行列の「トレース」と「ノルム」を求める方法について詳しく解説します。
まず、それぞれの用語を確認しておきましょう。ノルムとは、行列内のすべての要素を2乗し、その合計に対して平方根を取った値のことです。一方、トレースとは、主対角成分(行列の左上から右下に向かう対角線上にある要素)の総和を指します。
それでは、具体的な例を見ていきましょう。
入力:
定義された行列: 2 3 4 5 2 3 4 6 9
期待される出力:
トレースの値:13.0 ノルムの値:14.142135623730951
アルゴリズム
Step 1 - 開始 Step 2 - 整数型の2次元配列 input_matrix を宣言する Step 3 - 行列の各要素の値を定義する Step 4 - トレースの計算:2重のforループで行列を走査し、行番号と列番号が一致する対角成分のみを加算して保持する Step 5 - ノルムの計算:2重のforループですべての要素の2乗和を求め、その平方根を計算して保持する Step 6 - 結果を表示する Step 7 - 終了
例1:すべての処理をmainメソッドにまとめる場合
この例では、行列の表示からトレース・ノルムの計算まで、すべての処理をmainメソッド内に直接記述しています。
public class NormalAndTrace {
public static void main(String args[]) {
int[][] input_matrix = {
{2, 3, 4},
{5, 2, 3},
{4, 6, 9}
};
int i, j, matrix_size = 3;
double trace = 0, square = 0, normal = 0;
System.out.println("The matrix is defined as: ");
for(i = 0; i < matrix_size; i++) {
for(j = 0; j < matrix_size; j++)
System.out.print(input_matrix[i][j]+" ");
System.out.println(" ");
}
System.out.println("\nThe Trace value of the matrix is ");
for(i = 0; i < matrix_size; i++) {
for(j = 0; j < matrix_size; j++) {
if(i == j) {
trace = trace + (input_matrix[i][j]);
}
}
}
System.out.println(trace);
System.out.println("\nThe Normal value of the matrix is ");
for(i = 0; i < matrix_size; i++) {
for(j = 0; j < matrix_size; j++) {
square = square + (input_matrix[i][j])*(input_matrix[i][j]);
}
}
normal = Math.sqrt(square);
System.out.println(normal);
}
}
出力
The matrix is defined as: 2 3 4 5 2 3 4 6 9 The Trace value of the matrix is 13.0 The Normal value of the matrix is 14.142135623730951
例2:オブジェクト指向スタイルでメソッドに分割する場合
次の例では、トレースとノルムの計算処理を独立したメソッドとしてカプセル化し、オブジェクト指向プログラミングの考え方に沿って記述しています。このように分割することで、コードの再利用性と可読性が向上します。
public class NormalAndTrace {
static int matrix_size = 3;
static void normal_trace(int input_matrix[][]){
int i, j;
double trace = 0, square = 0, normal = 0;
System.out.println("\nThe Trace value of the matrix is ");
for(i = 0; i < matrix_size; i++) {
for(j = 0; j < matrix_size; j++) {
if(i == j) {
trace = trace + (input_matrix[i][j]);
}
}
}
System.out.println(trace);
System.out.println("\nThe Normal value of the matrix is ");
for(i = 0; i < matrix_size; i++) {
for(j = 0; j < matrix_size; j++) {
square = square + (input_matrix[i][j])*(input_matrix[i][j]);
}
}
normal = Math.sqrt(square);
System.out.println(normal);
}
public static void main(String args[]) {
int i, j;
int[][] input_matrix = { {2, 3, 4},
{5, 2, 3},
{4, 6, 9}
};
System.out.println("The matrix is defined as: ");
for(i = 0; i < matrix_size; i++) {
for(j = 0; j < matrix_size; j++)
System.out.print(input_matrix[i][j]+" ");
System.out.println(" ");
}
normal_trace(input_matrix);
}
}
出力
The matrix is defined as: 2 3 4 5 2 3 4 6 9 The Trace value of the matrix is 13.0 The Normal value of the matrix is 14.142135623730951
まとめ
どちらの実装でも、時間計算量はO(n²)となり、行列のサイズに比例して処理時間が増加します。なお、ここで求めたノルムは線形代数におけるフロベニウスノルムと呼ばれるもので、行列の「大きさ」を表す指標として機械学習や数値計算の分野で広く利用されています。また、トレースは固有値の総和と一致するという重要な性質を持つため、線形代数のさまざまな場面で活用されています。
-
【Java入門】長方形の周囲(外周)を求めるプログラムの作り方
長方形の周囲とは? この記事では、Javaを使って長方形の周囲(外周)を求める方法を解説します。長方形の周囲とは、長方形の4つの辺すべての長さを足し合わせた合計のことで、次の図のように「縦の辺2本」と「横の辺2本」の長さを合計したものに相当します。 長方形は向かい合う辺の長さが等しいという性質を持つため、周囲は次の式で計算できます。 周囲 = 2 ×(縦の長さ + 横の長さ) 入力と出力の例 たとえば、入力が次の値であるとします。 長方形の各辺の長さ:5, 8, 5, 8 このとき、期待される出力は次のとおりです。 Perimeter : 26 アルゴリズム 処理の流れは以下のようになりま
-
Pythonで行列の転置を求めるプログラム
この記事では、与えられた問題に対する解法とアプローチについて詳しく解説します。 問題文 ある行列が与えられたとき、その転置を同じ行列に格納し、結果を表示する必要があります。 行列の転置とは、行を列に、列を行に入れ替えたものです。言い換えれば、行列Aの転置は、要素A[i][j]をA[j][i]と入れ替えることで得られます。 実装例 N = 4 def transpose(A): for i in range(N): for j in range(i+1, N): A[i][j], A[j][i] = A[j][i], A[i][j] # ドライ