C++でN次の対称行列を生成する方法:各行に0〜N-1の整数を含み、主対角線は0のみ
はじめに
ここでは、N次の対称行列を生成する方法を解説します。この行列の各行には0からN-1までの整数が含まれ、主対角線上の要素は常に0になります。
アルゴリズムの考え方
この問題は非常にシンプルです。まずN×Nの行列を用意し、行i・列jの各要素について次のように値を決定します。
- i == j の場合(対角成分): 0 を設定する
- それ以外の場合: 1から始まるカウンタを1ずつ増やしながら値を格納する
カウンタは行ごとに1へリセットされるため、各行には対角成分の0を除いて、1からN-1までの整数が必ず1回ずつ現れることになります。
C++による実装例
#include <iostream>
using namespace std;
void makeSymmetricMatrix(int n) {
int matrix[n][n];
for (int i = 0; i < n; i++) {
int count = 1;
for (int j = 0; j < n; j++) {
if (i == j) {
matrix[i][j] = 0;
} else {
matrix[i][j] = count++;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
}
int main() {
int n = 5;
makeSymmetricMatrix(n);
}
出力結果
0 1 2 3 4
1 0 2 3 4
1 2 0 3 4
1 2 3 0 4
1 2 3 4 0
処理のポイント
外側のループで行を、内側のループで列を走査します。対角成分(i == j)だけ0を代入し、それ以外の要素にはカウンタ値を順に代入していきます。カウンタ変数は行の処理が始まるたびに1に初期化されるため、各行が独立した値の並びを持つ点が特徴です。
計算量はO(N²)です。N×Nのすべての要素を正確に1回ずつ処理する必要があるため、これが本問題における最適な計算量となります。
-
C++での2次元行列のジグザグ(対角)トラバーサルの実装方法
問題の概要 この記事では、2次元行列(マトリックス)のすべての要素を対角線に沿った順序、いわゆる「ジグザグ(対角)トラバーサル」で出力する方法を解説します。 まず、具体例を使って問題を理解しましょう。次のような3×3の行列が与えられたとします。 1 2 3 4 5 6 7 8 9 出力 − 1 4 2 7 5 3 8 6 9 対角トラバーサルのパターン 行列をジグザグ形式で出力する際には、どのようなパターンで要素が並ぶのでしょうか。下の図のように、要素は左下から右上へ向かう斜めのラインごとに順番に出力されます。
-
C++で行列が対称行列かどうかを判定するプログラム
対称行列とは線形代数において、行列 M[][] が「対称行列(symmetric matrix)」であるとは、その転置行列が元の行列と完全に等しい場合を指します。転置行列とは、行列を対角線を軸として裏返す操作であり、これにより行と列のインデックスが入れ替わります。以下に対称行列の例を示します。$$\begin{bmatrix} 1 & 4 & 7 \\ 4 & 5 & 6 \\ 7 & 6 & 9 \\ \end {bmatrix} \Rightarrow \begin{bmatrix} 1 & 4 & 7 \\ 4 &