矩阵求逆的算法怎么写 c矩阵求逆算法
//求任何一个矩阵的逆矩阵
//***************************
#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 memoryn" );
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 %Gn",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");
}
更多阅读
机关单位新闻通讯稿的标题怎么写? 获奖新闻稿标题怎么写
机关单位新闻通讯稿的标题怎么写?——简介一篇优秀的新闻通讯稿,总离不开一个简洁明了、恰到好处的标题。作为行政机关或者事业单位发布的新闻通讯,有了一个好的标题,才能算是一个完美的新闻稿件!机关单位新闻通讯稿的标题怎么写?——工
欠条应该怎样写 正规的欠条怎么写
欠条应该怎样写——简介欠条是个人或单位在欠款、欠物时写给有关单位或个人的凭证性应用文。欠条今天也有人称作“白条”。 欠条也是在日常生活中常见的为证明一方欠另一方财物而立下的字据,一种凭据类应用文体。欠条应该怎样写—
别落伍了,潮人是这样买车险的! 落伍的英文怎么写
导语:买辆车本来是要好好享受生活的,买个车险就是一阵瞎折腾,千挑万选,还要担心被业务员忽悠了。现在这种状况都已经成为历史,现在电话车险、网上车险都已经成为潮流,你根据不用怕担心被不怀好意的业务员忽悠,因为你可以直接与保险公司沟通
转载 怎么写文献综述WRITINGALITERATUREREVIEW review怎么写
原文地址:怎么写文献综述WRITINGALITERATUREREVIEW初译作品作者:三月四日的鱼怎么写文献综述来源:亚洲技术学院,语言中心翻译:杨慧指导教师:戎可老师什么是文献?尽管听到“literature”这个词时你可能会想到小说和诗歌,但对于科学研究来
怎么又见绿领巾? 绿领巾的一瞬间怎么写
在武汉市光谷六小校门口,记者看到五名学生佩戴着绿领巾,一边敬队礼,一边齐声提醒“各位同学,请按时平安回家,路上注意安全!”据了解,绿领巾的创意者是学校大队辅导员彭毅君,想通过这来宣扬文明、环保理念。(武汉晚报3月1日)虽然这所学校称,“