c语言实现矩阵的相关操作_第1页
免费预览已结束,剩余25页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

算法分析与设计课程论文通过C语言实现矩阵的相关操作1 摘要本文在Microsoft Visual Studio 2010的编译环境下,通过C语言进行一些矩阵的基本操作,包括矩阵的设置,加减乘除,数乘运算。求矩阵的逆等操作。关键词矩阵 C语言 逆矩阵2 正文1. 引言矩阵的相关知识只是是高等数学的基础,但是其庞大的运算量和纷繁的步骤让人却步。虽然有Matlab等软件可以实现矩阵的相关操作,但是我校一些专业并不学习数学实验,故通过C语言实现矩阵的操作也是一种可行的方法,本文列举的了一些矩阵的加减乘除等基本运算规则,还有对矩阵进行转置,也有矩阵求逆的相关操作。同时,还介绍了行列式的计算,通过运行该程序,可以大大简化行列式的计算量。2. 算法分析矩阵的初始化相关概念在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。 矩阵的运算是数值分析领域的重要问题。将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。对一些应用广泛而形式特殊的矩阵,例如稀疏矩阵和准对角矩阵,有特定的快速运算算法。理论分析 在C语言中,可以使用二维数组来描绘一个矩阵。值得注意的是,在二维数组中,必须标明列数,否则编译器就会报错。故二维极其多维数组使用时要注意数组下标。代码实现#include int main()int juzheng 100100;int i , j , a , b ;printf(请输入矩阵的行数a 列数b n) ;scanf (%d %d,&a,&b);for (i = 0;i a ;i+)for (j = 0;j b ;j+)scanf (%d,&juzhengij);printf (你所输入的矩阵是:n);for (i = 0;i a ;i+)for (j = 0;j b ;j+)printf(%d ,juzhengij);printf (n);return 0;矩阵的相加相关概念加法矩阵的加法满足下列运算律(A,B,C都是同型矩阵):A+B=B+AA+B+C=A+(B+C)应该注意的是只有同型矩阵之间才可以进行加法理论分析:矩阵相加就是将两个矩阵的相同位置的元素相加,相加的值输出,通过循环语句,可以很好的实现该过程,如果要改成减法的话,就可以改成printf(“%d”,juzhen1ij-juzhen2ij)。这样就可以实现矩阵的减法。代码实现#include int main()int juzheng1 100100,juzheng2100100;int i , j , a , b ;printf(请输入矩阵的行数a和列数bn) ;scanf (%d %d,&a,&b);printf(输入矩阵1n);for (i = 0;i a ;i+)for (j = 0;j b ;j+)scanf (%d,&juzheng1ij);printf(输入矩阵2n);for (i = 0;i a ;i+)for (j = 0;j b ;j+)scanf (%d,&juzheng2ij);printf (您所输入的矩阵1是:n);for (i = 0;i a ;i+)for (j = 0;j b ;j+)printf(%d ,juzheng1ij);printf (n);printf (n您所输入的矩阵2是:n);for (i = 0;i a ;i+)for (j = 0;j b ;j+)printf(%d ,juzheng2ij);printf (n);printf (n您输出的矩阵是:n);for (i = 0;i a ;i+)for (j = 0;j b ;j+)printf(%d ,juzheng1ij+juzheng2ij);printf (n);return 0;矩阵的数乘相关概念矩阵的数乘满足以下运算律:矩阵的加减法和矩阵的数乘合称矩阵的线性运算。理论分析矩阵的数乘,就是把要乘的那个数乘上每一个元素。要想实现矩阵的数乘,只需在每一个元素上乘上那个数就行了。通过对二维数组的遍历,就可以实现该项功能。代码实现#include int main()int juzheng 100100;int i , j , a , b ,u;printf(请输入矩阵的行数a 列数b n) ;scanf (%d %d,&a,&b);printf(请输入需要数乘的那个数un) ;scanf (%d,&u);for (i = 0;i a ;i+)for (j = 0;j b ;j+)scanf (%d,&juzhengij);printf (你所输出的矩阵是:n);for (i = 0;i a ;i+)for (j = 0;j b ;j+)printf(%d ,u*juzhengij);printf (n);return 0;求矩阵中的最大最小值相关概念矩阵中所有元素存在最大最小值,通过在矩阵中的比较大小,就可以找到矩阵中所有元素的最大最小值。理论分析在一个矩阵中,存在最大值与最小值,通过在循环语句中比较,就可以得出一个矩阵中所有元素的最大最小值。通过初始化一个max与min,然后将矩阵中个个元素与其进行比较,就可以得出矩阵中个个元素的最大值与最小值。代码实现#include int main()int juzheng 100100;int i , j , a , b , min , max ;max = -100000;min = 100000;printf(请输入矩阵的行数a 列数b n) ;scanf (%d %d,&a,&b);for (i = 0;i a ;i+)for (j = 0;j b ;j+)scanf (%d,&juzhengij);for (i = 0;i a ;i+)for (j = 0;j max)max = juzhengij; if (juzhengij min)min = juzhengij;printf (n);printf(max = %d min = %d,max,min);return 0;矩阵的乘法相关概念两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。如A是mn矩阵和B是np矩阵,它们的乘积C是一个mp矩阵,它的一个元素:并将此乘积记为:.例如:矩阵的乘法满足以下运算律:结合律:ABC=A(BC)左分配律:(A+B)*C=AC+BC右分配律:A*(B+C)=AC+BC但是矩阵乘法不满足交换律。理论分析 矩阵乘法必须是a*b的矩阵和b*n的矩阵形式才能相乘,通过矩阵乘法的运算法则,就可以得到新的矩阵。值得注意的是代码实现#include int main()int juzheng1 100100,juzheng2100100;int i , j , a , b , n ,d , k;printf(请输入矩阵的行数a和列数bn) ;scanf (%d %d,&a,&b);printf(输入矩阵1n);for (i = 0;i a ;i+)for (j = 0;j b ;j+)scanf (%d,&juzheng1ij);printf(矩阵2为a行n列,输入nn);scanf (%d,&n);printf(输入矩阵2:n);for (i = 0;i b ;i+)for (j = 0;j n ;j+)scanf (%d,&juzheng2ij);printf(两个矩阵的乘积y为:n);for(i = 0;i a;i+)for(j = 0;j n;j+)for(d = 0,k = 0;k n;k+)d += juzheng1ik * juzheng2kj;printf(%d ,d);printf(n);求转置矩阵把矩阵A的行换成相应的列,得到的新矩阵称为A的转置矩阵,记作或A。理论分析 只需要将输出是行数和列数交换一下就行了,在循环中将输出结果输出就可以了。对于数组下标的操作,有时可以很大的降低算法的复杂度。所以对于数组下标操作的小技巧,要留意。代码实现#include int main()int juzheng 100100;int i , j , a , b ;printf(请输入矩阵的行数a列数b n) ;scanf (%d %d,&a,&b);for (i = 0;i a ;i+)for (j = 0;j b ;j+)scanf (%d,&juzhengij);printf (转置矩阵是:阰n);for (i = 0;i a ;i+)for (j = 0;j b ;j+)printf(%d ,juzhengji);printf (n);return 0;求矩阵的逆设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩阵B,使得:AB=BA=I。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。理论分析伴随矩阵法求逆矩阵如果矩阵A可逆,则其中是A的伴随矩阵。代码首先求出A的伴随矩阵,代码#include#define N 10int getA(int arcsNN,int n)if(n=1)return arcs00;int ans = 0;int tempNN;int i,j,k;for(i=0;in;i+)for(j=0;jn-1;j+)for(k=0;k=i)?k+1:k;int t = getA(temp,n-1);if(i%2=0)ans += arcs0i*t;elseans -= arcs0i*t;return ans;void getAStart(int arcsNN,int n,int ansNN)if(n=1)ans00 = 1;return;int i,j,k,t;int tempNN;for(i=0;in;i+)for(j=0;jn;j+)for(k=0;kn-1;k+)for(t=0;t=i?k+1:kt=j?t+1:t;ansji = getA(temp,n-1);if(i+j)%2 = 1)ansji = - ansji;int main() int arcsNN;int astarNN;int i,j;int n;while(scanf(%d,&n)!=EOF & n)for(i=0;in;i+)for(j=0;jn;j+)scanf(%d,&arcsij);int a = getA(arcs,n);if(a=0)printf(can not transform!n);elsegetAStart(arcs,n,astar);for(i=0;in;i+)for(j=0;jn;j+)printf(%.3lf ,(double)astarij/a);printf(n);printf(n);return 0;求行列式相关概念一个n阶方块矩阵A的行列式可直观地定义如下:其中,Sn是集合 1, 2, .,n上置换的全体,即集合 1, 2, .,n到自身上的一一映射(双射)的全体;表示对Sn全部元素的求和,即对于每个Sn,在加法算式中出现一次;对每一个满足1i,jn的数对(i,j),ai, j是矩阵A的第i行第j列的元素。sgn()表示置换Sn的符号差,具体地说,满足1i(j)的有序数对(i,j)称为的一个逆序。如果的逆序共有偶数个,则sgn()1,如果共有奇数个,则sgn()-1。理论分析输入一个矩阵,按照行列式的定义展开,通过循环,就可以达到实现最后的目标。行列式的计算是一个复杂的过程,通过编程,可以直接输入该行列式,就可以输出其结果,这样大大减少了运算量,节约了时间。#includeint main() int z , r , s , j , i ; double a2020 , m , k ;m =1.0;printf(请输入阶数:);scanf(%d,&r);printf(请输入数字?n);for(i=0;ir;i+)for(j=0;jr;j+)scanf(%lf,&aij);for(z = 0 ; z r-1 ; z+)for(i = z ; i r-1 ; i+)if(azz=0)for(i=z;azz=0;i+)for(j=0;jr;j+)azj=azj+ai+1j;if(azz!=0)break;k=-ai+1z/azz;for(j=z;jr;j+)ai+1j=k*(azj)+ai+1j;for(z=0;zr;z+)m=m*(azz);printf(%f,m);return 0;3. 结论与反思在Microsoft Visual Studio 2010的编译环境下,通过C语言进行一些矩阵的基本操作,可以极大的简化我们的运算,这就是计算机科学的好处。 而矩阵在高等数学中扮演极其重要的作用。在其他科学中也扮演重要角色。矩阵的运算是数值分析领域的重要问题。将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。对一些应用广泛而形式特殊的矩阵,例如稀疏矩阵和准对角矩阵,有特定的快速运算算法。关于矩阵相关理论的发展和应用,请参考矩阵理论。在天体物理、量子力学等领域,也会出现无穷维的矩阵,是矩阵的一种推广。通过对于在C语言下对于矩阵进行相关的算法分析。可以发现,对于大多数问题,可以调用一些函数,通过函数的组合,来实现一些复杂的问题。由此其实最好的方法就是将个个方法封装起来,例如将加减乘除,数乘等运算封装成一个一个函数,完全可以建立属于自己的一个头文件,然后就可以通过调用头文件中的函数来大大简化代码量通过这次结业论文,加深了对于C语言的理解,尤其是对于二维数组的使用。数组,是C语言中重要的组成部分,多练习之后才可以熟练的使用。所以这一次结课论文,对于我来说是一次很好的练习C语言的机会。对于数组的使用,要善于使用数组下标和相对应的组内元素的关系。这有点像哈希表,通过组建一组映射来得以建立相关关系。这种方法可以极大简化算法的时间复杂度,这是一种以空间换取时间的方法。这样,就可以达到最终的目的。4 参考文献C程序设计,谭浩强,清华大学出版社c primer plus,作者Stephen Prata,译者云巅工作室,人民邮电出版社矩阵 ,百度百科 /link?url=O_DiVTv9C2g12pjqhpPJ6kEEjqHGrna-GIo-7F3UA0hMkokPRoBWWjWpb5hodsO8TD9oS5Uy-C0neDuJiqF3DpPrV7clMk_4iyoxSimmFM3线性代数与空间解析几何,黄廷祝,高等教育出版社C语言矩阵的运算,百度文库思考题(1)在下图乘法竖式中,每一个星号代表一个数位,若出现的数字有且仅有2,3,5,7四种,你能将这个竖式还原吗? * * * * * * * * * * * * * * * *程序代码#include int main ()int a5,b4;int biaozhun4=2,3,5,7;int e , f , g , h , i , k , l , m ;int chengyi,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 * biaozhune + 10 * biaozhunf + 1 * biaozhung; for (h = 0;h 4; h+) for (i = 0 ; i 4; i+) chenger = 10 * biaozhunh + 1*biaozhun i; he = chengyi * chenger; diyibu = chengyi * biaozhuni; b0 = diyibu % 10; b1 = (diyibu / 10) %10; b2 = (diyibu / 100) % 10; b3 = (diyibu / 1000) % 10; if (b0 = 2 | b0 = 3 | b0 = 5 | b0 = 7) & (b1 = 2 | b1 = 3 | b1 = 5 | b1 = 7) & (b2 = 2 | b2 = 3 | b2 = 5 | b2 = 7) & (b3 = 2 | b3 = 3 | b3 = 5 | b3 = 7) ) diyibu = b0*1+b1*10+b2*100+b3*1000; else continue; a0 = he % 10; a1 = (he / 10) % 10; a2 = (he / 100) % 10; a3 = (he / 1000) % 10; a4 = (he / 10000) % 10; if (a0 = 2 | a0 = 3 | a0 = 5 | a0 = 7) & (a1 = 2 | a1 = 3 | a1 = 5 | a1 = 7) & (a2 = 2 | a2 = 3 | a2 = 5 | a2 = 7) & (a3 = 2 | a3 = 3 | a3 = 5 | a3 = 7) &(a4 = 2 | a4 = 3 | a4 = 5 | a4 = 7) )zhunqueshu =a0*1+a1*10+a2*100+a3*1000+a4*10000;printf (这个数是%dn,zhunqueshu); 思考题二掷骰子问题游戏规则:每个骰子有六面,点数分别是1,2,3,4,5,6游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子。每轮掷两次骰子,第一轮如果和数为7或者11就为胜,游戏结束;和数为2,3,12则为负,游戏结束;和数为其

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论