下面是实现Gauss-Jordan法实矩阵求逆。
#include
<stdlibh>
#include
<mathh>
#include
<stdioh>
int
brinv(double
a[],
int
n)
{
int
is,js,i,j,k,l,u,v;
double
d,p;
is=malloc(nsizeof(int));
js=malloc(nsizeof(int));
for
(k=0;
k<=n-1;
k++)
{
d=00;
for
(i=k;
i<=n-1;
i++)
for
(j=k;
j<=n-1;
j++)
{
l=in+j;
p=fabs(a[l]);
if
(p>d)
{
d=p;
is[k]=i;
js[k]=j;}
}
if
(d+10==10)
{
free(is);
free(js);
printf("errnot
inv
");
return(0);
}
if
(is[k]!=k)
for
(j=0;
j<=n-1;
j++)
{
u=kn+j;
v=is[k]n+j;
p=a[u];
a[u]=a[v];
a[v]=p;
}
if
(js[k]!=k)
for
(i=0;
i<=n-1;
i++)
{
u=in+k;
v=in+js[k];
p=a[u];
a[u]=a[v];
a[v]=p;
}
l=kn+k;
a[l]=10/a[l];
for
(j=0;
j<=n-1;
j++)
if
(j!=k)
{
u=kn+j;
a[u]=a[u]a[l];}
for
(i=0;
i<=n-1;
i++)
if
(i!=k)
for
(j=0;
j<=n-1;
j++)
if
(j!=k)
{
u=in+j;
a[u]=a[u]-a[in+k]a[kn+j];
}
for
(i=0;
i<=n-1;
i++)
if
(i!=k)
{
u=in+k;
a[u]=-a[u]a[l];}
}
for
(k=n-1;
k>=0;
k--)
{
if
(js[k]!=k)
for
(j=0;
j<=n-1;
j++)
{
u=kn+j;
v=js[k]n+j;
p=a[u];
a[u]=a[v];
a[v]=p;
}
if
(is[k]!=k)
for
(i=0;
i<=n-1;
i++)
{
u=in+k;
v=in+is[k];
p=a[u];
a[u]=a[v];
a[v]=p;
}
}
free(is);
free(js);
return(1);
}
void
brmul(double
a[],
double
b[],int
m,int
n,int
k,double
c[])
{
int
i,j,l,u;
for
(i=0;
i<=m-1;
i++)
for
(j=0;
j<=k-1;
j++)
{
u=ik+j;
c[u]=00;
for
(l=0;
l<=n-1;
l++)
c[u]=c[u]+a[in+l]b[lk+j];
}
return;
}
int
main()
{
int
i,j;
static
double
a[4][4]={
{02368,02471,02568,12671},
{11161,01254,01397,01490},
{01582,11675,01768,01871},
{01968,02071,12168,02271}};
static
double
b[4][4],c[4][4];
for
(i=0;
i<=3;
i++)
for
(j=0;
j<=3;
j++)
b[i][j]=a[i][j];
i=brinv(a,4);
if
(i!=0)
{
printf("MAT
A
IS:
");
for
(i=0;
i<=3;
i++)
{
for
(j=0;
j<=3;
j++)
printf("%137e
",b[i][j]);
printf("
");
}
printf("
");
printf("MAT
A-
IS:
");
for
(i=0;
i<=3;
i++)
{
for
(j=0;
j<=3;
j++)
printf("%137e
",a[i][j]);
printf("
");
}
printf("
");
printf("MAT
AA-
IS:
");
brmul(b,a,4,4,4,c);
for
(i=0;
i<=3;
i++)
{
for
(j=0;
j<=3;
j++)
printf("%137e
",c[i][j]);
printf("
");
}
}
}
参考资料:
#include<stdioh>
#include<mathh>
#include<timeh>
main(){
int a;
int i,j,NR,NC;
printf("input row -- m value:\n");
scanf("%d",&NR);
printf("input column -- n value:\n");
scanf("%d",&NC);
a = (int ) malloc(sizeof(int ) NR);
for (j=0;j<NR;j++){
a[j] = (int ) malloc(sizeof(int) NC);
}
srand((unsigned)time(NULL));
for (j=0;j<NR;j++) for (i=0;i<NC;i++) {a[j][i] = rand()%2;}
for (j=0;j<NR;j++) {
for (i=0;i<NC;i++) printf("%d ",a[j][i]);
printf("\n");
};
}
#define MAX 50
#define M MAX
#define N MAX
#define T MAX
#define S MAX
int Mult(double a[][N],int m,int n,double b[][T]int s,int t,double c[][T]) {
int i,j,k;
if(n != s) {
printf("两矩阵相乘,左矩阵的列数与右矩阵的行数必须相等。\n");
return 0;
}
int c;
tmpm_Mat = new double [tmpm_Rows];
for(int i = 0;i < tmpm_Rows;i++) tmpm_Mat[i] = new double[tmpm_Cols];
for(i = 0; i < m; ++i) {
for(j = 0; j < n; ++j) {
c[i][j] = 0;
for(k = 0; k < t; ++k)
c[i][j] += c[i][k] c[k][j];
}
}
return 1;
}
1,若程序定义为三行三列的矩阵,并在主函数中键盘赋值。请编写函数juzhen(int a[][3],int n),函数功能是:使矩阵左下角元素中的值乘以例如:若矩阵中的值为:
1 9 7
2 3 8
4 5 6
n=3,则矩阵值变为:
1 9 7
6 9 8
12 15 18
注:二维数组下三角元素每行最后元素的列标和该列的列号一致
#include <stdioh>
int juzhen(int a[][3],int n)
{
int i,j;
for (i=1;i<3;i++)
for (j=0;j<=i;j++)
a[i][j]=a[i][j]n;
}
main()
{
int i,j,a[3][3],m;
clrscr();
printf("please enter 9 numbers :\n");
for (i=0;i<3;i++)
for (j=0;j<3;j++)
scanf("%d",&a[i][j]);
printf("the old ju zhen is:\n");
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
printf("%3d",a[i][j]);
printf("\n");
}
printf("please enter a int number:\n");
scanf("%d",&m);
juzhen (a,m);
printf("the new ju zhen is:\n");
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
printf("%3d",a[i][j]);
printf("\n");
}
}
2,请编写函数juzhen,该函数的功能是:将三行四列矩阵x乘以四行三列矩阵y,结果放在三行三列矩阵中。矩阵相乘的基本方法是:矩阵Xy中行列下标分别为i,j的元素的值,是矩阵X中第i行上四个元素与矩阵Y中第j列上四个元素对应相乘的积。
X和Y矩阵原型可运行后看到!
#include <conioh>
#include <stdioh>
void juzhen (int a[3][4],int b[4][3],int ab[3][3])
{
int i,j,z;
for (i=0;i<3;i++)
for (j=0;j<4;j++)
for (z=0;z<3;z++)
ab[i][z]=ab[i][z]+a[i][j]b[j][z];/此得为要填写的内容/
}
main()
{
int x[3][4]={1,0,1,1,2,1,0,1,1,2,0,3};
int y[4][3]={1,1,1,0,0,0,2,1,1,1,1,3};
int xy[3][3]={0},i,j;
clrscr();
juzhen (x,y,xy);
printf("x ju zhen is:\n");
for (i=0;i<3;i++)
{
for (j=0;j<4;j++)
printf("%3d",x[i][j]);
printf("\n");
}
printf("y ju zhen is:\n");
for (i=0;i<4;i++)
{
for (j=0;j<3;j++)
printf("%3d",y[i][j]);
printf("\n");
}
printf("xy ju zhen is:\n");
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
printf("%3d",xy[i][j]);
printf("\n");
}
}
由于你没有说要求,我就写了两个,这是两道比较精典的求c语言矩阵乘法程序
#include<stdioh>
int main()
{
int N,a[100][100],i,j,sum;
float average;
printf("请输入N:\n");
scanf("%d",&N);
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
a[i][j]=iN+j;
}
}
sum=0;
j=N-1;
for(i=0;i<N;i++)
{
sum=sum+a[i][j];
j--;
}
// average=10sum/N;//10将整型转化为浮点型
average=(float)sum/N;//或直接强制类型转换
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}
printf("\n");
printf("次对角线元素之和平均值=%02f\n",average);
return 0;
}
运行结果如图:
1、首先在电脑中,打开Dev-c++软件,点击“新建源代码”,如下图所示。
2、具体程序如下,如下图所示。
3、此次的程序最终目的是求出3x3的整型矩阵对角线元素之和,所以要向计算机输入3x3矩阵中的所有元素。
4、其次要对输入的矩阵的元素进行放置于相应的位置,以便于之后的计算其对角元素之和。
5、最后需要向计算机指出要计算机计算出哪些元素之和,和需要计算元素的具体位置在哪儿。
6、程序写完之后,点击运行即可求出所要求出的结果了。
我的代码逻辑是:
矩阵行指针初值指向每行首地址,迭代依次取所有行指针指向值组成新行,所有行指针自增。最终组合新的矩阵。
#include <stdioh>#include <malloch>
int getList(int row,int clo);//获取矩阵地址空间
void setNum(int nList,int n);//填写数值
void prtList(int nList,int row,int clo);//打印矩阵
int zz(int nList,int row,int clo);//转置函数
int main()
{
int row,clo,nList=NULL,nListSave=NULL;
printf("输入矩阵行列数:");
scanf("%d%d",&row,&clo);
nList=getList(row,clo);
setNum(nList,rowclo);
printf("输入的矩阵为:\n");
prtList(nList,row,clo);
printf("转置后的矩阵为:\n");
nListSave=zz(nList,row,clo);
free(nList);
nList=nListSave;
prtList(nList,clo,row);
return 0;
}
int zz(int nList,int row,int clo)
{
int nSave=NULL,listSave=NULL,listp=nList,p=NULL,i,j;
nSave=(int )malloc(sizeof(int)rowclo);
listSave=(int )malloc(sizeof(int)clo);//倒置后的矩阵
p=nSave;
for(j=0;j<clo;j++)
{
for(i=0;i<row;i++)
{
p++=listp[i];
listp[i]=listp[i]+1;
}
}
for(i=0;i<clo;i++)
listSave[i]=&nSave[irow];
for(i=0;i<row;i++)
free(nList[i]);//释放原矩阵行空间
return listSave;
}
void prtList(int nList,int row,int clo)
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<clo;j++)
printf("%d ",nList[i][j]);
printf("\n");
}
}
void setNum(int nList,int n)
{
int p=nList[0];
printf("填写矩阵中%d个数值:\n",n);
while(n-->0)
scanf("%d",p++);
}
int getList(int row,int clo)
{
int nums,nList,i;
nums=(int )malloc(sizeof(int)rowclo);
nList=(int )malloc(sizeof(int)row);
for(i=0;i<row;i++)
nList[i]=&nums[iclo];
return nList;
}
以上就是关于用c语言怎么编写输入一个矩阵求其逆矩阵的程序全部的内容,包括:用c语言怎么编写输入一个矩阵求其逆矩阵的程序、创建一个m*n的01矩阵 完整的c语言程序、C语言编程求矩阵乘积等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)