Tuesday, July 16, 2013

How to find inverse Matrix using C++

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define siz 100

int det(int a[siz][siz], int n){
    int res = 0;
    int b[siz][siz];

    if(n==1) return a[1][1];
    else if(n==2) return a[1][1]*a[2][2]-a[1][2]*a[2][1];
    else {
        int t, s;
        for(int k=1; k<=n; k++){
            t = s = 1;
            for(int i=2;i<=n;i++){
                for(int j=1;j<=n;j++)
                    if(j==k) continue;
                    else b[t][s++] = a[i][j];
                t++;
                s=1;
            }
            res += (pow(-1,1+k)*a[1][k]*det(b,n-1));
        }
        return res;
    }
}

int main()
{
    int n;
    int a[siz][siz], transpose[siz][siz];
    freopen("input.txt","r",stdin);
    while(cin>>n){

        //taking input
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                cin>>a[i][j];

        puts("Input Matrix:");
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++)
                cout<<a[i][j]<<" ";
            puts("");
        }
        int res = det(a, n);
        puts("Determinant:");
        cout<<res<<endl;

        //transpose
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                transpose[i][j] = a[j][i];

        //transpose output
        puts("Matrix Transpose:");
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++)
                cout<<transpose[i][j]<<" ";
            puts("");
        }

        int t, s, l = 0;
        int result[siz];
        for(int k=1;k<=n;k++){
            for(int m=1; m<=n;m++){
                t = s = 1;
                int component[siz][siz];
                for(int i=1;i<=n;i++){
                    if(i==k) continue;
                    for(int j=1;j<=n;j++){
                        if(m==j) continue;
                        else component[t][s++] = transpose[i][j];
                    }
                    s = 1;
                    t++;
                }
                result[l++] = det(component, n-1);
            }
        }

        l = 0;
        double inverse[siz][siz];
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i%2==0){
                    if(j%2==0) {
                        inverse[i][j] = result[l++];
                    } else {
                        inverse[i][j] = result[l++]*(-1);
                    }
                } else {
                    if(j%2==0) {
                        inverse[i][j] = result[l++]*(-1);
                    } else {
                        inverse[i][j] = result[l++];
                    }
                }
                inverse[i][j] /= res;
            }
        }

        //inverse output
        puts("Matrix Inverse:");
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++)
                cout<<inverse[i][j]<<" ";
            puts("");
        }
    }
    return 0;
}

No comments:

Post a Comment