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

C++で行列の上三角と下三角を入れ替える方法

このチュートリアルでは、C++のコードを使って3×3の正方行列(対角配列)の上三角部分を下三角部分と入れ替える方法を解説します。この操作は、いわゆる「行列の転置」と同じ処理であり、対角配列を入力として与えたとき、期待される結果は以下のようになります。

C++で行列の上三角と下三角を入れ替える方法

具体的な手順は、以下のアルゴリズムにまとめられます。

アルゴリズム

ステップ1:対角配列を入力する
ステップ2:Swap()メソッドに渡す
ステップ3:外側のループを3回まで繰り返す
ステップ4:内側のループで j = i + 1 から3まで増加させる
ステップ5:配列の値を一時変数tempに退避させる
ステップ6:arr[i][j] = arr[j][i] として値を入れ替える
ステップ7:tempの値を arr[j][i] に代入する
ステップ8:forループを使って結果を出力する

ポイントは、内側のループを j = i + 1 から始めることです。これにより、対角成分より右上の要素(上三角)だけを走査し、左下の対応する要素(下三角)と一度だけ入れ替えることができます。すべての要素を走査してしまうと、同じペアを2回入れ替えてしまい、元の行列に戻ってしまうので注意が必要です。

以上のアルゴリズムに従うと、C++のコードは次のように記述できます。

サンプルコード

#include <iostream>
#define n 3
using namespace std;
// 対角線を基準に上下の要素を入れ替える関数
void swap(int arr[n][n]){
    // 行列の要素を入れ替えるループ
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            int temp = arr[i][j];
            arr[i][j] = arr[j][i];
            arr[j][i] = temp;
        }
    }
    // 行列の要素を出力するループ
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cout << arr[i][j] << " ";
        cout << endl;
    }
}
// プログラムを実行するドライバ関数
int main(){
    int arr[n][n] = {
        { 1, 2, 3},
        { 4, 5, 6},
        { 7, 8, 9},
    };
    cout<<"Input::"<<endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cout << arr[i][j]<< " ";
        cout << endl;
    }
    // 関数呼び出し
    cout<<"Output(Swaped)::"<<endl;
    swap(arr);
    return 0;
}

実行結果

出力を見ると、3×3配列の上三角部分が下三角部分と入れ替えられていることが確認できます。

Input::
1 2 3
4 5 6
7 8 9
Output(Swaped)::
1 4 7
2 5 8
3 6 9

解説

このプログラムでは、#define n 3 によって行列のサイズを3に固定しています。swap() 関数の中では、まず二重ループを使って arr[i][j]arr[j][i] の値を一時変数 temp を介して交換します。この処理により、行と列が入れ替わり、結果として行列の転置が得られます。

計算量は n×n の行列に対して O(n²) となり、追加の配列を必要としないため、メモリ効率も良好です。サイズの異なる正方行列にも応用できるので、ぜひ n の値を変更して試してみてください。

  1. C++で解く対角トラバースII:リストのリストを対角順に出力する方法

    問題の概要 「リストのリスト」である nums が与えられたとき、そのすべての要素を対角順(ダイアゴナルオーダー)に並べて出力するのがこの問題の目的です。 たとえば、次のような行ごとに長さの異なる配列(ジャグ配列)が入力として与えられた場合を考えてみましょう。 このとき、期待される出力は次のとおりです。 [1, 6, 2, 8, 7, 3, 9, 4, 12, 10, 5, 13, 11, 14, 15, 16] 解法のアプローチ この問題は、各要素を「値と座標のセット」として一旦記録し、対角線ごとの順序になるようにソートし直すことで解けます。具体的な手順は以下の通りです。 結果を格納す

  2. C++での2次元行列のジグザグ(対角)トラバーサルの実装方法

    問題の概要 この記事では、2次元行列(マトリックス)のすべての要素を対角線に沿った順序、いわゆる「ジグザグ(対角)トラバーサル」で出力する方法を解説します。 まず、具体例を使って問題を理解しましょう。次のような3×3の行列が与えられたとします。 1 2 3 4 5 6 7 8 9 出力 − 1 4 2 7 5 3 8 6 9 対角トラバーサルのパターン 行列をジグザグ形式で出力する際には、どのようなパターンで要素が並ぶのでしょうか。下の図のように、要素は左下から右上へ向かう斜めのラインごとに順番に出力されます。