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

C言語で単位行列を生成・判定するプログラムの解説

行数 r と列数 c が等しい正方行列 M[r][c] が与えられたとき、その行列が単位行列であるかどうかを判定したり、単位行列そのものを生成したりすることができます。本記事では、C言語を使って単位行列を出力するプログラムの考え方と実装方法をわかりやすく解説します。

単位行列とは

単位行列(ユニット行列とも呼ばれます)は、サイズ n×n の正方行列の一種で、左上から右下への対角成分(主対角線上の要素)がすべて 1 であり、それ以外の非対角成分がすべて 0 となる行列です。単位行列は一般的に「I」という記号で表され、行列の乗算において数値の「1」に相当する役割を持つ、非常に重要な行列です。

以下に、サイズごとの単位行列の例を示します。

I1 = | 1 |

I2 = | 1  0 |
     | 0  1 |

I3 = | 1  0  0 |
     | 0  1  0 |
     | 0  0  1 |

In = | 1  0  0 ... 0 |
     | 0  1  0 ... 0 |
     | 0  0  1 ... 0 |
     | .  .  . ... . |
     | 0  0  0 ... 1 |

入力と出力の例

与えられた行列が単位行列かどうかを判定した場合の入力と出力の対応は次のとおりです。

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

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

アルゴリズム

単位行列を生成する基本的な手順は以下のとおりです。ポイントは、行番号と列番号が一致する位置には「1」を、それ以外の位置には「0」を出力することです。

開始
ステップ 1 → 単位行列を求めるための関数を宣言する
    int identity(int num)
        int row, col を宣言する
        row = 0 から row < num まで row++ しながらループ
            col = 0 から col < num まで col++ しながらループ
                IF (row == col)
                    「1」を出力する
                ELSE
                    「0」を出力する
            内側ループ終了後、改行を出力する
        外側ループ終了
ステップ 2 → main() 関数内で
    int size = 4 を宣言する
    identity(size) を呼び出す
終了

C言語による実装例

上記のアルゴリズムを実際にC言語で記述すると、次のようになります。

#include<stdio.h>

int identity(int num){
    int row, col;
    for (row = 0; row < num; row++){
        for (col = 0; col < num; col++){
            if (row == col)
                printf("%d ", 1);
            else
                printf("%d ", 0);
        }
        printf("\n");
    }
    return 0;
}

int main(){
    int size = 4;
    identity(size);
    return 0;
}

実行結果

このプログラムを実行すると、サイズ 4×4 の単位行列が出力されます。

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

与えられた行列が単位行列かどうかを判定する方法

冒頭で触れた「判定」を行う場合は、すべての要素について「対角成分なら 1、非対角成分なら 0」という条件を満たすかどうかを確認します。一箇所でも条件に反する要素があれば、その行列は単位行列ではありません。

#include<stdio.h>

#define N 3

int isIdentity(int m[N][N]){
    for (int row = 0; row < N; row++){
        for (int col = 0; col < N; col++){
            if ((row == col && m[row][col] != 1) ||
                (row != col && m[row][col] != 0))
                return 0;
        }
    }
    return 1;
}

int main(){
    int m[N][N] = { {1, 0, 0},
                    {0, 1, 0},
                    {0, 0, 1} };
    if (isIdentity(m))
        printf("yes\n");
    else
        printf("no\n");
    return 0;
}

この判定処理では、行列のすべての要素を一度ずつ調べるため、計算量は O(n²) となります。

まとめ

単位行列は「対角成分が 1、その他が 0」の正方行列であり、行番号と列番号の一致不一致だけで簡単に生成・判定できます。C言語では二重ループを使うことで短いコードで実装できるため、配列とループ処理の学習教材としても最適な題材です。ぜひ自分でもサイズを変えて試してみてください。

  1. 【初心者向け】平行四辺形の外周(周長)を計算するC言語プログラム

    本記事では、2つの辺の長さが与えられた平行四辺形の外周(周囲の長さ)を計算し、その結果を表示するC言語プログラムを紹介します。数式の考え方からアルゴリズム、実際のコードまで順を追って解説していきます。 平行四辺形とは? 平行四辺形とは、次のような性質を持つ四角形の一種です。 向かい合う2組の辺がそれぞれ平行である 向かい合う角の大きさが互いに等しい 2本の対角線が互いの中点で交わる 下の図では、「a」と「b」が平行四辺形の隣り合う2つの辺の長さを表しています。 平行四辺形の外周の求め方 平行四辺形の外周(周長)は、次の式で定義されます。 外周 = 2 × (a + b)   = 2 ×

  2. C言語で作る!キラキラ点滅するクリスマスツリー表示プログラム

    今回は少しユニークなプログラミング課題を紹介します。C言語を使って、クリスマスツリーをランダムに表示する方法です。完成したツリーは、本物のクリスマスイルミネーションのようにキラキラと点滅して見えます。 クリスマスツリーの表示の仕組み クリスマスツリーを描くには、大きさの異なる三角形(ピラミッド)をいくつも縦に積み重ねて出力します。装飾的な葉っぱの部分には、あらかじめ用意した文字リスト(.・*・+・o・O)の中からランダムに1文字を選んで表示します。 ツリーの高さやランダム性の度合いは、ソースコード冒頭のマクロ定数を書き換えるだけで自由に調整できます。 点滅が実現される仕組み このプログラムのポ