2013-11-28 54 views
0

我试图编写从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

当你运行代码时会发生什么? Stacktrace /输出? –

+0

它会打印出矩阵中的读数,但只是空白处,我希望其他值会是 – user3045590

+0

您的程序终止了吗?还是只是继续运行? –

回答

1

BUG1:

您声明

int num_lines = 0; 

if(myFile.is_open()) 

块内。因此,“NUM_LINES ++”线在

while(getline(....)) 

循环递增这个变量,但随后NUM_LINES(第二个)被未申报和所有的循环(高斯消去和印刷)只是迭代零次。

删除第二个num_lines声明。

BUG 2:

'dimension'变量永远不会被初始化。从逻辑上讲,它应该等于'num_lines'。

BUG 3:

'矩阵'变量没有正确初始化。你在那里push_back'temp'向量,但是只有'num_lines'长度,而不是'num_lines * 2'。我不能保证没有更多的错误。