300分,请高手给出(求4行4列逆矩阵的算法)!
谢谢了,各位兄弟!

解决方案 »

  1.   

    高斯约旦法
    void swap(double &a,double &b){
      double temp;
      temp=a;
      a=b;
      b=temp;
    }
    void inverseMat(double* n,double m[4][4]){//?巣-???
    int is[4]={0,1,2,3};
    int js[4]={0,1,2,3};
    double fDet = 1.0;
    double f =1.0;
    for(int x=0;x<4;x++)
    for(int y=0;y<4;y++)
    m[x][y]=*(n+x*4+y);
    for (int k = 0; k < 4; k ++){ 
    double fMax = 0.0;
    //戞???
    for (int i = k; i < 4; i ++){
    for (int j = k; j < 4; j ++){
    double f = abs(m[i][j]);
    if (f > fMax){
    fMax = f;
    is[k] = i;//?戝?強???
    js[k] = j;//?戝?強???
    }
    }
    }
    if (is[k] != k){//晄??
    f = -f;
    //???
    swap(m[k][0],m[is[k]][0]);
    swap(m[k][1],m[is[k]][1]);
    swap(m[k][2],m[is[k]][2]);
    swap(m[k][3],m[is[k]][3]);
    }
    if (js[k] != k){ //晄???
    f = -f;
    //???
    swap(m[0][k], m[0][js[k]]);
    swap(m[1][k], m[1][js[k]]);
    swap(m[2][k], m[2][js[k]]);
    swap(m[3][k], m[3][js[k]]);
    }
    fDet *= m[k][k];
    m[k][k] = 1.0/m[k][k];
    for (int j= 0;j<4;j++){
    if (j!= k)
    m[k][j] *= m[k][k];
    }
    for (i = 0; i < 4; i ++)
    if (i != k)
    for (int j = 0; j < 4; j ++)
    if (j != k)
    m[i][j] = m[i][j] - m[i][k] * m[k][j];
    for (i = 0; i < 4; i ++){
    if (i != k)
    m[i][k] *= -m[k][k];
    }
    }
    for (k = 3; k >= 0; k --){
    if (js[k] != k){
    swap(m[k][0], m[js[k]][0]);
    swap(m[k][1], m[js[k]][1]);
    swap(m[k][2], m[js[k]][2]);
    swap(m[k][3], m[js[k]][3]);
    }
    if (is[k] != k){
    swap(m[0][k], m[0][is[k]]);
    swap(m[1][k], m[1][is[k]]);
    swap(m[2][k], m[2][is[k]]);
    swap(m[3][k], m[3][is[k]]);
    }
    }
    //cout<<endl<<"the result is "<<fDet*f<<endl;//??幃??
    }
      

  2.   

    楼上兄弟, double f = abs(m[i][j]);
    这个应该用 double f = fabs(m[i][j]);吧?