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

C++で行優先順序と列優先順序の同一行列を加算して得られる行列のトレースを求める方法

このチュートリアルでは、C++を用いて、同一の行列を行優先(row-major)順序と列優先(column-major)順序の両方で表現し、それらを加算して得られる新しい行列のトレースを求めるプログラムについて解説します。

ここでは、行優先順序で格納された配列と列優先順序で格納された配列の2つが与えられます。私たちの課題は、この2つの行列を加算して形成される行列のトレースを計算することです。

トレースとは?

行列のトレース(trace)とは、主対角線上にある要素、すなわち行番号と列番号が等しい位置にある要素の総和のことです。本記事のコードでは、i == j となる要素をすべて合計することでトレースを求めています。

アルゴリズムの手順

  1. カウンタ変数を1から順に増やしながら、行優先順序で行列Aを生成します。
  2. 同様に、カウンタ変数を1から順に増やしながら、列優先順序で行列Bを生成します。
  3. 行列Aと行列Bの対応する要素同士を加算し、新しい行列Cを作成します。
  4. 行列Cの対角要素(i == j となる要素)をすべて合計し、その値を返します。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
// 新しい行列のトレースを計算する関数
int calculateMatrixTrace(int row, int column) {
    int A[row][column], B[row][column], C[row][column];
    int count = 1;
    // 行優先順序で行列Aを生成
    for (int i = 0; i < row; i++)
        for (int j = 0; j < column; j++) {
            A[i][j] = count;
            count++;
        }
    count = 1;
    // 列優先順序で行列Bを生成
    for (int i = 0; i < row; i++)
        for (int j = 0; j < column; j++) {
            B[j][i] = count;
            count++;
        }
    // 行列AとBを加算してCを作成
    for (int i = 0; i < row; i++)
        for (int j = 0; j < column; j++)
            C[i][j] = A[i][j] + B[i][j];
    // 対角要素の合計(トレース)を計算
    int sum = 0;
    for (int i = 0; i < row; i++)
        for (int j = 0; j < column; j++)
            if (i == j)
                sum += C[i][j];
    return sum;
}
int main() {
    int ROW = 6, COLUMN = 9;
    cout << calculateMatrixTrace(ROW, COLUMN) << endl;
    return 0;
}

出力結果

384

コードの解説

このプログラムでは、まず6行9列の行列Aに対して、値を1から順に増やしながら行優先順序で要素を格納していきます。続いて、同じく1から始まるカウンタを用いて、列優先順序で行列Bを構築します。その後、両行列の対応する要素を加算した行列Cを作成し、i == j を満たす対角要素のみを合計することでトレースを求めます。ROW=6、COLUMN=9 の場合、実行結果として 384 が出力されます。

  1. C++で行列の基底と次元を求めるプログラムの作り方

    本記事では、行列の基底(basis)と次元(dimension)を求めるためのC++プログラムを紹介します。 基底と次元とは 線形代数における基底とは、ベクトル空間全体を張る線形独立なベクトルの集合のことです。そして次元とは、その基底に含まれるベクトルの個数を指します。 n個のベクトルがR^n(n次元実ベクトル空間)の基底を成すかどうかは、それらを並べてできるn次正方行列の行列式を計算すれば判定できます。行列式が0でなければベクトル群は線形独立であり、R^nの基底となります。逆に行列式が0であれば、ベクトル群は線形従属のため基底にはなりません。 アルゴリズム このプログラムでは、determi

  2. C++でグラフ行列の逆行列を求めるプログラムの実装方法

    本記事では、グラフ行列の逆行列を求めるC++プログラムについて詳しく解説します。行列の逆行列は、対象となる行列が正則(非特異)である場合、すなわち行列式が0ではない場合にのみ存在します。 逆行列を求める手法は複数ありますが、ここでは随伴行列(余因子行列の転置)と行列式を組み合わせて逆行列を計算する方法を紹介します。 アルゴリズムの手順 逆行列を求める際の処理の流れは以下の通りです。 開始 行列の逆行列を求める関数 INV() を定義する。 行列式を計算する関数 DET() を呼び出す。 随伴行列を生成する関数 ADJ() を呼び出す。 次の公式に基づいて逆行