在 C++ 中以行减少形式求解简单矩阵

use*_*531 6 c++ arrays matrix

好的,我正在拔掉我所有的头发,但是,作为菜鸟,我确定存在几个问题。我想要一个矩阵,并通过执行基本的行操作,将其减少为行减少的梯形形式。我们假设(1)它是可解的,(2)一个唯一的解。没有检查零或任何东西;它只执行行操作。这是代码:

#include <iostream>
#include <cstdlib>

using namespace std;

void printmatrix(float A[][4]);
void RowReduce (float A[][4]);

int main() {

    // answer should be { 2, 4, -3 }
    float A[3][4] = {
        { 5, -6, -7,   7 },
        { 3, -2,  5, -17 },
        { 2,  4, -3,  29 }
    };

    printmatrix(A);
    RowReduce(A);

}

// Outputs the matrix
void printmatrix(float A[][4]) { 

    int p = 3;
    int q = 4;

    for (int i = 0; i < p; i++) {
        for (int j = 0; j < q; j++) {
            cout << A[i][j] << " ";
        }
        cout << endl;
    } 

}

void RowReduce (float A[][4]){

    //rows
    int p = 3;  
    //columns
    int q = 4;  

    // the determines the column we are at which holds the diagonal,
    // the basis for all elimination above and below
    int lead = 0; 

    cout << endl;
    while ( lead < q - 1 ) {

        // for each row . . .
        for (int i = 0; i < p; i++)  {

            // ignore the diagonal, and we will not have a tree rref
            // as the diagonal will not be divided by itself. I can fix that.
            if ( i != lead )  {

                cout << A[lead][lead] << "  " << A[i][lead];

                for (int j = 0; j < q; j++) {

                    //here is the math . . . . probably where the problem is?
                    A[i][j]    = A[lead][lead] * A[i][j]; 
                    A[i][lead] = A[i][lead]    * A[lead][j];
                    A[i][j]    = A[i][j]       - A[i][lead];

                }

                cout << endl;

            }
        }

        // now go to the next pivot
        lead++;  
        cout << endl;

    }

}
Run Code Online (Sandbox Code Playgroud)

我尝试手动完成,但我得到的当然是正确的答案,但这得到了一个对角矩阵——这很好——但答案是错误的!

ser*_*gej 7

您代码中的主要错误是您在 for 循环中计算除数或乘数。您应该在迭代单元格之前计算它们。

提示:如果代码格式正确并且变量具有有意义的名称,调试会更容易。

见实现RowReduce()

#include <iostream>
#include <cstdlib>
#include <iomanip>

using namespace std;

void printmatrix(float A[][4]);
void RowReduce(float A[][4]);

int main()
{
    float A[3][4] = {{5, -6, -7,   7},
                     {3, -2,  5, -17},
                     {2,  4, -3,  29}}; //answer should be {2, 4, -3}

    printmatrix(A);
    RowReduce(A);
}

void printmatrix(float A[][4]) // Outputs the matrix
{
    int p=3;
    int q=4;

    for (int i=0; i<p; i++) {
            for (int j=0; j<q; j++) {
                    cout << setw(7) << setprecision(4) << A[i][j] << " ";
            }
            cout << endl;
    }

    cout << endl;
}

void RowReduce(float A[][4])
{
    const int nrows = 3; // number of rows
    const int ncols = 4; // number of columns

    int lead = 0; 

    while (lead < nrows) {
        float d, m;

        for (int r = 0; r < nrows; r++) { // for each row ...
            /* calculate divisor and multiplier */
            d = A[lead][lead];
            m = A[r][lead] / A[lead][lead];

            for (int c = 0; c < ncols; c++) { // for each column ...
                if (r == lead)
                    A[r][c] /= d;               // make pivot = 1
                else
                    A[r][c] -= A[lead][c] * m;  // make other = 0
            }
        }

        lead++;
        printmatrix(A);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

  5      -6      -7       7 
  3      -2       5     -17 
  2       4      -3      29 


  1    -1.2    -1.4     1.4 
  0     1.6     9.2   -21.2 
  0     6.4    -0.2    26.2 

  1       0     5.5   -14.5 
  0       1    5.75  -13.25 
  0       0     -37     111 

  1       0       0       2 
  0       1       0       4 
  0       0       1      -3
Run Code Online (Sandbox Code Playgroud)