Метод инверсии матрицы / обработка 0 в элементе pivot

#c #matrix-inverse

#c #матрица-обратная

Вопрос:

В настоящее время я работаю над реализацией метода инверсии матрицы для класса Matrix в C . Одна вещь, которая не реализована, — это проверка того, когда элемент pivot равен 0, что означает, что мне нужно будет поменять местами его значения с значениями другой приемлемой строки. Я использую элемент diagonal в качестве элемента pivot, если это поможет.

Вот что у меня есть для метода инверсии:

 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 << "nnOriginal 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;
}
  

Как или где я мог бы добавить эту функциональность / проверить?

Спасибо.

Комментарии:

1. Какое выражение в этих подпрограммах вы бы назвали pivot , если бы собирались присвоить ему выделенную переменную?

2. Поскольку я использую диагонали в качестве элементов pivot, я предполагаю, что любое значение T1.el[i] [i] будет соответствовать текущей диагонали и, следовательно, элементу pivot. Итак, я бы добавил проверку на ноль в разделе операций со строками прямо перед вычислением соотношения? Спасибо.

3. Звучит как план, который стоит попробовать. 🙂