VC++ (main.cpp):
#include "stdafx.h" #include <iostream> #include <fstream> #include <string> #include <regex> #include <iomanip> using namespace std; void print(double *Arr, int m) { int i = 0, j = 0; for(i=0;i<m;i++) { for(j=0;j<m;j++) { cout << *(Arr+i*m+j) << setprecision(2) << "\t"; } cout << endl; } } void printInverse(double *Matrix, double *Inverse, int m) { int i = 0, j = 0; for(i=0;i<m;i++) { for(j=0;j<m;j++) { cout << *(Matrix+i*m+j) << setprecision(2) << "\t"; } cout << "|\t"; for(j=0;j<m;j++) { cout << *(Inverse+i*m+j) << setprecision(2) << "\t"; } cout << endl; } } void readfile(string filePath, double *Matrix) { int m = 0, n = 0, i = 0; string lines = ""; string::const_iterator start; match_results<string::const_iterator> matchMatrix; //迭代器 regex regMatrix("([0-9]+)+"); ifstream outputFile(filePath); if (outputFile.is_open()) //Check File { while(outputFile.good()) { getline(outputFile, lines); start = lines.begin(); while (regex_search(start, lines.cend(), matchMatrix, regMatrix)) { *(Matrix+i) = atof(matchMatrix[1].str().c_str()); i++; start = matchMatrix[0].second; } m++; } outputFile.close(); } } double plusnum(double num) { if(num < 0) return -1 * num; return num; } void rowSwap(double *Matrix, int ma, int mb, int m) { int i = 0; double *Temp = new double[m]; for(i=0;i<m;i++) { *(Temp+i) = *(Matrix+ma*m+i); *(Matrix+ma*m+i) = *(Matrix+mb*m+i); *(Matrix+mb*m+i) = *(Temp+i); } } void inverse(double *Matrix, double *Inverse, int m) { int i = 0, j = 0, k = 0; double temp = 0; //*(Matrix + rows * m + columns) 看成 Matrix[rows][columns] for(int i=0; i<m; i++) { for(int j=i+1; j<m; j++) { if(plusnum(*(Matrix + j * m + i)) > plusnum(*(Matrix + i * m + i))) { rowSwap(Matrix, i, j, m); // 互換Matrix矩陣兩行 rowSwap(Inverse, i, j, m); // 互換Inverse矩陣兩行 //cout << "[" << i << "][" << j << "]Swap:" << endl; //printInverse(Matrix, Inverse, m); } } // 消去 for(int j=0; j<m; j++) //第 i 次消去運算,以第 i 行作為主要行,將其上下各行的第 i 列元素化為零 { if(j != i) { // 進行消去運算,將第 i 列上下方的元素化為零 double temp = *(Matrix + j * m + i) / *(Matrix + i * m + i); // 注意此處 k 可從 i+1 開始 //for(int k=i+1; k<m; k++) for(int k=0; k<m; k++) { *(Matrix + j * m + k) -= (*(Matrix + i * m + k) * temp); } // 注意此處 k 要從 0 開始 for(int k=0; k<m; k++) { *(Inverse + j * m + k) -= (*(Inverse + i * m + k) * temp); } //cout << "[" << i << "][" << j << "]Matrix:" << endl; //printInverse(Matrix, Inverse, m); } } } // Matrix 已經是對角矩陣,只要在將其對角線元素化為 1 即可 // 此時僅需對 Inverse 矩陣作運算 //cout << "[" << i << "][" << j << "]Inverse:" << endl; //printInverse(Matrix, Inverse, m); for(int i=0; i<m; i++) { for(int j=0; j<m; j++) { *(Inverse + i * m + j) /= *(Matrix + i * m + i); } //cout << "[" << i << "][" << j << "]Inverse:" << endl; //printInverse(Matrix, Inverse, m); } } int main(int argc, char *argv[]) { const int m = 4; int i = 0, j = 0; double Matrix[m][m] = {}; double Inverse[m][m] = {}; for(i=0;i<m;i++) { for(j=0;j<m;j++) { if(i == j) Inverse[i][j] = 1; else Inverse[i][j] = 0; } } readfile("matrix.txt", &Matrix[0][0]); cout << "Matrix:" << endl; print(&Matrix[0][0], m); inverse(&Matrix[0][0], &Inverse[0][0], m); cout << endl; cout << "Inverse:" << endl; print(&Inverse[0][0], m); system("pause"); return 0; }TEXT (matrix.txt):
說明:
先讀取矩陣數據再利用指標的方式求得n維度反矩陣的解。
沒有留言:
張貼留言