C++で行列の平均ベクトルを求める方法をわかりやすく解説
M × N の行列が与えられたとき、その平均ベクトルを求めることを考えます。例えば、次のような 3 × 3 の行列があるとします。
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
このとき、平均ベクトルは [4, 5, 6] となります。これは、各列の平均値がそれぞれ次のように計算されるためです。
- 1列目:(1 + 4 + 7) / 3 = 4
- 2列目:(2 + 5 + 8) / 3 = 5
- 3列目:(3 + 6 + 9) / 3 = 6
この例からも分かるように、行列の平均ベクトルとは「各列の平均値を要素として持つベクトル」のことです。したがって、行列の各列ごとに平均を計算し、その結果を順に並べるだけで平均ベクトルを求められます。
アルゴリズムのポイント
- 外側のループで列を走査し、内側のループでその列の各行の値を合計します。
- 合計を行数 M で割ることで、その列の平均値を求めます。
- 計算量は O(M × N) となり、行列のすべての要素を一度ずつ参照するだけで済むため、非常に効率的です。
C++での実装例
#include <iostream>
#define M 3
#define N 3
using namespace std;
void calculateMeanVector(int mat[M][N]) {
cout << "[ ";
for (int i = 0; i < N; i++) {
double average = 0.00;
int sum = 0;
for (int j = 0; j < M; j++)
sum += mat[j][i];
average = (double)sum / M;
cout << average << " ";
}
cout << "]";
}
int main() {
int mat[M][N] = { { 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } };
cout << "Mean vector is: ";
calculateMeanVector(mat);
}なお、合計を M で割る際に (double) へのキャストを行うことで、整数同士の除算による切り捨てを防ぎ、小数点以下を含む正確な平均値を得られるようにしています。
実行結果
Mean vector is: [ 4 5 6 ]
このように、各列の平均値が順番に出力され、行列の平均ベクトル [4, 5, 6] が正しく求められていることが確認できます。この手法は、統計処理や画像処理など、行列データの特徴量を列単位で集計したい場面で広く活用できます。
-
C++で行列内の要素ペアの最大差を効率的に求める方法
ここでは、整数値を持つ n × n の行列 mat が与えられた場合を考えます。すべてのインデックスの組み合わせの中から、mat(c, d) - mat(a, b) の最大値を見つけることが目的です。ただし、条件として c > a かつ d > b を満たす必要があります。 例えば、次のような行列があったとしましょう。 12-1-4-20-8-342138613-4-117-60-410-51 この場合の出力は 18 となります。mat[4][2] - mat[1][0] = 10 - (-8) の組み合わせが最大の差を生むためです。 解法のアプローチ この問題を効率的に解くため
-
C++でマトリックスの右下セルに到達するための最小ステップ数を求める方法
問題の概要正の整数で構成された2次元マトリックス(行列)が与えられたとします。このとき、左上のセル (0, 0) から右下のセル (n-1, n-1) まで移動するために必要な最小ステップ数を求めるのが目的です。移動のルールは以下のとおりです。現在いるセルを (i, j) とすると、次のいずれかのセルに移動できます。(i, j + mat[i][j]) … 現在のセルの値の分だけ右へ移動(i + mat[i][j], j) … 現在のセルの値の分だけ下へ移動ただし、マトリックスの範囲を超えて移動することはできません。入力例例として、次のようなマトリックスを考えてみましょう。212111111こ