c语言实现矩阵的相关操作.docx

上传人:b****5 文档编号:8286351 上传时间:2023-01-30 格式:DOCX 页数:24 大小:271.30KB
下载 相关 举报
c语言实现矩阵的相关操作.docx_第1页
第1页 / 共24页
c语言实现矩阵的相关操作.docx_第2页
第2页 / 共24页
c语言实现矩阵的相关操作.docx_第3页
第3页 / 共24页
c语言实现矩阵的相关操作.docx_第4页
第4页 / 共24页
c语言实现矩阵的相关操作.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

c语言实现矩阵的相关操作.docx

《c语言实现矩阵的相关操作.docx》由会员分享,可在线阅读,更多相关《c语言实现矩阵的相关操作.docx(24页珍藏版)》请在冰豆网上搜索。

c语言实现矩阵的相关操作.docx

c语言实现矩阵的相关操作

 

c语言实现矩阵的相关操作(总25页)

 

算法分析与设计课程论文

—通过C语言实现矩阵的相关操作

 

一.摘要

本文在MicrosoftVisualStudio2010的编译环境下,通过C语言进行一些矩阵的基本操作,包括矩阵的设置,加减乘除,数乘运算。

求矩阵的逆等操作。

关键词

矩阵C语言逆矩阵

二.正文

1.引言

矩阵的相关知识只是是高等数学的基础,但是其庞大的运算量和纷繁的步骤让人却步。

虽然有Matlab等软件可以实现矩阵的相关操作,但是我校一些专业并不学习数学实验,故通过C语言实现矩阵的操作也是一种可行的方法,本文列举的了一些矩阵的加减乘除等基本运算规则,还有对矩阵进行转置,也有矩阵求逆的相关操作。

同时,还介绍了行列式的计算,通过运行该程序,可以大大简化行列式的计算量。

2.算法分析

矩阵的初始化

相关概念

在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵。

这一概念由19世纪英国数学家凯利首先提出。

矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。

在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。

矩阵的运算是数值分析领域的重要问题。

将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。

对一些应用广泛而形式特殊的矩阵,例如稀疏矩阵和准对角矩阵,有特定的快速运算算法。

理论分析

在C语言中,可以使用二维数组来描绘一个矩阵。

值得注意的是,在二维数组中,必须标明列数,否则编译器就会报错。

故二维极其多维数组使用时要注意数组下标。

代码实现

#include<>

intmain()

