Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

C++ Matrix Solver

  1. Feb 7, 2008 #1
    I just thought I'd post this here. It will help you solve a matrix by getting it into row-echelon form (well, close to it anyway). I avoided global variables and tried to make it as expandable as possible.

    Code (Text):
    #include <iostream>
    using namespace std;

    void output(int height, int width, long int * matrix)
    {
        cout<<"__________________"<<endl;
        long int (*matrix2)[width];
        matrix2=(long int (*)[width]) matrix;
        int row_temp;
        int column_temp;
        for (row_temp=0;row_temp<height;row_temp++) {
            for (column_temp=0;column_temp<width;column_temp++) {
                cout<<matrix2[row_temp][column_temp]<<" ";
            }
            cout<<endl;
        }
    }

    void switch_rows(int row1, int row2, int width, long int * matrix)
    {
        long int (*matrix2)[width];
        matrix2=(long int (*)[width]) matrix;
        int temp;
        int column_temp;
        for (column_temp=0;column_temp<width;column_temp++) {
            temp=matrix2[row1][column_temp];
            matrix2[row1][column_temp]=matrix2[row2][column_temp];
            matrix2[row2][column_temp]=temp;
        }
    }

    void multiply_row(int row, long int multiple, int width, long int * matrix)
    {
        long int (*matrix2)[width];
        matrix2=(long int (*)[width]) matrix;
        int column_temp;
        for (column_temp=0;column_temp<width;column_temp++) {
            matrix2[row][column_temp]=matrix2[row][column_temp]*multiple;
        }
    }

    void add_rows(int row1, int row2, int width, long int * matrix)
    {
        long int (*matrix2)[width];
        matrix2=(long int (*)[width]) matrix;
        int temp;
        int column_temp;
        for (column_temp=0;column_temp<width;column_temp++) {
            matrix2[row1][column_temp]=matrix2[row1][column_temp]+matrix2[row2][column_temp];
        }
    }

    void add_multiple_of_row(int row1, int row2, long int multiple, int width, long int * matrix)
    {
        long int (*matrix2)[width];
        matrix2=(long int (*)[width]) matrix;
        int temp;
        int column_temp;
        for (column_temp=0;column_temp<width;column_temp++) {
            matrix2[row1][column_temp]=matrix2[row1][column_temp]+(matrix2[row2][column_temp]*multiple);
        }
    }

    int reduce_column(int column, int block_rows_until, int height, int width, long int * matrix)
    {
        long int (*matrix2)[width];
        matrix2=(long int (*)[width]) matrix;
        int row_temp;
        int column_temp;
        int temp;
        int selected_row=-1;
        for (row_temp=(height-1);row_temp>=block_rows_until;row_temp--) {
            if (matrix2[row_temp][column]!=0) {
                selected_row=row_temp;
            }
        }
        if (selected_row==-1) {
            return block_rows_until;
        }
        switch_rows(block_rows_until, selected_row, width, matrix);
        for (row_temp=block_rows_until+1;row_temp<height;row_temp++) {
            if (matrix2[row_temp][column]!=0) {        
                output(height, width, matrix);
                temp=matrix2[row_temp][column];
                multiply_row(row_temp, matrix2[block_rows_until][column], width, matrix);
                output(height, width, matrix);
                add_multiple_of_row(row_temp, block_rows_until, -(temp), width, matrix);
            }
        }
        block_rows_until++;
        return block_rows_until;
       
    }

    int main()
    {
        int width;
        int height;
        cout<<"Height? ";
        cin>>height;
        cout<<"Width? ";
        cin>>width;
        cout<<"Enter in the matrix row by row with entries separated by space:"<<endl;
        long int matrix[height][width];
        int row_temp;
        int column_temp;
        for (row_temp=0;row_temp<height;row_temp++) {
                for (column_temp=0;column_temp<width;column_temp++) {
                cin>>matrix[row_temp][column_temp];
            }
        }
        long int * matrix_transfer;
        matrix_transfer=(long int *) matrix;
        int current_row=0;
        int current_column=0;
        int solved=0;
        while (solved!=1) {
            current_row=reduce_column(current_column, current_row, height, width, matrix_transfer);
            current_column++;
            if (current_row==(height-1)) {solved=1;}
            if (current_column==(width-1)) {solved=1;}
        }
        output(height, width, matrix_transfer);
        return 0;
    }
     
  2. jcsd
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Can you help with the solution or looking for help too?
Draft saved Draft deleted



Similar Discussions: C++ Matrix Solver
Loading...