如何用C++寫出算N*N矩陣的反矩陣
希望可以用比較簡單的寫法,這樣我比較好懂~
拜託請附上原始碼,謝謝!!
2006-05-29 17:15:34 · 2 個解答 · 發問者 Anonymous in 電腦與網際網路 ➔ 程式設計
不好意思 忘記說高斯的我已經知道了 是吼還有別的方法呢?
2006-05-31 11:05:05 · update #1
使用的是高斯消去法
遇到奇異點無法處理 出來結果不盡人意 這點你應該明白吧!!
但是我使用MATLAB時他會把這個現象避開
妳自己參考看看吧
int MATRIX_INV( float *ainv, float *a, int k, float *det )
{
/* a = input matrix, n x n
/* ainv = output matrix (the inversion of a)
/* n = actual size of a
/* det = determinant of a
float rtmp, pivot, pivotinv, factor;
int ipass,imax;
int i,j,n;
float mi_tmp[10][10];
n = k;
*det = 1.0;
for( i = 0; i < n; i++ )
{
for( j = 0; j < n; j++ )
{
mi_tmp[i][j]=*(a+i*k+j);
if( i == j ) *(ainv+i*k+j) = 1.0;
else *(ainv+i*k+j) = 0.0;
}
}
for( ipass = 0; ipass < n; ipass++ )
{
imax = ipass;
for( j = ipass; j < n; j++ )
{
if( mi_tmp[j][ipass]*mi_tmp[j][ipass] >
mi_tmp[imax][ipass]*mi_tmp[imax][ipass] ) imax = j;
}
if( imax != ipass )
{
*det *= -1.0;
for( j = 0; j < n; j++)
{
rtmp = *(ainv+ipass*k+j);
*(ainv+ipass*k+j) = *(ainv+imax*k+j);
*(ainv+imax*k+j) = rtmp;
if ( j >= ipass )
{
rtmp = mi_tmp[ipass][j];
mi_tmp[ipass][j] = mi_tmp[imax][j];
mi_tmp[imax][j] = rtmp;
}
}
}
pivot = mi_tmp[ipass][ipass];
*det *= pivot;
if( (pivot < 0.000001) && (pivot > -0.000001) )
{
return( 107 );
}
pivotinv = 1/pivot;
for( j = 0; j < n; j++ )
{
*(ainv+ipass*k+j) *= pivotinv;
if( j >= ipass ) mi_tmp[ipass][j] *= pivotinv;
}
for( i = 0; i < n; i++ )
{
if( i != ipass) factor = mi_tmp[i][ipass];
for( j = 0; j < n; j++ )
{
if( i != ipass )
{
*(ainv+i*k+j) -= factor*( *(ainv+ipass*k+j));
mi_tmp[i][j] -= factor*mi_tmp[ipass][j];
}
}
}
}
return( 1 );
}
2006-05-29 21:14:15 · answer #1 · answered by ㄚ棋 1 · 0⤊ 0⤋
這裡高手很多,所以...請麻煩大家幫我這個忙,請幫我解答這個知識問題...這對我的未來很重要,再次謝謝大家!也說聲抱歉!打擾你們 網址在這裡 請幫忙 謝謝 http://tw.knowledge.yahoo.com/question/?qid=1306052809587#openions
2006-05-29 19:25:05 · answer #2 · answered by 哲安 1 · 0⤊ 0⤋