2013-04-01 48 views
2

我必須設計一個算法作爲在矩陣上進行高斯約旦消除的前向消除的擴展。我的程序正在執行並創建數字的對角線,但它們並不全是1。它也不會訪問第一行和第一列來將它們更改爲0。最後一欄,答案應該是這樣的,不會改變。任何想法我可以做些什麼來接近解決方案?高斯 - 約旦消除

#include <cmath> 

using namespace std; 

double BetterForwardElimination(double A[8][9]) 
{ 

//Implements Gaussian elimination with partial pivoting 
//Input: Matrix A[1..n,1..n] and column-vector b[1..n] 
//Output: An equivalent upper-triangular matrix in place ofAand the 
//corresponding right-hand side values in place of the (n+1)st column 

    //size of array 
    int n = 8; 
    //int n = sizeof(A)/sizeof(A[0]); 

for (int i = 1; i<n; i++) 
{ 
    int pivotrow = i; 
    for (int j=i+1; j<n; j++) 
    { 
     if (A[j][i] > A[pivotrow][i]) 
     { 
      pivotrow = j; 
     } 
    } 

    for (int k=i; k<n-1; k++) 
    { 
     swap(A[i][k], A[pivotrow][k]); 
    } 

    for (int j=i+1; j<n; j++) 
    { 
     //int temp = A[j][i]/A[i][i]; 
     for (int k = i; k<n; k++) 
     { 
      A[j][k] = A[j][k] - A[i][k]*(A[j][i]/A[i][i]); 
     } 
     A[i][j] = 0; 
    } 
} 

return A[n][n]; 
} 

我的輸出是這樣的:

1 1 1 1 1 1 1 1 0 
1 2 0 0 0 0 0 0 0 
1 0 3 0 0 0 0 0 0 
1 0 0 4 0 0 0 0 0 
11 0 0 0 5 0 0 0 20 
1 0 0 0 0 1 0 0 34 
1 0 0 0 0 0 1 0 -51 
1 0 0 0 0 0 0 -1 -6 

預期的輸出應該是:

1 0 0 0 0 0 0 0 2 
0 1 0 0 0 0 0 0 3 
0 0 1 0 0 0 0 0 5 
0 0 0 1 0 0 0 0 7 
0 0 0 0 1 0 0 0 -7 
0 0 0 0 0 1 0 0 -5 
0 0 0 0 0 0 1 0 -3 
0 0 0 0 0 0 0 1 -2 
+0

預期產量是多少? – askewchan

+0

@askewchan只是編輯它到第一篇文章 – xtheking

回答

1

基於算法,​​A[j][i] > A[pivotrow][i]|A[j][i]| > |A[pivotrow][i] |,兩個都是絕對值。你的交換功能在哪裏?我不認爲C++有自己的swap(int[][] a, int[][]b)

+0

他使用'std :: swap'沒有什麼錯 - 參數是數組元素,而不是整個數組。 –

1

我剛剛創建了QMatrix類。它使用內置的vector>容器。

可以按如下方式使用它:

#include "QMatrix.h" 
#include <iostream> 

int main(){ 
QMatrix<double> A(3,3,true); 
QMatrix<double> Result = A.inverse()*A; //should give the idendity matrix 

std::cout<<A.inverse()<<std::endl; 
std::cout<<Result<<std::endl; // for checking 
return 0; 
} 

如果你想看看它是如何工作的,反函數的實現如下:

類具有以下字段:

template<class T> class QMatrix{ 
public: 
int rows, cols; 
std::vector<std::vector<T> > A; 

逆()函數:

template<class T> 
QMatrix<T> QMatrix<T>:: inverse(){ 
Identity<T> Id(rows); //the Identity Matrix as a subclass of QMatrix. 
QMatrix<T> Result = *this; // making a copy and transforming it to the Identity matrix 
T epsilon = 0.000001; 
for(int i=0;i<rows;++i){ 
    //check if Result(i,i)==0, if true, switch the row with another 

    for(int j=i;j<rows;++j){ 
     if(std::abs(Result(j,j))<epsilon) { //uses Overloading()(int int) to extract element from Result Matrix 
      Result.replace_rows(i,j+1); //switches rows i with j+1 
     } 
     else break; 
    } 
    // main part, making a triangular matrix 
    Id(i)=Id(i)*(1.0/Result(i,i)); 
    Result(i)=Result(i)*(1.0/Result(i,i)); // Using overloading()(int) to get a row form the matrix 
    for(int j=i+1;j<rows;++j){ 
     T temp = Result(j,i); 
     Result(j) = Result(j) - Result(i)*temp; 
     Id(j) = Id(j) - Id(i)*temp; //doing the same operations to the identity matrix 
     Result(j,i)=0; //not necessary, but looks nicer than 10^-15 
    } 
} 

// solving a triangular matrix 
for(int i=rows-1;i>0;--i){ 
    for(int j=i-1;j>=0;--j){ 
     T temp = Result(j,i); 
     Id(j) = Id(j) - temp*Id(i); 
     Result(j)=Result(j)-temp*Result(i); 
    } 
} 

return Id; 
} 

它的工作正常......但應該有方法來提高其速度而不影響靈活性。