{

intjuzheng[100][100];

inti,j,a,b;

printf("请输入矩阵的行数a列数b\n");

scanf("%d%d",&a,&b);

for(i=0;i

{

for(j=0;j

{

scanf("%d",&juzheng[i][j]);

}

}

printf("你所输入的矩阵是:

\n");

for(i=0;i

{

for(j=0;j

{

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

}

printf("\n");

}

return0;

}

 

矩阵的相加

相关概念

加法

矩阵的加法满足下列运算律(A,B,C都是同型矩阵):

A+B=B+A

A+B+C=A+(B+C)

应该注意的是只有同型矩阵之间才可以进行加法

理论分析:

矩阵相加就是将两个矩阵的相同位置的元素相加,相加的值输出,通过循环语句,可以很好的实现该过程,如果要改成减法的话,就可以改成printf(“%d”,juzhen1[i][j]-juzhen2[i][j])。

这样就可以实现矩阵的减法。

代码实现

#include<>

intmain()

{

intjuzheng1[100][100],juzheng2[100][100];

inti,j,a,b;

printf("请输入矩阵的行数a和列数b\n");

scanf("%d%d",&a,&b);

printf("输入矩阵1\n");

for(i=0;i

{

for(j=0;j

{

scanf("%d",&juzheng1[i][j]);

}

}

printf("输入矩阵2\n");

for(i=0;i

{

for(j=0;j

{

scanf("%d",&juzheng2[i][j]);

}

}

printf("您所输入的矩阵1是:

\n");

for(i=0;i

{

for(j=0;j

{

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

}

printf("\n");

}

printf("\n您所输入的矩阵2是:

\n");

for(i=0;i

{

for(j=0;j

{

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

}

printf("\n");

}

printf("\n您输出的矩阵是:

\n");

for(i=0;i

{

for(j=0;j

{

printf("%d",juzheng1[i][j]+juzheng2[i][j]);

}

printf("\n");

}

return0;

}

 

矩阵的数乘

相关概念

矩阵的数乘满足以下运算律:

矩阵的加减法和矩阵的数乘合称矩阵的线性运算。

理论分析

矩阵的数乘,就是把要乘的那个数乘上每一个元素。

要想实现矩阵的数乘,只需在每一个元素上乘上那个数就行了。

通过对二维数组的遍历,就可以实现该项功能。

代码实现

#include<>

intmain()

{

intjuzheng[100][100];

inti,j,a,b,u;

printf("请输入矩阵的行数a列数b\n");

scanf("%d%d",&a,&b);

printf("请输入需要数乘的那个数u\n");

scanf("%d",&u);

for(i=0;i

{

for(j=0;j

{

scanf("%d",&juzheng[i][j]);

}

}

printf("你所输出的矩阵是:

\n");

for(i=0;i

{

for(j=0;j

{

printf("%d",u*juzheng[i][j]);

}

printf("\n");

}

return0;

}

 

求矩阵中的最大最小值

相关概念

矩阵中所有元素存在最大最小值,通过在矩阵中的比较大小,就可以找到矩阵中所有元素的最大最小值。

理论分析

在一个矩阵中,存在最大值与最小值,通过在循环语句中比较,就可以得出一个矩阵中所有元素的最大最小值。

通过初始化一个max与min,然后将矩阵中个个元素与其进行比较,就可以得出矩阵中个个元素的最大值与最小值。

代码实现

#include<>

intmain()

{

intjuzheng[100][100];

inti,j,a,b,min,max;

max=-100000;

min=100000;

printf("请输入矩阵的行数a列数b\n");

scanf("%d%d",&a,&b);

for(i=0;i

{

for(j=0;j

{

scanf("%d",&juzheng[i][j]);

}

}

for(i=0;i

{

for(j=0;j

{

if(juzheng[i][j]>max)

max=juzheng[i][j];

if(juzheng[i][j]

min=juzheng[i][j];

}

printf("\n");

}

printf("max=%dmin=%d",max,min);

return0;

}

 

矩阵的乘法

相关概念

两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。

如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵,它的一个元素:

并将此乘积记为:

.

例如:

矩阵的乘法满足以下运算律:

结合律:

ABC=A(BC)

左分配律:

(A+B)*C=AC+BC

右分配律:

A*(B+C)=AC+BC

但是矩阵乘法不满足交换律。

理论分析

矩阵乘法必须是a*b的矩阵和b*n的矩阵形式才能相乘,通过矩阵乘法的运算法则,就可以得到新的矩阵。

值得注意的是

 

代码实现

#include<>

intmain()

{

intjuzheng1[100][100],juzheng2[100][100];

inti,j,a,b,n,d,k;

printf("请输入矩阵的行数a和列数b\n");

scanf("%d%d",&a,&b);

printf("输入矩阵1\n");

for(i=0;i

{

for(j=0;j

{

scanf("%d",&juzheng1[i][j]);

}

}

printf("矩阵2为a行n列,输入n\n");

scanf("%d",&n);

printf("输入矩阵2:

\n");

for(i=0;i

{

for(j=0;j

{

scanf("%d",&juzheng2[i][j]);

}

}

printf("两个矩阵的乘积y为:

\n");

for(i=0;i

{

{

for(j=0;j

{

for(d=0,k=0;k

d+=juzheng1[i][k]*juzheng2[k][j];

printf("%d",d);

}

printf("\n");

}

}

}

求转置矩阵

把矩阵A的行换成相应的列,得到的新矩阵称为A的转置矩阵,记作

或A。

理论分析

只需要将输出是行数和列数交换一下就行了,在循环中将输出结果输出就可以了。

对于数组下标的操作,有时可以很大的降低算法的复杂度。

所以对于数组下标操作的小技巧,要留意。

代码实现

#include<>

intmain()

{

intjuzheng[100][100];

inti,j,a,b;

printf("请输入矩阵的行数a列数b\n");

scanf("%d%d",&a,&b);

for(i=0;i

{

for(j=0;j

{

scanf("%d",&juzheng[i][j]);

}

}

printf("转置矩阵是:

阰\n");

for(i=0;i

{

for(j=0;j

{

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

}

printf("\n");

}

return0;

}

求矩阵的逆

设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩阵B,使得:

AB=BA=I。

则我们称B是A的逆矩阵,而A则被称为可逆矩阵。

理论分析

伴随矩阵法求逆矩阵

如果矩阵A可逆,则

 

 

其中

是A的伴随矩阵。

代码首先求出A的伴随矩阵,

代码

#include<>

#defineN10

intgetA(intarcs[N][N],intn){

if(n==1)

{

returnarcs[0][0];

}

intans=0;

inttemp[N][N];

inti,j,k;

for(i=0;i

{

for(j=0;j

{

for(k=0;k

{

temp[j][k]=arcs[j+1][(k>=i)k+1:

k];

}

}

intt=getA(temp,n-1);

if(i%2==0)

{

ans+=arcs[0][i]*t;

}

else

{

ans-=arcs[0][i]*t;

}

}

returnans;

}

voidgetAStart(intarcs[N][N],intn,intans[N][N]){

if(n==1)

{

ans[0][0]=1;

return;

}

inti,j,k,t;

inttemp[N][N];

for(i=0;i

{

for(j=0;j

{

for(k=0;k

{

for(t=0;t

{

temp[k][t]=arcs[k>=ik+1:

k][t>=jt+1:

t];

}

}

ans[j][i]=getA(temp,n-1);

if((i+j)%2==1)

{

ans[j][i]=-ans[j][i];

}

}

}

}

intmain()

{

intarcs[N][N];

intastar[N][N];

inti,j;

intn;

while(scanf("%d",&n)!

=EOF&&n)

{

for(i=0;i

{

for(j=0;j

{

scanf("%d",&arcs[i][j]);

}

}

inta=getA(arcs,n);

if(a==0)

{

printf("cannottransform!

\n");

}

else

{

getAStart(arcs,n,astar);

for(i=0;i

{

for(j=0;j

{

printf("%.3lf",(double)astar[i][j]/a);

}

printf("\n");

}

}

printf("\n");

}

return0;

}

求行列式

相关概念

一个n阶方块矩阵A的行列式可直观地定义如下:

其中,Sn是集合{1,2,...,n}上置换的全体,即集合{1,2,...,n}到自身上的一一映射(双射)的全体;

表示对Sn全部元素的求和,即对于每个σ∈Sn, 

在加法算式中出现一次;对每一个满足1≤i,j≤n的数对(i,j),ai,j是矩阵A的第i行第j列的元素。

sgn(σ)表示置换σ∈Sn的符号差,具体地说,满足1≤iσ(j)的有序数对(i,j)称为σ的一个逆序。

如果σ的逆序共有偶数个,则sgn(σ)1,如果共有奇数个,则sgn(σ)-1。

理论分析

输入一个矩阵,按照行列式的定义展开,通过循环,就可以达到实现最后的目标。

行列式的计算是一个复杂的过程,通过编程,可以直接输入该行列式,就可以输出其结果,这样大大减少了运算量,节约了时间。

#include<>

intmain()

{

intz,r,s,j,i;

doublea[20][20],m,k;

m=;

printf("请输入阶数:

");

scanf("%d",&r);

printf("请输入数字\n");

for(i=0;i

{

for(j=0;j

{

scanf("%lf",&a[i][j]);

}

}

for(z=0;z

for(i=z;i

{

if(a[z][z]==0)

for(i=z;a[z][z]==0;i++)

{

{

for(j=0;j

{

a[z][j]=a[z][j]+a[i+1][j];

}

}

if(a[z][z]!

=0)

break;

}

{

k=-a[i+1][z]/a[z][z];

for(j=z;j

{

a[i+1][j]=k*(a[z][j])+a[i+1][j];

}

}

}

for(z=0;z

{

m=m*(a[z][z]);

}

printf("%f",m);

return0;

}

 

3.结论与反思

在MicrosoftVisualStudio2010的编译环境下,通过C语言进行一些矩阵的基本操作,可以极大的简化我们的运算,这就是计算机科学的好处。

而矩阵在高等数学中扮演极其重要的作用。

在其他科学中也扮演重要角色。

矩阵的运算是数值分析领域的重要问题。

将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。

对一些应用广泛而形式特殊的矩阵,例如稀疏矩阵和准对角矩阵,有特定的快速运算算法。

关于矩阵相关理论的发展和应用,请参考矩阵理论。

在天体物理、量子力学等领域,也会出现无穷维的矩阵,是矩阵的一种推广。

通过对于在C语言下对于矩阵进行相关的算法分析。

可以发现,对于大多数问题,可以调用一些函数,通过函数的组合,来实现一些复杂的问题。

由此其实最好的方法就是将个个方法封装起来,例如将加减乘除,数乘等运算封装成一个一个函数,完全可以建立属于自己的一个头文件,然后就可以通过调用头文件中的函数来大大简化代码量

通过这次结业论文,加深了对于C语言的理解,尤其是对于二维数组的使用。

数组,是C语言中重要的组成部分,多练习之后才可以熟练的使用。

所以这一次结课论文,对于我来说是一次很好的练习C语言的机会。

对于数组的使用,要善于使用数组下标和相对应的组内元素的关系。

这有点像哈希表,通过组建一组映射来得以建立相关关系。

这种方法可以极大简化算法的时间复杂度,这是一种以空间换取时间的方法。

这样,就可以达到最终的目的。

四.参考文献

《C程序设计》,谭浩强,清华大学出版社

《cprimerplus》,作者StephenPrata,译者云巅工作室,人民邮电出版社

矩阵,XX百科《线性代数与空间解析几何》,黄廷祝,高等教育出版社

《C语言矩阵的运算》,XX文库

思考题

(1)

在下图乘法竖式中,每一个星号代表一个数位,若出现的数字有且仅有2,3,5,7四种,你能将这个竖式还原吗

***

**

****

****

*****

程序代码

#include<>

intmain()

{

inta[5],b[4];

intbiaozhun[4]={2,3,5,7};

inte,f,g,h,i,k,l,m;

intchengyi,chenger,he,zhunqueshu,diyibu,dierbu;

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

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

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

{

chengyi=100*biaozhun[e]+10*biaozhun[f]+1*biaozhun[g];

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

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

{

chenger=10*biaozhun[h]+1*biaozhun[i];

he=chengyi*chenger;

diyibu=chengyi*biaozhun[i];

b[0]=diyibu%10;

b[1]=(diyibu/10)%10;

b[2]=(diyibu/100)%10;

b[3]=(diyibu/1000)%10;

if((b[0]==2||b[0]==3||b[0]==5||b[0]==7)&&(b[1]==2||b[1]==3||b[1]==5||b[1]==7)&&(b[2]==2||b[2]==3||b[2]==5||b[2]==7)&&(b[3]==2||b[3]==3||b[3]==5||b[3]==7))

diyibu=b[0]*1+b[1]*10+b[2]*100+b[3]*1000;

else

continue;

a[0]=he%10;

a[1]=(he/10)%10;

a[2]=(he/100)%10;

a[3]=(he/1000)%10;

a[4]=(he/10000)%10;

if((a[0]==2||a[0]==3||a[0]==5||a[0]==7)&&(a[1]==2||a[1]==3||a[1]==5||a[1]==7)&&(a[2]==2||a[2]==3||a[2]==5||a[2]==7)&&(a[3]==2||a[3]==3||a[3]==5||a[3]==7)&&(a[4]==2||a[4]==3||a[4]==5||a[4]==7))

{

zhunqueshu=a[0]*1+a[1]*10+a[2]*100+a[3]*1000+a[4]*10000;

printf("这个数是%

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1