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

C++で対角行列・スカラー行列を判定するプログラムの書き方

行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表し、r = c のとき正方行列となります。本記事では、与えられた正方行列が対角行列であるか、スカラー行列であるかを判定し、該当する場合には「yes」を出力する方法を解説します。

対角行列とは

正方行列 m[][] が対角行列であるのは、主対角線以外の要素がすべてゼロである場合、かつその場合に限ります。

下図のように、赤色で示された要素が主対角成分(非ゼロ)であり、それ以外の要素はすべてゼロになっているため、この行列は対角行列です。

入出力例

Input: m[3][3] = { {7, 0, 0},
   {0, 8, 0},
   {0, 0, 9}}
Output: yes

Input: m[3][3] = { {1, 2, 3},
   {0, 4, 0},
   {0, 0, 5}}
Output: no

2つ目の例では、m[0][1] = 2 や m[0][2] = 3 など、対角線以外に非ゼロ要素が存在するため「no」となります。

対角行列を判定するアルゴリズム

Start
Step 1 -> サイズ4のマクロを定義する
Step 2 -> 行列が対角行列かどうかを判定する関数を宣言する
   bool ifdiagonal(int arr[size][size])
      Loop For int i = 0 and i < size and i++
         Loop for int j = 0 and j < size and j++
            IF ((i != j) && (arr[i][j] != 0))
               return false
            End
         End
      End
   return true
Step 3 -> main() 内で
   配列 arr[size][size] を宣言・初期化する
   IF (ifdiagonal(arr))
      対角行列である旨を出力する
   Else
      対角行列でない旨を出力する
   End
Stop

対角行列を判定するC++プログラム

#include <bits/stdc++.h>
#define size 4
using namespace std;
// 行列が対角行列かどうかを判定する
bool ifdiagonal(int arr[size][size]){
   for (int i = 0; i < size; i++)
   for (int j = 0; j < size; j++)
      if ((i != j) && (arr[i][j] != 0))
         return false;
   return true;
}
int main(){
   int arr[size][size] = { { 1, 0, 0, 0 },
      { 0, 1, 0, 0 },
      { 0, 0, 1, 0 },
      { 0, 0, 0, 1 }
   };
   if (ifdiagonal(arr))
      cout << "its a diagonal matrix" << endl;
   else
      cout << "its not a diagonal matrix" << endl;
   return 0;
}

実行結果

its a diagonal matrix

このプログラムでは、二重ループですべての要素を走査し、i ≠ j(対角成分以外)の位置に非ゼロ要素が見つかった時点で false を返します。すべてのチェックを通過すれば true を返し、対角行列と判定されます。

スカラー行列とは

正方行列 m[][] がスカラー行列であるのは、主対角線上の要素がすべて等しく、それ以外の要素がすべてゼロである場合です。つまり、スカラー行列は対角行列のうち、対角成分が同一の値を持つ特別なケースといえます。

下記の例では、赤色で示された対角要素がすべて同じ値であり、それ以外の要素がゼロのため、スカラー行列となります。

入出力例

Input: m[3][3] = { {2, 0, 0},
   {0, 2, 0},
   {0, 0, 2} }
Output: yes

Input: m[3][3] = { {3, 0, 0},
   {0, 2, 0},
   {0, 0, 3} }
Output: no

2つ目の例では、対角成分が 3, 2, 3 と一致していないため「no」となります。

スカラー行列を判定するアルゴリズム

Start
Step 1 -> #define size 4 としてマクロを宣言する
Step 2 -> 行列がスカラー行列かどうかを判定する関数を宣言する
   bool scalar(int arr[size][size])
      Loop For int i = 0 and i < size and i++
         Loop For int j = 0 and j < size and j++
            IF ((i != j) && (arr[i][j] != 0))
               return false
            End
         End
      End
   Loop for int i = 0 and i < size - 1 and i++
      If (arr[i][i] != arr[i + 1][i + 1])
         return false
      End
   End
   Return true
Step 3 -> main() 内で
   配列 arr[size][size] を宣言・初期化する
   IF(scalar(arr))
      スカラー行列である旨を出力する
   Else
      スカラー行列でない旨を出力する
Stop

スカラー行列を判定するC++プログラム

#include <bits/stdc++.h>
#define size 4
using namespace std;
// 行列がスカラー行列かどうかを判定する
bool scalar(int arr[size][size]){
   for (int i = 0; i < size; i++)
   for (int j = 0; j < size; j++)
      if ((i != j) && (arr[i][j] != 0))
         return false;
   for (int i = 0; i < size - 1; i++)
      if (arr[i][i] != arr[i + 1][i + 1])
         return false;
   return true;
}
int main(){
   int arr[size][size] = { { 2, 0, 0, 0 },
      { 0, 2, 0, 0 },
      { 0, 0, 2, 0 },
      { 0, 0, 0, 2 } };
   if (scalar(arr))
      cout << "its a scalar matrix" << endl;
   else
      cout << "its not a scalar matrix" << endl;
   return 0;
}

実行結果

its a scalar matrix

スカラー行列の判定では、まず対角成分以外に非ゼロ要素がないことを確認したうえで、隣り合う対角成分同士(arr[i][i] と arr[i+1][i+1])がすべて等しいかどうかを追加でチェックします。両方の条件を満たして初めてスカラー行列と判定されます。

  1. C++で対合行列(インボリュートリー行列)を判定するプログラムの実装方法

    行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表します。ここでは r = c、つまり正方行列である場合を考えます。この記事では、与えられた正方行列が対合行列(インボリュートリー行列)であるかどうかを判定する方法を解説します。 対合行列とは 対合行列とは、ある行列を自分自身と掛け合わせたとき、その積が単位行列になるような行列のことです。単位行列 I とは、主対角成分がすべて 1 で、それ以外の要素がすべて 0 である行列を指します。 したがって、行列 M が対合行列であるための必要十分条件は次のように表せます。 M × M = I ここで、M は任意の行列、I は単位行列で

  2. C++でべき等行列を判定するプログラムの作成方法

    行数を r、列数を c とする行列 M[r][c] が与えられ、r = c となる正方行列を考えます。この記事では、与えられた正方行列がべき等行列(アイデンポテント行列)であるかどうかを判定するC++プログラムを解説します。 べき等行列とは 行列 M がべき等行列であるとは、行列 M と自分自身の積が元の行列 M と等しくなること、すなわち M × M = M が成り立つことを指します。 例えば、次の行列を見てください。 この行列を自分自身で掛け合わせても、結果は元の行列とまったく同じになります。したがって、この行列はべき等行列であると言えます。 べき等行列の代表的な例としては、ベクトルを