我把你的主函数改了许多,但和你的方法类似,你的其他函数没有改.
输入的矩阵为:
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);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)