c语言求逆矩阵 我写得 找找错误 共同交流吧

c语言求逆矩阵 我写得 找找错误 共同交流吧,第1张

我写完才发现原来已经有人找到你的问题所在了.但还是发上来,大家交流一下吧.
我把你的主函数改了许多,但和你的方法类似,你的其他函数没有改.
输入的矩阵为:
2 -1 0 0
-3 2 0 0
31 -19 3 -4
-23 14 -2 3
逆矩阵为:
200 100 000 000
300 200 000 000
100 100 300 400
200 -100 200 300
检验矩阵为:
100 000 000 000
000 100 000 000
000 000 100 000
000 000 000 100
例外,对于这个,int i,j; 这些控制循环次数的,最好不要作为全局变量声明
#include<stdioh>
#define M 4
#define abs(x) (x>=0x:-x)
void shuru(float (p)[M]);
void chufa(float (p)[M],int I,float t);
void huanhang(float (p)[M],int I, int J);
void jian(float(p)[M],int I ,int J);
void shuchu(float (p)[M]);
void jianyan(float (p)[M],float (q)[M]);
void main() {
int i,j,k;
int c;
float t,B[M][M],A[M][M],E[M][M]={1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
shuru(A);
for(i=0;i<M;i++) {
for(j=0;j<M;j++)
B[i][j]=A[i][j];
}
bool flag=1; //先化为上三角矩阵,flag记录是否可逆
for(c=0;c<M && flag;c++) {
flag=0;
if(abs(A[c][c])<10e-4) { //判断是否为0,对于浮点数,如果绝对值小于很小的数,则认为是0.
for(i=c+1;i<M;i++) //如果对角线上元素为0,让对角线上的元素不为0,若办不到,则flag=0
if(!(abs(A[c][c])<10e-4)) {
flag=1;
huanhang(A,i,c);
huanhang(E,i,c);
}
}
else { //对角线上元素不为0
flag=1;
for(i=c+1;i<M;i++) {
if(!(abs(A[c][c])<10e-4)) {
t=A[c][c]/A[i][c];
chufa(A,i,t);
chufa(E,i,t);
jian(A,i,c);
jian(E,i,c);
}
}
}
}
if(flag==0)
printf("该矩阵不可逆");
else {
for(j=M-1;j>=0;j--) { //这里,从最右下的元素开始,把上三角矩阵化为只有对角线元素不为0
for(i=j-1;i>=0;i--) {
if(!(abs(A[i][j])<10e-4)) {
t=A[j][j]/A[i][j];
chufa(A,i,t);
chufa(E,i,t);
jian(A,i,j);
jian(E,i,j);
}
}
t=1/A[j][j]; //把对角线上的元素变成为1
chufa(A,j,t);
chufa(E,j,t);
}
}
shuchu(E);
jianyan(B,E);
}
void shuru(float (p)[M]) {
int i,j,k;
for(i=0;i<M;i++)
for(j=0;j<M;j++)
scanf("%f",&p[i][j]);
}
void chufa(float (p)[M],int I,float t) {
int k;
for(k=0;k<M;k++)
p[I][k]=p[I][k]t;
}
void huanhang(float (p)[M],int I, int J) {
int k;
float m;
for(k=0;k<M;k++) {
m=p[I][k];
p[I][k]=p[J][k];
p[J][k]=m;
}
}
void jian(float(p)[M],int I ,int J) {
int k;
for(k=0;k<M;k++)
p[I][k]=p[I][k]-p[J][k];
}
void shuchu(float (p)[M]) {
int i,j,k;
for(i=0;i<M;i++) {
for(j=0;j<M;j++)
printf("%2f\t",p[i][j]);
printf("\n");
}
printf("\n");
}
void jianyan(float (p)[M],float (q)[M]) {
int i,j,k;
float s[M][M];
int m,n;
for(m=0;m<M;m++) {
for(n=0;n<M;n++) {
s[m][n]=0;
for(i=0;i<M;i++)
s[m][n]+=q[m][i]p[i][n];
if(abs(s[m][n])<10e-4) //改了这里,同浮点数判断为0的理由,避免出现-000的情况
s[m][n]=0;
}
}
for(i=0;i<M;i++) {
for(j=0;j<M;j++)
printf("%2f\t",s[i][j]);
printf("\n");
}
printf("\n");
}

#define N 5 /[注]:修改6为你所要的矩阵阶数/ #include "stdioh" #include "conioh" /js()函数用于计算行列式,通过递归算法实现/ int js(s,n) int s[][N],n; {int z,j,k,r,total=0; int b[N][N];/b[N][N]用于存放,在矩阵s[N][N]中元素s

这个程序应该不难,给你个思路吧
变量i,j分别为行号和列号,
两层循环,for(i=0;i<3;i++)
for(j=0;j<3;j++)
{ }
大括号里为两个数据交换,按照逆矩阵的算法来
直接给你编好的程序对你的学习不利的,有不懂得再问

不多说了楼主要求的是矩阵的逆矩阵,不是转置矩阵
思路如下:
对于矩阵A
先求|A|
再求A
最后根据A^(-1)=(1/|A|)×A 即可得出
DevC++编译测试通过,且正确结果如下;
原来矩阵如下:
1 0 1
2 1 0
-3 2 -5
|A|= 200
|A|矩阵如下:
-500 200 -100
1000 -200 200
700 -200 100
|A^-1|矩阵如下:
-250 100 -050
500 -100 100
350 -100 050
请按任意键继续
正确的代码如下;
#include "stdioh"
#include "stdlibh"
void printArrayDouble3(double a[][3],int m,int n)
{
for(int i=0;i

#include<stdioh>

void main()

{

int a[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

int i,j,b[4][4];

printf("转置前的a[i][j]:\n");

for(i=0;i<4;i++)

{

for(j=0;j<4;j++)

{

 printf("%5d",a[i][j]);

 b[j][i]=a[i][j];

}

printf("\n\n");

}

printf("\n");

printf("转置后的b[i][j]:\n");

for(j=0;j<4;j++)

 { for(i=0;i<4;i++)

  {

   printf("%5d",b[j][i]);

  }

 printf("\n\n");

 }

printf("\n");

}

#include<stdioh>
void main()
{
int a[5][5];
int i,j,temp;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
a[i][j]=i5+j+1;
for(i=0;i<5;i++)
for(j=i+1;j<5;j++)
{
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
你的那个程序不是很好,看看这个吧

#include <iostream>

using namespace std;

#define TYPE int

#define NUM 3

TYPE matrix1[NUM][NUM], matrix2[NUM][NUM];

void Fun()

{

int i,j;

for(i = 0; i < NUM; i ++)

{

for(j = 0; j <= NUM; j++)

{

matrix2[j][i] = matrix1[i][j];

}

}

}

void Init()

{

int i,j;

for(i = 0; i < NUM; i ++)

{

for(j = 0; j < NUM; j++)

{

cout << "请输入第" << i + 1 << "行,第" <<j + 1<< "列的元素" << endl;

cin >> matrix1[i][j];

}

}

}

void Output(int matrix[][NUM])

{

int i,j;

for(i = 0; i < NUM; i ++)

{

for(j = 0; j < NUM; j++)

{

cout << matrix[i][j] << " ";

}

cout << endl;

}

}

void main()

{

//求33矩阵的逆矩阵

Init();

cout << "matrix1为:" << endl;

Output(matrix1);

Fun();

cout << "matrix2为:" << endl;

Output(matrix2);

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13154502.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-12
下一篇 2023-06-12

发表评论

登录后才能评论

评论列表(0条)

保存