Javaで行列の対角線要素の合計を計算する方法
本記事では、Javaを使用して行列の対角線要素の合計を計算する方法を詳しく解説します。行列とは、数値などの要素を行(横方向)と列(縦方向)のグリッド状に配置したデータ構造であり、線形代数や画像処理など幅広い分野で活用されています。
正方行列(行数と列数が同じ行列)には、次の2種類の対角線が存在します。
- 主対角線(Principal Diagonal):行列の左上隅から右下隅へと向かう対角線
- 副対角線(Secondary Diagonal):行列の左下隅から右上隅へと向かう対角線
それでは、具体的な入力と出力の例を見てみましょう。
入力:
入力行列:
4 5 6 7
1 7 3 4
11 12 13 14
23 24 25 50
期待される出力:
主対角線要素の合計: 74
副対角線要素の合計: 45
アルゴリズム
対角線の合計を求める手順は以下の通りです。
- 処理を開始する。
- 整数型の二次元配列 input_matrix を宣言する。
- 行列の各要素に値を設定する。
- 2重のforループで行列を走査し、行番号と列番号が等しい(
i == j)要素を主対角線の合計に加算する。同時に、i + j == matrix_size - 1を満たす要素を副対角線の合計に加算する。 - 計算結果を表示する。
- 処理を終了する。
例1:mainメソッドにすべての処理を記述する方法
まずは、すべての処理をmainメソッド内に直接記述するシンプルな例から見ていきましょう。
public class MatrixDiagonals {
static public void main(String[] args) {
int[][] input_matrix = {
{ 4, 5, 6, 7 },
{ 1, 7, 3, 4 },
{ 11, 12, 13, 14 },
{ 23, 24, 25, 50 }
};
int matrix_size = 4;
System.out.println("行列は以下のように定義されています : ");
for (int i = 0; i < matrix_size; i++) {
for (int j = 0; j < matrix_size; j++)
System.out.print( input_matrix[i][j] + " ");
System.out.print("\n");
}
int principal_diagonal = 0, secondary_diagonal = 0;
for (int i = 0; i < matrix_size; i++) {
for (int j = 0; j < matrix_size; j++) {
if (i == j)
principal_diagonal += input_matrix[i][j];
if ((i + j) == (matrix_size - 1))
secondary_diagonal += input_matrix[i][j];
}
}
System.out.println("\n 行列の主対角線要素の合計は: " + principal_diagonal);
System.out.println("\n 行列の副対角線要素の合計は: " + secondary_diagonal);
}
}実行結果
行列は以下のように定義されています :
4 5 6 7
1 7 3 4
11 12 13 14
23 24 25 50
行列の主対角線要素の合計は: 74
行列の副対角線要素の合計は: 45
例2:処理を関数として切り出す方法(オブジェクト指向)
次に、対角線の合計を計算する処理を独立したメソッドに切り出し、オブジェクト指向プログラミングのスタイルで記述した例を紹介します。処理を関数化することで、コードの再利用性と可読性が向上します。
public class MatrixDiagonals {
static void diagonals_sum(int[][] input_matrix, int matrix_size) {
int principal_diagonal = 0, secondary_diagonal = 0;
for (int i = 0; i < matrix_size; i++) {
for (int j = 0; j < matrix_size; j++) {
if (i == j)
principal_diagonal += input_matrix[i][j];
if ((i + j) == (matrix_size - 1))
secondary_diagonal += input_matrix[i][j];
}
}
System.out.println("\n 行列の主対角線要素の合計は: " + principal_diagonal);
System.out.println("\n 行列の副対角線要素の合計は: " + secondary_diagonal);
}
static public void main(String[] args) {
int[][] input_matrix = {
{ 4, 5, 6, 7 },
{ 1, 7, 3, 4 },
{ 11, 12, 13, 14 },
{ 23, 24, 25, 50 }
};
int matrix_size = 4;
System.out.println("行列は以下のように定義されています : ");
for (int i = 0; i < matrix_size; i++) {
for (int j = 0; j < matrix_size; j++)
System.out.print( input_matrix[i][j] + " ");
System.out.print("\n");
}
diagonals_sum(input_matrix, matrix_size);
}
}実行結果
行列は以下のように定義されています :
4 5 6 7
1 7 3 4
11 12 13 14
23 24 25 50
行列の主対角線要素の合計は: 74
行列の副対角線要素の合計は: 45
まとめ
このように、2重ループとシンプルな条件式を組み合わせるだけで、行列の対角線要素の合計を効率的に求めることができます。ポイントとなるのは次の2つの条件です。
- 主対角線:
i == j(行番号と列番号が一致する要素) - 副対角線:
i + j == matrix_size - 1(行番号と列番号の和が「サイズ−1」と一致する要素)
なお、上記の実装では計算量がO(n²)になりますが、ループを1つだけにしてインデックスiで直接両方の対角線要素へアクセスするように書き換えれば、O(n)まで高速化することも可能です。ぜひ自分でも試してみてください。
-
Javaで商と剰余(余り)を計算するプログラムの書き方
この記事では、Javaで商(クォーシェント)と剰余(リメインダー)を計算する方法をわかりやすく解説します。商と剰余は、次の2つのシンプルな式で求めることができます。商 = 被除数 ÷ 除数剰余 = 被除数 % 除数(%は剰余演算子)商と剰余の数学的な定義整数 a と 0 以外の整数 d が与えられたとき、a = qd + r かつ 0 ≤ r < |d| を満たす整数 q と r の組み合わせは必ず一意に存在することが証明されています。このとき、q を商、r を剰余(余り)と呼びます。以下に具体的なイメージを示します。入力例今回の入力は次のとおりです。被除数の値: 50 除数: 3出力例期待さ
-
【Java入門】長方形の周囲(外周)を求めるプログラムの作り方
長方形の周囲とは? この記事では、Javaを使って長方形の周囲(外周)を求める方法を解説します。長方形の周囲とは、長方形の4つの辺すべての長さを足し合わせた合計のことで、次の図のように「縦の辺2本」と「横の辺2本」の長さを合計したものに相当します。 長方形は向かい合う辺の長さが等しいという性質を持つため、周囲は次の式で計算できます。 周囲 = 2 ×(縦の長さ + 横の長さ) 入力と出力の例 たとえば、入力が次の値であるとします。 長方形の各辺の長さ:5, 8, 5, 8 このとき、期待される出力は次のとおりです。 Perimeter : 26 アルゴリズム 処理の流れは以下のようになりま