数学实验矩阵的运算doc资料
数学实验矩阵的运算
数学实验报告 学院: 班级: 学号: 姓名: 完成日期:
实验四矩阵的运算 (一)投入产出分析 一.实验目的 1.理解投入产出分析中的基本概念和模型; 2.从数学和投入产出理论的角度,理解矩阵乘法、逆 矩阵等的含义。 二.问题描述 设国民经济由农业、制造业和服务业三个部门构成,已知某年它们之间的投入产出关系、部需求、初始投入等如表1-1所示 表1-1国民经济三产部门之间的投入产出表 根据表回答下列问题: (1)如果农业、制造业、服务业外部需求为 50,150,100,问三个部门总产出分别为多少? (2)如果三个部门的外部需求分别增加一个单位,问他们的总产出分别为多少? 三.实验过程
1.问题(1)的求解 (1)求直接消耗矩阵A 根据直接消耗的计算公式 a ij=x ij/x j 和各部门中间需求; x n a n 运行如下代码可得直接消耗系数表。 X=[15 20 30;30 10 45;20 60 0]; X_colsum=[100 200 150]; X_rep=repmat(X_colsum,3,1) A=X./ X_rep 运行结果为: A = 0.1500 0.1000 0.2000 0.3000 0.0500 0.3000 0.2000 0.3000 0 (2)求解 根据公式 X=(I-A)-1y 在运行如下代码 y=[50;150;100]; n=size(y,1);
W=eye(n)-A; X=W\y 运行结果为 X = 139.2801 267.6056 208.1377 即三个部门的总产出分别为139.2801,267.6056, 208.1377亿元。 2.问题2求解 设外部需求由y增加至y+Δy,则产出x的增量为Δx=(I-A)-1(y+Δy)- (I-A)-1y=(I-A)-1Δy 利用问题(1)求得的I-A矩阵,再运行如下的MATLAB代码可得问题的结果: dx=inv(W) 运行结果: dx = 1.3459 0.2504 0.3443 0.5634 1.2676 0.4930 0.4382 0.4304 1.2167 根据上述结果可知,当农业的外部需求增加1个单位时,农业、制造业、服务业的总产出分别增加
c语言 矩阵计算器
#include #define M 20 #define N 20 float A[M][N]; //定义了含有400个浮点型数组元素的二维数组 float B[M][N]; float C[M][N]; int i,j,m,n,p,q,k; int main() { printf(" ###########################################\n"); printf(" ### 欢迎您使用矩阵计算器系统。###\n"); printf(" ### 系统功能:###\n"); printf(" ### 计算两个矩阵相加,相减; ###\n"); printf(" ### 矩阵相乘;矩阵转置; ###\n"); printf(" ### ###\n"); printf(" #########################################\n\n"); int x; do{ printf("请选择您需要的运算,若退出则选择0后按回车键结束\n"); printf("******************************************************************\n") ; printf("0,退出\n"); printf("1,矩阵相加\n"); printf("2,矩阵相减\n"); printf("3,矩阵相乘\n"); printf("4,矩阵转置\n"); printf("******************************************************************\n") ; scanf("%d",&x); switch (x) {
matlab中的矩阵的基本运算命令
1.1 矩阵的表示 1.2 矩阵运算 1.2.14 特殊运算 1.矩阵对角线元素的抽取 函数diag 格式X = diag(v,k) %以向量v的元素作为矩阵X的第k条对角线元素,当k=0时,v为X的主对角线;当k>0时,v为上方第k条对角线;当k<0时,v为下方第k条对角线。 X = diag(v) %以v为主对角线元素,其余元素为0构成X。 v = diag(X,k) %抽取X的第k条对角线元素构成向量v。k=0:抽取主对角线元素;k>0:抽取上方第k条对角线元素;k<0抽取下方第k条对角线元素。 v = diag(X) %抽取主对角线元素构成向量v。 2.上三角阵和下三角阵的抽取 函数tril %取下三角部分 格式L = tril(X) %抽取X的主对角线的下三角部分构成矩阵L L = tril(X,k) %抽取X的第k条对角线的下三角部分;k=0为主对角线;k>0为主对角线以上;k<0为主对角线以下。函数triu %取上三角部分 格式U = triu(X) %抽取X的主对角线的上三角部分构成矩阵U U = triu(X,k) %抽取X的第k条对角线的上三角部分;k=0为主对角线;k>0为主对角线以上;k<0为主对角线以下。3.矩阵的变维 矩阵的变维有两种方法,即用“:”和函数“reshape”,前者主要针对2个已知维数矩阵之间的变维操作;而后者是对于一个矩阵的操作。 (1)“:”变维 (2)Reshape函数变维 格式 B = reshape(A,m,n) %返回以矩阵A的元素构成的m×n矩阵B B = reshape(A,m,n,p,…) %将矩阵A变维为m×n×p×… B = reshape(A,[m n p…]) %同上 B = reshape(A,siz) %由siz决定变维的大小,元素个数与A中元素个数 相同。 (5)复制和平铺矩阵 函数repmat 格式 B = repmat(A,m,n) %将矩阵A复制m×n块,即B由m×n块A平铺而成。 B = repmat(A,[m n]) %与上面一致 B = repmat(A,[m n p…]) %B由m×n×p×…个A块平铺而成 repmat(A,m,n) %当A是一个数a时,该命令产生一个全由a组成的m×n矩阵。 1.3 矩阵分解 1.3.1 Cholesky分解 函数chol 格式R = chol(X) %如果X为n阶对称正定矩阵,则存在一个实的非奇异上三角阵R,满足R'*R = X;若X非正定,则产生错误信息。 [R,p] = chol(X) %不产生任何错误信息,若X为正定阵,则p=0,R与上相同;若X非正定,则p为正整数,R是有序的上三角阵。 1.3.2 LU分解
矩阵运算程序设计
目录 1 课题分析 (1) 2 模块化分析 (1) 2.1 输入模块 (1) 2.1.1 输入模块要求 (1) 2.1.2 输入模块程序说明 (1) 2.2 判断模块 (3) 2.3 求和求差模块 (3) 2.4 乘法模块 (5) 2.4.1 求乘积模块概要 (5) 2.4.2 子程序段说明 (5) 2.4.3 乘法模块流程图 (8) 3 运行分析 (9) 4 心得体会 (11) 参考文献 (13)
矩阵运算程序设计 1 课题分析 根据给定的任务:能用键盘输入矩阵的参数(行、列及元素值),在进行运算前,先判断两个矩阵是否符合运算规则实现这两个矩阵的加,实现这两个矩阵的减,实现这两个矩阵的乘。进行模块化分析,所以程序中应该包括输入模块,保存需要处理的数据。判断模块,根据矩阵运算规则判断输入的数据能否进行矩阵加法,减法或者乘法运算,并调用相应的计算程序。计算模块,包括矩阵的加法,矩阵的减法和矩阵的乘法运算。输出模块,显示运算的结果。 2 模块化分析 2.1 输入模块 2.1.1 输入模块要求 先能用键盘输入矩阵的参数,行数和列数,然后根据输入各元素值,在输入数据之前有明显的提示信息,输入完后要保持各数据。运算完后要将各类计算的结果显示在屏幕上,并且要有明显的提示信息。 2.1.2 输入模块程序说明 输入的行列数保存到N和M中,为后来的比较和输入做准备,本程序段只是针对矩阵1的行和列,矩阵2则在此基础上经行替换即可以得到。 LEA DX,INFORMATION1 ;取信息提示地址偏移量 MOV AH,09h ;9号功能调用显示提示信息 INT 21H LEA DX,input1 ;提示输入矩阵1 的行数 MOV AH,09h ;9号功能调用显示提示信息 INT 21H
矩阵运算实验报告
实验报告 --矩阵运算 一.实验目的。 1.通过实践加强对程序设计语言课程知识点的理解和掌握,培养对课程知识综合运用能力、实际分析问题能力及编程能力,养成良好的编程习惯。 2.通过实践进一步领会程序设计的特点和应用,提高运用C++ 语言以及面向对象知识解决实际问题的能力。 3.通过实践掌握用C++ 语言编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识; 4.学会利用C++程序设计语言编写出一些短小、可靠的Windows实用程序,切实提高面向对象的程序设计能力。为后续的相关课程的学习打下基础。 二.实验要求。 1.学会建立模板类; 2.实现矩阵的“加”、“减”、“乘”、“数乘”、“转置”; 3.动态存分配并用随机数填充; 4.注意“加”、“减”、“乘”要进行条件的判断; 三.设计思路。
3.1算法基本流程 1)获取用户输入的矩阵1的行数和列数,动态生成一个一维数组 2)利用随机数生成数组成员,并利用两个循环输出数组,使其符合矩阵的格式 3)矩阵2同矩阵1的处理方法 4)通过两个矩阵的行数和列数比较来判断能否进行加减乘等运算,如不能,输出相关信息 5)如能够进行计算,则利用数组进行相应运算,并按照正确格式输出 6)通过改变一维数组中元素的顺序来实现转置并输出 3.2算法流程图
四.基本界面。
五.关键代码。 5.1关键类的声明 class CMatrixclass { public: CMatrixclass() { int m_Row = 0; //行 int m_Col = 0; //列 m_pElements = NULL; //一维数组
矩阵的运算实例程序
设计一个矩阵相乘的程序 假设有 1 5 7 3 3 9 1 4 1 4 A= 3 6 3 9 B= 5 6 7 9 0 3 1 2 8 7 3 2 7 2 5 6 0 3 1 9 9 7 4 7 8 0 3 2 5 4 求出A*B的矩阵 程序构思: 我们所知的矩阵乘法运算的算式如下: C ij = A ik X B kj的k从1到n 的和,那么可以用一个3层循环来运算此算式: C(1,1)=A(1,1)*B(1,1)+A(1,2)*B(2,1)+A(1,3)*B(3,1)+A(1,4)*B(4,1) =(1*3)+(5*5)+(7*3)+(3*9) =3+25+21+27 =76 同理 C(1,2)=A(1,1)*B(1,2)+A(1,2)*B(2,2)+A(1,3)*B(3,2)+A(1,4)*B(2,2) =(1*9)+(5*6)+(7*2)+(3*7) =9+30+14+21 =74 依此类推,我们可以求得矩阵A与矩阵B的矩阵乘积。 void main(void) { int matrixa[5][4]={1,5,7,3, 3,6,3,9, 1,2,8,7, 0,3,1,9, 3,2,5,4}; int matrixb[4][6]={3,9,1,4,1,4, 5,6,7,9,0,3, 3,2,7,2,5,6, 9,7,4,7,8,0}; int matrixc[5][6]; int i,j,k; for(i=0;i<5;i++) for(j=0;j<6;j++) { matrixc[i][j]=0; for(k=0;k<4;k++) matrixc[i][j]+=matrixa[i][k]*matrixb[k][j];
稀疏矩阵的运算(完美版)
专业课程设计I报告(2011 / 2012 学年第二学期) 题目稀疏矩阵的转换 专业软件工程 学生姓名张鹏宇 班级学号 09003018 指导教师张卫丰 指导单位计算机学院软件工程系 日期 2012年6月18号
指导教师成绩评定表
附件: 稀疏矩阵的转换 一、课题内容和要求 1.问题描述 设计程序用十字链表实现稀疏矩阵的加、减、乘、转置。 2.需求分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 二、设计思路分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 三、概要设计 为了实现以上功能,可以从3个方面着手设计。 1.主界面设计 为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主
控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。本系统主控菜单运行界面如图所示。 2.存储结构设计 本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。 3.系统功能设计 本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType 实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。 (1)稀疏矩阵的加法: 此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。 (2)稀疏矩阵的乘法: 此功能由函数void Xiangcheng( )实现。当用户选择该功能,系统提示输
矩阵基本性质
矩阵的基本性质 矩阵的第?第列的元素为。我们?或()表?的单位矩阵。 1.矩阵的加减法 (1),对应元素相加减 (2)矩阵加减法满足的运算法则 a.交换律: b.结合律: c. d. 2.矩阵的数乘 (1),各元素均乘以常数 (2)矩阵数乘满足的运算法则 a.数对矩阵的分配律: b.矩阵对数的分配律: c.结合律: d. 3.矩阵的乘法 (1),左行右列对应元素相乘后求和为C的第行第列的元素(2)矩阵乘法满足的运算法则 a.对于一般矩阵不满足交换律,只有两个方正满足且有 b.分配律: c.结合律: d.数乘结合律: 4.矩阵的转置, (1)矩阵的幂:,,…,
(2)矩阵乘法满足的运算法则 a. b. c. d. 5.对称矩阵:即;反对称矩阵:即 (1)设为(反)对称矩阵,则仍是(反)对称矩阵。 (2)设为对称矩阵,则或仍是对称矩阵的充要条件=。 (3)设为(反)对称矩阵,则,也是(反)对称矩阵。 (4)对任意矩阵,则分别是对称矩阵和反对称矩阵且. (5) 6. Hermite矩阵:即;反Hermite矩阵,即 a. b. c. d. e. f.(当矩阵可逆时) 7.正交矩阵:若,则是正交矩阵 (1) (2)
8.酉矩阵:若,则是酉矩阵 (1) (2) (3), (4) 9.正规矩阵:若,则是正规矩阵;若,则是实正规矩阵 10.矩阵的迹和行列式 (1)为矩阵的迹;或为行列式 (2);注:矩阵乘法不满足交换律 (3) (4),为酉矩阵,则 (5) (6) (7) (8) (9) (10) (11) (12),,则其中为奇异分解值的特征值 11.矩阵的伴随矩阵 (1)设由行列式的代数余子式所构成的矩阵
矩阵的基本运算
矩阵的基本运算 (摘自:华东师范大学数学系;https://www.doczj.com/doc/b04835524.html,/)§3.1 加和减 §3.2矩阵乘法 §3.2.1 矩阵的普通乘法 §3.2.2 矩阵的Kronecker乘法 §3.3 矩阵除法 §3.4矩阵乘方 §3.5 矩阵的超越函数 §3.6数组运算 §3.6.1数组的加和减 §3.6.2数组的乘和除 §3.6.3 数组乘方 §3.7 矩阵函数 §3.7.1三角分解 §3.7.2正交变换 §3.7.3奇异值分解 §3.7.4 特征值分解 §3.7.5秩 §3.1 加和减
如矩阵A和B的维数相同,则A+B与A-B表示矩阵A与B的和与差.如果矩阵A和B的维数不匹配,Matlab会给出相应的错误提示信息.如: A= B= 1 2 3 1 4 7 4 5 6 2 5 8 7 8 0 3 6 0 C =A+B返回: C = 2 6 10 6 10 14 10 14 0 如果运算对象是个标量(即1×1矩阵),可和其它矩阵进行加减运算.例如: x= -1 y=x-1= -2 0 -1 2 1 §3.2矩阵乘法 Matlab中的矩阵乘法有通常意义上的矩阵乘法,也有Kronecker乘法,以下分别介绍. §3.2.1 矩阵的普通乘法 矩阵乘法用“ * ”符号表示,当A矩阵列数与B矩阵的行数相等时,二者可以进行乘法运算,否则是错误的.计算方法和线性代数中所介绍的完全相同. 如:A=[1 2 ; 3 4]; B=[5 6 ; 7 8]; C=A*B, 结果为 C=×==
即Matlab返回: C = 19 22 43 50 如果A或B是标量,则A*B返回标量A(或B)乘上矩阵B(或A)的每一个元素所得的矩阵. §3.2.2 矩阵的Kronecker乘法 对n×m阶矩阵A和p×q阶矩阵B,A和B的Kronecher乘法运算可定义为: 由上面的式子可以看出,Kronecker乘积A B表示矩阵A的所有元素与 B之间的乘积组合而成的较大的矩阵,B A则完全类似.A B和B A均为np ×mq矩阵,但一般情况下A B B A.和普通矩阵的乘法不同,Kronecker乘 法并不要求两个被乘矩阵满足任何维数匹配方面的要求.Kronecker乘法的Matlab命令为C=kron(A,B),例如给定两个矩阵A和B: A= B= 则由以下命令可以求出A和B的Kronecker乘积C: A=[1 2; 3 4]; B=[1 3 2; 2 4 6]; C=kron(A,B) C = 1 3 2 2 6 4 2 4 6 4 8 12 3 9 6 4 12 8
矩阵乘法运算的C语言程序
#include #define N 30 #define M 30 void juzhen_mul(int m,int n,int *p1[M],int m1,int n1,int *p2[M]) { int i,j,x=0; int c[N][M]={0}; for(i=0;i} } void main() { int a[N][M],b[N][M]; int n,m,n1,m1,i,j; int *pa[M],*pb[M]; printf("请选择A矩阵的行数和列数:\n"); scanf("%d %d",&m,&n); for(i=0;i} printf("请选择B矩阵的行数和列数:\n"); scanf("%d %d",&m1,&n1); for(i=0;i