问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

编写一个2×2矩阵的求逆函数。要求参数为2×2的二维数组,如果输入参数...

发布网友 发布时间:2024-01-05 14:04

我来回答

5个回答

热心网友 时间:2024-08-05 00:57

//既然是2×2矩阵,可以按以下两部求逆
//1 主对角线的元素交换位置
//2 副对角线元素反号
//************************************
// Parameter: & matIn 输入2×2矩阵
// Parameter: & matOut 输出逆矩阵
//************************************
bool invMat22(const double (&matIn)[2][2], double (&matOut)[2][2] )
{
if( matIn[0][0] * matIn[1][1] == matIn[0][1] * matIn[1][0] )
return false;//奇异矩阵,无法求逆
matOut[0][0] = matIn[1][1]; matOut[0][1] = -matIn[0][1];
matOut[1][0] = -matIn[1][0]; matOut[1][1] = matIn[0][0];
return true; //非奇异矩阵
}

热心网友 时间:2024-08-05 00:57

既然已经确定了2x2矩阵为参数, 传入参数不是2x2矩阵自然编译就会失败,为何还要程序提示错误信息? 不是很理解你所说的'求逆函数', 给2个输入和输出的结果吧,看我能不能帮你写个

热心网友 时间:2024-08-05 00:53

//***************************
//求任何一个矩阵的逆矩阵
//***************************
#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");
}

希望可以帮助你

热心网友 时间:2024-08-05 00:49

#include "stdio.h"

int a[2][2];
double b[2][2];
int main(void)
{
int n=2,i,j,dem;
for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&a[i][j]);
dem=a[0][0]*a[1][1]-a[0][1]*a[1][0];//求出行列式
if(dem==0)//行列式为零,不可逆
{
puts("不可逆");
return 0;
}
//先求伴随矩阵,算法是在原来的基础上主对角线上的元素交换一下,副对角线上的元素每个数字加上负号
b[0][0]=a[1][1];
b[1][1]=a[0][0];
b[0][1]=-a[0][1];
b[1][0]=-a[1][0];
for(i=0;i<n;i++)//求出逆矩阵,用公式A*/dem
{
for(j=0;j<n;j++)
printf("%.2lf ",b[i][j]/dem);
puts("");
}
return 0;
}

热心网友 时间:2024-08-05 00:51

代码一:
#include<stdio.h>
int MAX,MIN;
int maxi,maxj,mini,minj;
void main()
{
void result(int x[][5],int m,int n);
int a[5][5],max,min,i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
MAX=MIN=a[0][0];
maxi=maxj=mini=minj=0;
result(a,5,5);
printf("MAX=%d,maxi=%d,maxj=%d\n",MAX,maxi,maxj);
printf("MIN=%d,mini=%d,minj=%d\n",MIN,mini,minj);
}
void result(int x[][5],int m,int n)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(x[i][j]>MAX)
{
MAX=x[i][j];
maxi=i;
maxj=j;
}
if(x[i][j]<MIN)
{
MIN=x[i][j];
mini=i;
minj=j;
}
}
}
但代码一有个缺点,那就是如果有多个最值,只能输出最后一个。下面的代码是经过改进的。
代码二:
#include<stdio.h>
int MAX,MIN;
int maxi,maxj,mini,minj;
void main()
{
void result(int x[][5],int m,int n);
int a[5][5],max,min,i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
MAX=MIN=a[0][0];
maxi=maxj=mini=minj=0;
result(a,5,5);
}
void result(int x[][5],int m,int n)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(x[i][j]>MAX)
MAX=x[i][j];
if(x[i][j]<MIN)
MIN=x[i][j];
}
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(x[i][j]==MAX)
{
MAX=x[i][j];
maxi=i;
maxj=j;
printf("MAX=%d,maxi=%d,maxj=%d\n",MAX,maxi,maxj);
}
if(x[i][j]==MIN)
{
MIN=x[i][j];
mini=i;
minj=j;
printf("MIN=%d,mini=%d,minj=%d\n",MIN,mini,minj);
}
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
iphone4被偷/被盗/丢失了后怎么办呢? 韩语对话:被盗的经验和防御方法 ipad2在飞机上丢失,有什么方法可以找回来吗?ipad的条码是:MC979ZP/A... ...被抓到并报案,公安机关应该怎样处理案件,被偷2万元左右的财物是否... (1/2)刚才在交车上我的钱包被偷了里面有刚办好的2万定期存单和身份证和... 老丢东西/钱如何转运 我用eXeScope修改资料后qq怎么打不开了 肚子针打完后用湿棉签按住药水会不会流出来 怎样给别人打针才不会痛? 打完新冠疫苗棉签要按压多久? ...沙发.床,柜子.餐桌...中档的...大概需要多少钱和什么设备 第二次强制修改怎么改? 关于微信绑定上限的问题:你的手机号在最近24小时内已绑定过3个... 您的手机号在最近24小时内绑定过三个,已达到限制,...24小时后... 修改一年内如何二次修改吗苹果 三相电机因线路故障,把三相电中一相火线与零线对换,这样电机会反转吗... 请教关于 三相四线的功率计算问题 一直对功率和电流的问题一知半解... 我在姚家做几路公交车到中南路 智能锁:光学智能锁和半导体智能锁 一岁多的小狗总是掉毛怎么回事? 一年之内只能修改两次吗? 刚买的天然水晶红幽灵里有很多像沙一样物质的东西,想问下那是什么东西... 怎么用三个字形容萍水相逢的朋友 mfc对话框登陆view怎么处理回车键的问题? 微信重新注册了,怎么找回以前那个? 大连一金州公交线姚家站离姚家地铁站口多远 中国的世界文化遗产有多少个? excel如何设置显示浮动工具栏? 汉谟拉比法典石柱上刻的人物 怎么样提高钛基材的抗冲击能力 用c语言编写一个2*4*6*8*10的阶乘的代码 大神们速度来 红幽灵水晶如何鉴定 怎样鉴别绿幽灵水晶的真假 全球公爵有什么用 nova青春版支持电信高清通话功能吗? 一年内怎么改第二次 从马栏广场到后盐陶瓷建材市场怎么坐公交车,最快需要 ...我想了解下沙发的利润怎么样,初期投资要多少钱。求高人指点_百度知 ... 苹果手机id怎么注册啊!? 怎么查对方的什么时候注册的怎么? 孩子穿过的旧衣服能收吗? 怎么修改?能修改第二次吗? 苹果可以修改,一年可以改几次? 怎么强制修改第二次 大连姚家一路车终点站离地铁口多远 全球公爵是什么卡 一年内能改第二次吗? 山东欢腾农牧发展有限公司怎么样? 一年只能改一次吗? 关于微信绑定上限的问题:你的手机号在最近24小时内已绑定过3个... 您的手机号在最近24小时内绑定过三个,已达到限制,...24小时后...