我试图编写代码,从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。