關於行列式求值問題
我用的是餘因子方式處理,
有用到 recursive,
由於餘因子有點麻煩,
所以我額外又寫了一個
MCOF 函數,以求餘因子矩陣,
同時為加快程式運作,我多寫了 MDET2, MDET3 函式
函式說明如下

1. MCOF        取得aij 之餘因子
2. MDET2       計算2階行列式之值
3. MDET3       計算3階行列式之值
4. MDET4       計算多階行列式之值

若對函式有問題或程式碼有問題
歡迎回覆討論

// =======================================
// author  : edison.shih.
// filename: matrix.cpp
// date    : 2010/2/7
// mail    : forget72@hotmail.com
// ** all copyright reverve **
// =======================================

// 餘因子矩陣
void MCOF(double **a,
          double **cof_ij,
          unsigned row,
          unsigned col,
          unsigned dim_a)
{
    unsigned i=0, j=0;
    unsigned ii=0, jj=0;
    for(i=0; i<dim_a; i++){
        if(i==row) continue;
        for(j=0; j<dim_a; j++){
            if(j==col) continue;
            cof_ij[ii][jj] = a[i][j];
            jj++;
        }
        ii++;
        jj=0;
    }
}

// ==============================
// 求2階矩陣 determinte
double MDET2(double **a)
{
    return (a[0][0]*a[1][1] - a[0][1]*a[1][0]);
}


// ==============================
// 求3階矩陣 determinte
double MDET3(double **a)
{
    double x=0.0, y=0.0, z=0.0;
    x = a[0][0] * (a[1][1]*a[2][2]-a[1][2]*a[2][1]);
    y = a[1][0] * (a[0][1]*a[2][2]-a[0][2]*a[2][1]);
    z = a[2][0] * (a[0][1]*a[1][2]-a[0][2]*a[1][1]);
    return (x-y+z);
}

// ==============================
// 求矩陣 determinte
double MDET(double **a,
            unsigned dim)
{
    unsigned i;
    double x = 0.0;
    double sum = 0.0;
   
    double **b = (double**)malloc(sizeof(double*)*dim);   
    for( i=0; i<dim; i++) b[i] = (double*)malloc(sizeof(double)*dim);
   
    if(dim==1) return a[0][0];
    if(dim==2) return MDET2(a);
    if(dim==3) return MDET3(a);   
    for(i=0; i<dim ; i++)
    {
        MCOF(a, b, 0, i, dim);       
        if(i % 2 == 0) x =1.0;
        else x = -1.0;
        sum += a[0][i] * MDET(b, dim - 1 ) * x;
    }
    for(i=0;i<dim;i++) free(b[i]);
    free(b);
    return sum;   
}

arrow
arrow
    全站熱搜

    Edison 發表在 痞客邦 留言(2) 人氣()