1

I'm currently working on a implementing a matrix inversion method for a Matrix class in C++. One thing that isn't implemented is a check for when the pivot element is 0, meaning I will need to swap its values with those of another acceptable row. I am using the diagonal element as the pivot element, if that helps.

Here is what I have for far for the Inversion method:

Matrix Matrix:: invert()
{
    if (rows != cols) {         // Check for square matrix
        cout << "Matrix must be square." << endl;
        exit(1);
    }

    double ratio, sum;
    int i, j, k;
    Matrix T1(rows, cols*2);        // New temp identity matrix of same order
    Matrix F(rows, cols);               // Final Inverted Matrix

   // Add Identity Matrix
    for(i = 1; i <= rows; i++){
        for(j = rows; j <= 2*rows; j++){
            if(i == (j-cols)){
                T1.el[i][j] = 1.0;
            }
            else
                T1.el[i][j] = 0.0;
        }
    }

    // Add original Matrix to 1st half of Temp Matrix
    for (i = 1; i <=rows; i++) {       
        for(j=1;j<=rows; j++) {
            T1.el[i][j] = el[i][j];
        }
    }

    cout << "\n\nOriginal matrix with added Identity Matrix" << endl;
    for (i = 1; i <=rows; i++) {
        cout << setw(5);
        for(j=1;j<=rows*2; j++) {
            cout << T1.el[i][j] << setw(6);
        }
        cout << endl;
    }

    // Row Operations
    for(i = 1; i <= rows; i++){
        for(j = 1; j <= rows; j++){
            if(i != j) {
                ratio = T1.el[j][i]/T1.el[i][i];
                for(k = 1; k <= 2*rows; k++) {
                    T1.el[j][k] -= ratio * T1.el[i][k];
                }
            }
        }
    }

    // backwards substitutions
    for(i = 1; i <= rows; i++){
        sum = T1.el[i][i];
        for(j = i+1; j <= 2*rows; j++){
            T1.el[i][j] /= sum;
        }
    }

    // Copy to return Matrix
    for(i=1; i<=rows; i++){
        for (j=1; j<=rows; j++) {
           F.el[i][j] = T1.el[i][j+cols];
        }
    }  

    return F;
}

How or where would I go about adding this functionality/check?

Thanks.

  • Which expression in these routines would you name `pivot`, if you were going to give it a dedicated variable? – sarnold Nov 06 '11 at 22:51
  • Since I using the diagonals as the pivot elements, I assume that any value of T1.el[i][i] would correspond to the current diagonal and hence pivot element. So would I add a check for zero in the row operations section right before computing the ratio? Thanks. – Green Arrow Nov 07 '11 at 05:43
  • Sounds like a plan worth trying. :) – sarnold Nov 07 '11 at 05:46

0 Answers0