[b]題目:用適當的方法求逆矩陣,給出判別條件,撰寫程式
這個程式是我在網上找的,求高手幫我看看這個程式用的是什么方法,順便幫我畫個NS流程圖
#include <stdio.h>
#include <malloc.h>
void main( void )
{
float *buffer,*p; //定義陣列首地址指標變數
short int row,num; //定義矩陣行數row及矩陣元素個數
short int i,j;
float determ; //定義矩陣的行列式
float comput_D(float *p,short int n); //求矩陣的行列式
float Creat_M(float *p, short int m,short int n,short int k); //求代數余子式
void Print( float *p,short int n); //列印n×n的矩陣
printf("\nPlease input the number of rows: ");
scanf("%d",&row);
num=2 * row * row;
buffer = (float *)calloc(num, sizeof(float)); //分配記憶體單元
p=buffer;
if(p != NULL)
{
for(i=0;i<row;i++) //輸入各單元值
{
printf("Input the number of %d row ",i+1);
for(j=0;j<row;j++)
{
scanf("%f",p++);
}
}
}
else
printf( "Can't allocate memory\n" );
printf("\nThe original matrix is:\n");
Print(buffer,row); //列印該矩陣
determ=comput_D(buffer,row); //求整個矩陣的行列式
p=buffer + row * row;
if (determ != 0)
{
for (i=0;i<row; i++) //求逆矩陣
for (j=0; j<row; j++)
*(p+j*row+i)= Creat_M(buffer,i,j,row)/determ;
printf("The determinant is %G\n",determ);
p=buffer + row * row;
printf("\nThe inverse matrix is:\n");
Print(p,row); //列印該矩陣
}
else
printf("The determnant is 0, and there is no inverse matrix !\n");
free( buffer );
}
//--------------------------------------------------------
//功能:求矩陣 n X n 的行列式
//入口引數:矩陣首地址 p;矩陣行數 n
//回傳值:矩陣的行列式值
//--------------------------------------------------------
float comput_D(float *p,short int n)
{
short int i,j,m; //i--row; j--column
short int lop=0;
float result=0;
float mid=1;
if (n!=1)
{
lop=(n==2)?1:n; //控制求和回圈次數,若為2階,則回圈1次,否則為n次
for(m=0;m<lop;m++)
{
mid=1; //順序求和
for(i=0,j=m;i<n;i++,j++)
mid = mid * ( *(p+i*n+j%n) );
result+=mid;
}
for(m=0;m<lop;m++)
{
mid=1; //逆序相減
for(i=0,j=n-1-m+n; i<n; i++,j--)
mid=mid * ( *(p+i*n+j%n));
result-=mid;
}
}
else result=*p;
return(result);
}
//----------------------------------------------------
//功能:求k×k矩陣中元素A(mn)的代數余子式
//入口引數:k×k矩陣首地址;元素A的下標m,n; 矩陣行數 k
//回傳值: k×k矩陣中元素A(mn)的代數余子式
//----------------------------------------------------
float Creat_M(float *p, short int m,short int n,short int k)
{
short int len;
short int i,j;
float mid_result=0;
short int quo=1;
float *p_creat,*p_mid;
len=(k-1)*(k-1);
p_creat = (float *)calloc(len, sizeof(float)); //分配記憶體單元
p_mid=p_creat;
for(i=0;i<k;i++)
for(j=0;j<k;j++)
{
if (i!=m && j!=n)
*p_mid++ =* (p+i*k+j);
}
// Print(p_creat,k-1);
quo = (m + n) %2==0 ? 1:-1;
mid_result = (float ) quo * comput_D(p_creat,k-1);
free(p_creat);
return(mid_result);
}
//-------------------------------------------
//功能:列印n×n的矩陣
//入口引數:n×n矩陣的首地址;該矩陣的行數 n
//回傳值: 無
//-------------------------------------------
void Print( float *p,short int n)
{
int i,j;
for (i=0;i<n;i++)
{
for (j=0; j<n;j++)
printf("%10G ",*p++);
printf("\n");
}
printf("--------------\n");
}
uj5u.com熱心網友回復:
用的是什么方法都有什么方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/87264.html
標籤:基礎類
