ゆにゅbの~と

不定期更新

C++で余因数展開を用いた行列式の計算

線形代数のレポート課題でこんな課題が……

4次元行列の行列式を”途中式付きで”、”余因数展開を用いて”求めよ。

手計算でよるのは面倒すぎる……そこで、C++によってパソコンで求めてくれるプログラムを作成!もちろん計算過程も出力します。

これで、パソコンが求めてくれた答えをレポート用紙に写すだけで良し!!!

ソースコード

#include<bits/stdc++.h>
using namespace std;

//cofactor expansion ver
int det(vector<vector<int>> a){
    int res=0;
    if(a.size() == 2){
        res =  a[0][0] * a[1][1] - a[0][1] * a[1][0];
        for (auto &&i : a)
        {
            for (auto &&e : i)
            {
                cout << e << " ";
            }
            cout << endl;
        }
        cout << "=" << res << endl << endl;
        return res;
    }
    for(int i = 0; i < a.size(); i++){
        vector<vector<int>> v = a;
        v.erase(v.begin());
        for(int j = 0; j < v.size(); j++){
            v[j].erase(v[j].begin() + i);
        }
        int op;
        if(i%2) op = -1;
        else op = 1;
        res += op * a[0][i] * det(v);
    }
    for (auto &&i : a)
    {
        for (auto &&e : i)
        {
            cout << e << " ";
        }
        cout << endl;
    }
    cout << "=" << res << endl << endl;
    return res;
}

int main(){
    //N次行列
    cout << "N>";
    int n; cin >> n;
    //行列の中身を入力
    cout << "Matrix>\n";
    vector<vector<int>> v(n, vector<int>(n));
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cin >> v[i][j];
        }
    }
    cout << det(v) << endl;
    return 0;
}

あとは、これをコンパイルして、行列の要素を入力するだけ。簡単でしょ。

こんなのを書くより、手計算で求めた方が速いって?キコエナイキコエナイ大事なのはロマンです?