C++ における行列演算

C++Beginner
オンラインで実践に進む

はじめに

この実験では、C++ プログラミングを使って、与えられた 2 次元配列に対して加算、減算、乗算などの様々な行列演算を行う方法を学びます。また、配列を効果的に操作して使用する方法も学びます。

C++ プログラムファイルの作成

~/project ディレクトリに matrix_operations.cpp という名前の新しいファイルを作成します。これは、ターミナルで次のコマンドを使用して行うことができます。

touch ~/project/matrix_operations.cpp

必要なライブラリの読み込みとメイン関数の設定

C++ プログラムの最初のステップは、入出力操作とコンソールのクリアに必要なライブラリをインクルードすることです。その後、C++ プログラムのメイン関数を設定します。次のコードをテンプレートとして使用できます。

#include<iostream.h>
#include<conio.h>

int main()
{
    clrscr();
    // ここにあなたのコードを記述します
    getch();
    return 0;
}

2 つの行列の加算

このステップでは、2 つの行列の加算を行うケースを作成します。C++ プログラムは、ユーザーに 2 つの行列の次数または次元(必ず m*no*p でなければなりません)を入力するように求めます。

行列の次元が同じでない場合、プログラムはエラーメッセージを返します。その後、行列の要素を入力して加算します。最終的なコードは次のようになります。

//ADDITION
case 1:
    cout<<"\n行列 a の次数を入力してください (必ず m*n でなければなりません): "<<endl;
    cin>>m;
    cout<<"* \n";
    cin>>n;
    cout<<"行列 b の次数を入力してください (必ず o*p でなければなりません): "<<endl;
    cin>>o;
    cout<<"* \n";
    cin>>p;
    if (m==o&&n==p)
    {
        cout<<"加算可能です "<<endl;
    }
    else
    {
        cout<<"加算不可能です ";
        l=0;
    }

    if(l)
    {
        cout<<"\n\n行列 1 の要素を入力してください:"<<endl;
        for (i=1;i<=m;i++)
        {
            for (j=1;j<=n;j++)
                cin>>a[i][j];
        }
        cout<<"行列 1 の要素は:";
        for (i=1;i<=m;i++)
        {
            cout<<endl;
            for (j=1;j<=n;j++)
                cout<<a[i][j]<<" ";
        }
        cout<<"\n行列 2 の要素を入力してください:"<<endl;
        for (i=1;i<=o;i++)
        {
            for (j=1;j<=p;j++)
                cin>>b[i][j];
        }
        cout<<"行列 2 の要素は:";
        for (i=1;i<=o;i++)
        {
            cout<<endl;
            for (j=1;j<=p;j++)
                cout<<b[i][j]<<" ";
        }
        cout<<"\n\n\n加算:\nc=a+b=";
        for (i=1;i<=m;i++)
        {
            for (j=1;j<=n;j++)
            {
                c[i][j]=a[i][j]+b[i][j];
            }
        }
        for (i=1;i<=m;i++)
        {
            cout<<endl;
            for (j=1;j<=n;j++)
                cout<<c[i][j]<<" ";
        }
    }
    break;

2 つの行列の減算

このステップでは、2 つの行列の減算を行うケースを作成します。C++ プログラムは、ユーザーに 2 つの行列の次数または次元(必ず m*no*p でなければなりません)を入力するように求めます。

行列の次元が同じでない場合、プログラムはエラーメッセージを返します。その後、行列の要素を入力して減算します。最終的なコードは次のようになります。

//SUBTRACTION
case 2:
    cout<<"\n行列 a の次数を入力してください (必ず m*n でなければなりません): "<<endl;
    cin>>m;
    cout<<"* \n";
    cin>>n;
    cout<<"行列 b の次数を入力してください (必ず o*p でなければなりません): "<<endl;
    cin>>o;
    cout<<"* \n";
    cin>>p;
    if (m==o&&n==p)
    {
        cout<<"減算可能です "<<endl;
    }
    else
    {
        cout<<"減算不可能です ";
        l=0;
    }

    if(l)
    {
        cout<<"\n\n行列 1 の要素を入力してください:"<<endl;
        for (i=1;i<=m;i++)
        {
            for (j=1;j<=n;j++)
                cin>>a[i][j];
        }
        cout<<"行列 1 の要素は:";
        for (i=1;i<=m;i++)
        {
            cout<<endl;
            for (j=1;j<=n;j++)
                cout<<a[i][j]<<" ";
        }
        cout<<"\n行列 2 の要素を入力してください:"<<endl;
        for (i=1;i<=o;i++)
        {
            for (j=1;j<=p;j++)
                cin>>b[i][j];
        }
        cout<<"行列 2 の要素は:";
        for (i=1;i<=o;i++)
        {
            cout<<endl;
            for (j=1;j<=p;j++)
                cout<<b[i][j]<<" ";
        }
        cout<<"\n\n\n減算:\nc=a-b=";
        for (i=1;i<=m;i++)
        {
            for (j=1;j<=n;j++)
            {
                c[i][j]=a[i][j]-b[i][j];
            }
        }
        for (i=1;i<=m;i++)
        {
            cout<<endl;
            for (j=1;j<=n;j++)
                cout<<c[i][j]<<" ";
        }
    }
    break;

