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

C++で与えられた行列がテプリッツ行列かどうかを判定する方法

問題の概要

この記事では、サイズ n×n の2次元正方行列 mat[][] が与えられたとき、その行列がテプリッツ(Toeplitz)行列であるかどうかを判定する方法を解説します。

テプリッツ行列とは?

テプリッツ行列とは、左上から右下に向かうすべての斜め線(対角線)上の要素が同じ値になる行列のことです。数式で表すと、任意の i, j に対して次の関係が常に成り立ちます。

mat[i][j] == mat[i+1][j+1]

具体例で理解しよう

入力:

Mat[][] = {{6, 7, 8, 9},
           {4, 6, 7, 8},
           {1, 4, 6, 7},
           {0, 1, 4, 6}}

出力: Yes

説明:

この行列では、左上から右下へ向かう各対角線上の値が一致しています。

  • (0,0)→(1,1)→(2,2)→(3,3):6, 6, 6, 6
  • (0,1)→(1,2)→(2,3):7, 7, 7
  • (1,0)→(2,1)→(3,2):4, 4, 4

すべての対角線で値が一定であるため、この行列はテプリッツ行列だと判定できます。

解法アプローチ

最もシンプルな解法は、各要素とその右下の隣接要素を順番に比較することです。すべての組み合わせが一致すればテプリッツ行列であり、1つでも不一致が見つかればそうではありません。

具体的には、i を 0 から n-2 まで、j を 0 から n-2 まで動かしながら、mat[i][j] と mat[i+1][j+1] が等しいかどうかを確認します。

ソリューションの実装例

#include <iostream>
using namespace std;
#define N 4

bool isToeplizMatrix(int mat[N][N])
{
    // 各要素をその右下の要素と比較する
    for (int i = 0; i < N - 1; i++)
    {
        for (int j = 0; j < N - 1; j++)
        {
            if (mat[i][j] != mat[i + 1][j + 1]) {
                return false;
            }
        }
    }
    return true;
}

int main(){

    int mat[N][N] = { { 6, 7, 8, 9 },
                      { 4, 6, 7, 8 },
                      { 1, 4, 6, 7 },
                      { 0, 1, 4, 6 }};

    if (isToeplizMatrix(mat))
        cout<<"Matrix is a Toepliz matrix.";
    else
        cout<<"Matrix is not a Toepliz matrix.";

    return 0;
}

実行結果

Matrix is a Toepliz matrix.

計算量の分析

  • 時間計算量:O(n²) ― 行列のほぼすべての要素を一度ずつ比較するため
  • 空間計算量:O(1) ― 追加のメモリ領域は不要

まとめ

テプリッツ行列の判定は「各要素とその右下の要素が一致するか」というシンプルな条件で実現できます。二重ループによる O(n²) のアルゴリズムで効率的に判定でき、画像処理や信号処理などで利用されるテプリッツ構造の検証にも応用できます。

  1. C++で特定の行列がスパース行列(疎行列)かどうかを判定する方法

    この記事では、C++を使って与えられた行列が「スパース行列(疎行列)」かどうかを判定する方法を解説します。スパース行列とは、行列の要素の大部分が0で占められている行列のことです。一般的な定義では、全要素の3分の2以上が0である場合、その行列はスパース行列とみなされます。以下にスパース行列の例を示します。 判定方法は非常にシンプルです。まず行列内にある0の個数を数え、その数が全要素数の3分の2より大きければ、その行列はスパース行列であると判断します。 サンプルコード #include <iostream> #include <cmath> #define MAX 5

  2. Pythonで与えられた行列がテプリッツ行列かどうかを判定するプログラム

    テプリッツ行列とは?ある行列 M が与えられたとき、それがテプリッツ行列(Toeplitz matrix)であるかどうかを判定することを考えます。テプリッツ行列とは、左上から右下へ向かうすべての対角線(斜めの並び)上の要素が同じ値であるような行列のことです。例として、次のような入力行列を考えてみましょう。726372537この行列では、どの対角線を見ても値が一定になっています。たとえば「7 → 7 → 7」「2 → 2」「3 → 3」といった具合です。したがって、この場合の出力は True となります。判定アルゴリズムの考え方テプリッツ行列の性質を利用すると、判定は非常にシンプルです。各要素は