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".
當你運行代碼時會發生什麼? Stacktrace /輸出? –
它會打印出矩陣中的讀數,但只是空白處,我希望其他值會是 – user3045590
您的程序終止了嗎?還是隻是繼續運行? –