Java
 Computer >> コンピューター >  >> プログラミング >> Java

【Java】行列の対角線上の要素を入れ替える方法をサンプルコード付きで解説

はじめに

本記事では、行列の対角線上にある要素を入れ替える方法を解説します。行列とは、要素を行と列の形式で配置したデータ構造のことで、m行n列の行列は「m × n行列」と表現されます。

行列内の個々の値は「要素」と呼ばれ、a[i][j] のように表記します。これは、行列 a の i 行目・j 列目にその要素が存在することを意味します。

以下に具体的な処理イメージを示します。

入力:

定義された行列:
4 5 6
1 2 3
7 8 9

出力:

要素を入れ替えた後の行列:
6 5 4
1 2 3
9 8 7

このように、左上から右下へ伸びる主対角線と、右上から左下へ伸びる副対角線(逆対角線)の要素が、同じ行内でそれぞれ入れ替えられます。3×3行列の場合、中央の要素は両方の対角線が交わる位置にあるため、入れ替えの対象外となります。

アルゴリズム

Step 1 - 処理を開始する
Step 2 - 整数型の行列 input_matrix、整数値 matrix_size と temp を宣言する
Step 3 - 行列の各値を定義する
Step 4 - forループで行列を走査し、一時変数 temp を使って主対角線と副対角線の要素を交換する
Step 5 - 結果を表示する
Step 6 - 処理を終了する

ポイント

i行目の主対角線要素は input_matrix[i][i]、副対角線要素は input_matrix[i][matrix_size - i - 1] として取得できます。この2つの値を一時変数経由で交換するだけで、対角線の入れ替えが実現できます。行列全体の表示にはO(n²)かかりますが、入れ替え処理自体はO(n)で完了する非常に効率的な操作です。

例1:mainメソッドにすべての処理を記述する場合

この例では、すべての操作を main メソッド内にまとめて記述しています。

public class InterchangeDiagonals {
   public static int matrix_size = 3;

   public static void main(String[] args) {
      int input_matrix[][] = {
         {4, 5, 6},
         {1, 2, 3},
         {7, 8, 9}
      };
      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.println();
      }
      for (int i = 0; i < matrix_size; ++i) {
         if (i != matrix_size / 2) {
            int temp = input_matrix[i][i];
            input_matrix[i][i] = input_matrix[i][matrix_size - i - 1];
            input_matrix[i][matrix_size - i - 1] = temp;
         }
      }
      System.out.println("\n要素を入れ替えた後の行列:");
      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.println();
      }
   }
}

出力

定義された行列:
4 5 6
1 2 3
7 8 9

要素を入れ替えた後の行列:
6 5 4
1 2 3
9 8 7

例2:オブジェクト指向スタイルでメソッドに分割する場合

この例では、対角線の入れ替え処理を独立したメソッドに切り出し、オブジェクト指向プログラミングの考え方に沿って実装しています。

public class InterchangeDiagonals {
   public static int matrix_size = 3;

   static void interchange_diagonals(int input_matrix[][]) {
      for (int i = 0; i < matrix_size; ++i) {
         if (i != matrix_size / 2) {
            int temp = input_matrix[i][i];
            input_matrix[i][i] = input_matrix[i][matrix_size - i - 1];
            input_matrix[i][matrix_size - i - 1] = temp;
         }
      }
      System.out.println("\n要素を入れ替えた後の行列:");
      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.println();
      }
   }

   public static void main(String[] args) {
      int input_matrix[][] = {
         {4, 5, 6},
         {1, 2, 3},
         {7, 8, 9}
      };
      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.println();
      }
      interchange_diagonals(input_matrix);
   }
}

出力

定義された行列:
4 5 6
1 2 3
7 8 9

要素を入れ替えた後の行列:
6 5 4
1 2 3
9 8 7

まとめ

行列の対角線要素の入れ替えは、「i番目の主対角線要素」と「matrix_size - i - 1 番目の副対角線要素」を一時変数を使って交換するだけのシンプルな操作です。奇数次の正方行列では中央の要素が二重に入れ替わらないよう、if (i != matrix_size / 2) の条件分岐を加えている点にも注目してください。規模の小さい処理ならmainメソッドにまとめる書き方、再利用性を高めたい場合はメソッド分割による書き方と、目的に応じて使い分けると良いでしょう。

  1. Javaで台形の面積を求めるプログラムの作成方法を解説

    この記事では、Javaを使って台形(トラペジウム)の面積を求める方法について詳しく解説します。台形とは、少なくとも1組の対辺が互いに平行になっている四角形のことです。平行な2つの辺は「底辺」と呼ばれ、平行でない残りの2つの辺は「脚」と呼ばれます。英語圏では trapezoid(トラペゾイド)と呼ばれることもあります。 台形の面積は、次の公式を使って計算できます。 面積 = (高さ ÷ 2) × (上底 + 下底) すなわち、 面積 = ½ × (平行な2辺の長さの合計) × (平行な2辺間の垂直距離) 以下に具体的なイメージを示します。平行な2辺の長さを a、b、台形の高さを h としたとき

  2. 【Java入門】長方形の周囲(外周)を求めるプログラムの作り方

    長方形の周囲とは? この記事では、Javaを使って長方形の周囲(外周)を求める方法を解説します。長方形の周囲とは、長方形の4つの辺すべての長さを足し合わせた合計のことで、次の図のように「縦の辺2本」と「横の辺2本」の長さを合計したものに相当します。 長方形は向かい合う辺の長さが等しいという性質を持つため、周囲は次の式で計算できます。 周囲 = 2 ×(縦の長さ + 横の長さ) 入力と出力の例 たとえば、入力が次の値であるとします。 長方形の各辺の長さ:5, 8, 5, 8 このとき、期待される出力は次のとおりです。 Perimeter : 26 アルゴリズム 処理の流れは以下のようになりま