我试图编写代码,从nxn矩阵中读取值,然后将这些值打印出来。我想我已经成功做到了。我尝试的下一步是使用高斯消除法求解矩阵,但是我无法获得代码以打印出值。有人可以看看这个,然后告诉我我要去哪里了吗?

  #include <cstdlib>
  #include <cmath>
  #include <vector>
  #include <iostream>
  #include <fstream>
  #include <string>

  using namespace std;


   int main(){
   //create a 2D vector of doubles
   vector< vector< double > > matrix;


    int num_lines = 0;
    double temporary, r;
    int i, j, k, dimension, temp; /* counter variables for loops */




    // Open a file containing the matrix data
    ifstream myFile("test_data2.txt");
    // Check if file is open
    if(myFile.is_open()){
    // First step is to detect matrix size by assuming matrix is
    // square and counting number of columns.

    // Tempoary variable to hold current line to process
    string line;

    // Tempoary variable to hold number of rows and cols in square matrix
    int num_lines = 0;

    // Count rows / cols
    while(getline(myFile, line)){
        num_lines ++;
    }

    // Reset EOF flag
    myFile.clear();

    // Reset to start of file
    myFile.seekg(0, myFile.beg);

    // Second step is to grab lines from the file and process them
    // splitting each line into substrings and converting them into
    // doubles

    // For each line
    for(int l = 0; l < num_lines; l ++){
        // Process line by line
        getline(myFile, line);

        // Tempoary vector to hold rows of matrix data
        vector<double> temp;

        // Tempoary variable to hold search positions
        int start = 0;
        int end;
        int length;

        // Get value by value
        for(int n = 0; n < num_lines; n ++){
            // Break line down by finding commas
            end = line.find(',', start);
            length = end - start;

            // Extract substring
            string tempstr = line.substr(start, length);

            // Set next value of start
            start = end + 1;

            // Convert to double
            temp.push_back(atof(tempstr.c_str()));
        }

        // Add row to matrix
        matrix.push_back(temp);
    }
    // Close input file
    myFile.close();
} else {
    // If input file failed to open, print an error
    cout << "Error opening input file" << endl;
}
// Print out the matrix (will do nothing if input file open failed)
cout << "Print out input file." << endl;

for(int i = 0; i < matrix.size(); i ++)
{
    for(int j = 0; j < matrix[i].size(); j ++)
    {
        cout << matrix[i][j];
        // Add commas and new lines when required
        // Remember not to add commas after rightmost values, or
        // a new line at the end of the last value
        if(j < matrix[i].size() - 1)
        {
            cout << ' '; // Character, not string
        }
        else
        {
            if(i < matrix[i].size() - 1)
            {
                cout << '\n'; // Character, not string
            }
        }
    }
}






 for (i = 0; i < num_lines; i++)
    for (j = num_lines; j < 2 * num_lines; j++)
        if (i == j % num_lines)
            matrix[i][j] = 1;
        else
            matrix[i][j] = 0;

  /* using gauss-jordan elimination */
  for (j = 0; j < num_lines; j++) {
    temp = j;

    /* finding maximum jth column element in last (dimension-j) rows */
    for (i = j + 1; i < num_lines; i++)
        if (matrix[i][j] > matrix[temp][j])
            temp = i;



    /* swapping row which has maximum jth column element */
    if (temp != j)
        for (k = 0; k < 2 * num_lines; k++) {
            temporary = matrix[j][k];
            matrix[j][k] = matrix[temp][k];
            matrix[temp][k] = temporary;
        }

      /* performing row operations to form required identity matrix out of the input              matrix */
    for (i = 0; i < num_lines; i++)
        if (i != j) {
            r = matrix[i][j];
            for (k = 0; k < 2 * num_lines; k++)
                matrix[i][k] -= matrix[j][k] * r / matrix[j][j];
        } else {
            r = matrix[i][j];
            for (k = 0; k < 2 * dimension; k++)
                matrix[i][k] /= r;
        }
   }

   /* Display augmented matrix */
   printf("\n After Gauss-Jordan elimination, augmented matrix is : \n\n");

  for (i = 0; i < num_lines; i++) {
     for (j = 0; j < 2 * num_lines; j++)
        printf("  %4.2f", matrix[i][j]);
      printf("\n");
   }


   /* displaying inverse of the non-singular matrix */
   printf("\n\n\n The inverse of the entered non-singular matrix is : \n\n");

    for (i = 0; i < num_lines; i++) {
    for (j = num_lines; j < 2 * num_lines; j++)
        printf("  %.5f", matrix[i][j]);
    printf("\n");
  }


 return 0;
  }

    // EXAMPLE FILE
    //1,2,3
    //4.5,6.7,8.8
    //-110,-55.3,+53.723
    // END OF EXAMPLE FILE REMOVE COMMENTS AT TOP AND BOTTOM AND "//" characters before    use. Save as "matrix.csv".

最佳答案

错误1:

您声明

 int num_lines = 0;


在 - 的里面

 if(myFile.is_open())


块。因此,“ num_lines ++”行会在

 while(getline(....) )


循环,但随后未声明num_lines(第二个循环),并且所有循环(高斯消除和打印)仅迭代零次。

删除第二个num_lines声明。

错误2:

“维度”变量永远不会初始化。从逻辑上讲,它应该等于“ num_lines”。

错误3:

'matrix'变量未正确初始化。您在那里推回“临时”向量,但长度仅为“ num_lines”,而不是“ num_lines * 2”。

PS:我不能保证不再有bug。

09-06 12:18