2 つの行列の乗算

このステップでは、2 つの行列の乗算を行うケースを作成します。C++ プログラムは、ユーザーに 2 つの行列の次数または次元(必ず m*no*p でなければなりません)を入力するように求めます。

行列の次元が互換性がない場合、プログラムはエラーメッセージを返します。その後、行列の要素を入力して乗算します。最終的なコードは次のようになります。

//MULTIPLICATION
case 3:
    cout<<"\n行列 a の次数を入力してください (必ず m*n でなければなりません): "<<endl;
    cin>>m;
    cout<<"* \n";
    cin>>n;
    cout<<"行列 b の次数を入力してください (必ず o*p でなければなりません): "<<endl;
    cin>>o;
    cout<<"* \n";
    cin>>p;
    if (n==o)
    {
        cout<<"乗算可能です "<<endl;
    }
    else
    {
        cout<<"乗算不可能です ";
        l=0;
    }

    if(l)
    {
        cout<<"\n\n行列 1 の要素を入力してください:"<<endl;
        for (i=1;i<=m;i++)
        {
            for (j=1;j<=n;j++)
                cin>>a[i][j];
        }
        cout<<"行列 1 の要素は:";
        for (i=1;i<=m;i++)
        {
            cout<<endl;
            for (j=1;j<=n;j++)
                cout<<a[i][j]<<" ";
        }
        cout<<"\n行列 2 の要素を入力してください:"<<endl;
        for (i=1;i<=o;i++)
        {
            for (j=1;j<=p;j++)
                cin>>b[i][j];
        }
        cout<<"行列 2 の要素は:";
        for (i=1;i<=o;i++)
        {
            cout<<endl;
            for (j=1;j<=p;j++)
                cout<<b[i][j]<<" ";
        }
        cout<<"\n\n\n乗算:\nc=aXb=";
        for (i=1;i<=m;i++)
        {
            for (j=1;j<=p;j++)
            {
                c[i][j]=0;
                for (int k=1;k<=n;k++)
                {
                    c[i][j]=c[i][j]+(a[i][k]*b[k][j]);
                }
            }
        }
        for (i=1;i<=m;i++)
        {
            cout<<endl;
            for (j=1;j<=p;j++)
                cout<<c[i][j]<<" ";
        }
    }
    break;

C++ プログラムの実行

次のコマンドをターミナルで使用してコンパイルすることで、matrix_operations.cpp ファイルを実行できます。

g++ ~/project/matrix_operations.cpp -o matrix && ./matrix

C++ プログラムファイルに使用した名前に置き換える必要がある場合があります。

コードが期待通りの出力を返していると仮定すると、ケース番号(加算は 1、減算は 2、乗算は 3)を求めるプロンプトが表示されるはずです。選択を入力した後、プログラムは選択された演算に基づいて行列の入力を求めます。

完全な C++ プログラムコード

ここに、matrix_operations.cpp プログラムファイルの完全なコードを示します。

#include<iostream.h>
#include<conio.h>

