關於行列式求值問題
我用的是餘因子方式處理,
有用到 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;
}