【C++】行優先と列優先の行列を加算してできる行列のトレースを求める方法
このチュートリアルでは、行優先(row-major)と列優先(column-major)の2つの行列を加算して得られる行列のトレース(対角成分の総和)を求めるC++プログラムを作成します。
行優先行列と列優先行列の作り方
まず、行列の次数が与えられたとき、それぞれの行列がどのように構成されるのかを確認しましょう。
次数: 3 × 3
行優先行列:
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
列優先行列:
| 1 | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |
2つの行列が用意できたら、それらを要素ごとに加算します。そして、その結果として得られる行列のトレースこそが、私たちが求める答えです。
解決の手順
問題を解くために、次の4つのステップを実行します。
- 行優先行列を作成する
- 列優先行列を作成する
- 両方の行列を加算し、結果の行列を保存する
- 結果の行列のトレースを求めて出力する
サンプルコード
それでは、実際のコードを見てみましょう。
#include <iostream>
using namespace std;
int traceOfRowAndColumnMajorMatrices(int m, int n) {
int row_major[m][n], column_major[m][n], addition_result[m][n];
int count = 1;
// ステップ1: 行優先行列の作成
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
row_major[i][j] = count++;
}
}
// ステップ2: 列優先行列の作成
count = 1;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
column_major[j][i] = count++;
}
}
// ステップ3: 両方の行列を加算
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
addition_result[i][j] = row_major[i][j] + column_major[i][j];
}
}
// ステップ4: トレースの計算
int trace = 0;
for (int i = 0; i < m; i++) {
trace += addition_result[i][i];
}
return trace;
}
int main() {
int m = 3, n = 3;
cout << traceOfRowAndColumnMajorMatrices(m, n) << endl;
return 0;
}
出力
上記のプログラムを実行すると、次の結果が得られます。
30
補足: 結果が「30」になる理由
列優先行列は、行優先行列の転置行列と同一です。転置しても対角成分の値は変化しないため、2つの行列の和のトレースは、元の行列のトレースのちょうど2倍になります。この例では、行優先行列の対角成分は 1 + 5 + 9 = 15 となるため、その2倍である 30 が答えになります。
まとめ
今回は、行優先・列優先の2つの行列を加算し、その結果の行列からトレースを求める方法を解説しました。本チュートリアルについて質問がある場合は、コメント欄でお気軽にお知らせください。
-
C++でべき等行列を判定するプログラムの作成方法
行数を r、列数を c とする行列 M[r][c] が与えられ、r = c となる正方行列を考えます。この記事では、与えられた正方行列がべき等行列(アイデンポテント行列)であるかどうかを判定するC++プログラムを解説します。 べき等行列とは 行列 M がべき等行列であるとは、行列 M と自分自身の積が元の行列 M と等しくなること、すなわち M × M = M が成り立つことを指します。 例えば、次の行列を見てください。 この行列を自分自身で掛け合わせても、結果は元の行列とまったく同じになります。したがって、この行列はべき等行列であると言えます。 べき等行列の代表的な例としては、ベクトルを
-
C++で行列の転置を求めるプログラムの書き方【サンプルコード付き解説】
行列とは、数値を行と列の形式に整理して並べた長方形の配列のことです。そして「転置行列」とは、元の行列の行を列に、列を行に入れ替えて作られる新しい行列を指します。転置行列のイメージ例として、次のような3×3の行列を見てみましょう。1 2 3 4 5 6 7 8 9この行列を転置すると、次のようになります。1 4 7 2 5 8 3 6 9元の行列の1行目(1, 2, 3)が、転置後には1列目になっていることが分かります。このように、元の行列の要素 a[i][j] は、転置後には a[j][i] の位置へ移動します。C++による転置行列を求めるプログラム以下が、C++で行列の転置を求めるプログラム