int main()
{
    clrscr();
    int a[50][50],b[50][50],c[50][50],i,j,m,n,o,p,l=1,r;
    cout<<"ケースを入力してください:\n";
    cin>>r;
    switch(r)
    {
        //ADDITION
        case 1:
            cout<<"\n行列 a の次数を入力してください (必ず m*n でなければなりません): "<<endl;
            cin>>m;
            cout<<"*\n";
            cin>>n;
            cout<<"行列 b の次数を入力してください (必ず o*p でなければなりません): "<<endl;
            cin>>o;
            cout<<"*\n";
            cin>>p;
            if (m==o&&n==p)
            {
                cout<<"加算可能です "<<endl;
            }
            else
            {
                cout<<"加算不可能です ";
                l=0;
            }

            if(l)
            {
                cout<<"\n\n行列 1 の要素を入力してください:"<<endl;
                for (i=1;i<=m;i++)
                {
                    for (j=1;j<=n;j++)
                        cin>>a[i][j];
                }
                cout<<"行列 1 の要素は:";
                for (i=1;i<=m;i++)
                {
                    cout<<endl;
                    for (j=1;j<=n;j++)
                        cout<<a[i][j]<<" ";
                }
                cout<<"\n行列 2 の要素を入力してください:"<<endl;
                for (i=1;i<=o;i++)
                {
                    for (j=1;j<=p;j++)
                        cin>>b[i][j];
                }
                cout<<"行列 2 の要素は:";
                for (i=1;i<=o;i++)
                {
                    cout<<endl;
                    for (j=1;j<=p;j++)
                        cout<<b[i][j]<<" ";
                }
                cout<<"\n\n\n加算:\nc=a+b=";
                for (i=1;i<=m;i++)
                {
                    for (j=1;j<=n;j++)
                    {
                        c[i][j]=a[i][j]+b[i][j];
                    }
                }
                for (i=1;i<=m;i++)
                {
                    cout<<endl;
                    for (j=1;j<=n;j++)
                        cout<<c[i][j]<<" ";
                }
            }
            break;

        //SUBTRACTION
        case 2:
            cout<<"\n行列 a の次数を入力してください (必ず m*n でなければなりません): "<<endl;
            cin>>m;
            cout<<"*\n";
            cin>>n;
            cout<<"行列 b の次数を入力してください (必ず o*p でなければなりません): "<<endl;
            cin>>o;
            cout<<"*\n";
            cin>>p;
            if (m==o&&n==p)
            {
                cout<<"減算可能です "<<endl;
            }
            else
            {
                cout<<"減算不可能です ";
                l=0;
            }

            if(l)
            {
                cout<<"\n\n行列 1 の要素を入力してください:"<<endl;
                for (i=1;i<=m;i++)
                {
                    for (j=1;j<=n;j++)
                        cin>>a[i][j];
                }
                cout<<"行列 1 の要素は:";
                for (i=1;i<=m;i++)
                {
                    cout<<endl;
                    for (j=1;j<=n;j++)
                        cout<<a[i][j]<<" ";
                }
                cout<<"\n行列 2 の要素を入力してください:"<<endl;
                for (i=1;i<=o;i++)
                {
                    for (j=1;j<=p;j++)
                        cin>>b[i][j];
                }
                cout<<"行列 2 の要素は:";
                for (i=1;i<=o;i++)
                {
                    cout<<endl;
                    for (j=1;j<=p;j++)
                        cout<<b[i][j]<<" ";
                }
                cout<<"\n\n\n減算:\nc=a-b=";
                for (i=1;i<=m;i++)
                {
                    for (j=1;j<=n;j++)
                    {
                        c[i][j]=a[i][j]-b[i][j];
                    }
                }
                for (i=1;i<=m;i++)
                {
                    cout<<endl;
                    for (j=1;j<=n;j++)
                        cout<<c[i][j]<<" ";
                }
            }
            break;

        //MULTIPLICATION
        case 3:
            cout<<"\n行列 a の次数を入力してください (必ず m*n でなければなりません): "<<endl;
            cin>>m;
            cout<<"*\n";
            cin>>n;
            cout<<"行列 b の次数を入力してください (必ず o*p でなければなりません): "<<endl;
            cin>>o;
            cout<<"*\n";
            cin>>p;
            if (n==o)
            {
                cout<<"乗算可能です "<<endl;
            }
            else
            {
                cout<<"乗算不可能です ";
                l=0;
            }

            if(l)
            {
                cout<<"\n\n行列 1 の要素を入力してください:"<<endl;
                for (i=1;i<=m;i++)
                {
                    for (j=1;j<=n;j++)
                        cin>>a[i][j];
                }
                cout<<"行列 1 の要素は:";
                for (i=1;i<=m;i++)
                {
                    cout<<endl;
                    for (j=1;j<=n;j++)
                        cout<<a[i][j]<<" ";
                }
                cout<<"\n行列 2 の要素を入力してください:"<<endl;
                for (i=1;i<=o;i++)
                {
                    for (j=1;j<=p;j++)
                        cin>>b[i][j];
                }
                cout<<"行列 2 の要素は:";
                for (i=1;i<=o;i++)
                {
                    cout<<endl;
                    for (j=1;j<=p;j++)
                        cout<<b[i][j]<<" ";
                }
                cout<<"\n\n\n乗算:\nc=aXb=";
                for (i=1;i<=m;i++)
                {
                    for (j=1;j<=p;j++)
                    {
                        c[i][j]=0;
                        for (int k=1;k<=n;k++)
                        {
                            c[i][j]=c[i][j]+(a[i][k]*b[k][j]);
                        }
                    }
                }
                for (i=1;i<=m;i++)
                {
                    cout<<endl;
                    for (j=1;j<=p;j++)
                        cout<<c[i][j]<<" ";
                }
            }
            break;
        // default case
        default:
            cout<<"誤った選択です";
    }
    getch();
    return 0;
}

まとめ

この実験では、C++ プログラミングを使って、与えられた 2 次元配列に対して様々な行列演算を行う方法を学びました。また、配列を操作して使用する方法も学びました。これで、C++ プログラミングにおける行列の仕組みを十分に理解しているはずです。