矩阵 线性代数行列式数

扫码下载官方APP
《线性代数》作为高等院校的一门重要的公共基础课程,有着广范的应用前景,在数学,物理和技术学科中都有着各种重要的应用。特别是在计算机广泛应用的今天,计算机图形学、密码学等都以线性代数为其理论和算法基础的一部分,使得本课程成为工科学生所必备的基础理论知识和重要的数学工具。近年来《线性代数》的内容已成为全国工学、经济硕士研究生等入学考试的必考内容,学科的重要性日益突现。本课程的教学任务是使学生掌握线性代数的基本概念,系统的代数理论和抽象的严格的代数方法,具有一定的逻辑思维能力和抽象思维能力,以及分析论证能力; 为学习其它专业课程打下良好的基础。我们开设的这门课主要讲授行列式,矩阵,向量与向量组,线性方程组以及相似矩阵及二次型等相关内容,开课16周,共32学时。其中行列式章节安排8学时,;矩阵章节安排10学时;向量与向量组章节安排4学时;线性方程组章节安排4学时;相似矩阵及二次型章节安排6学时。在整个课程的讲授过程中,我们组织安排了优质的教师资源。本团队每位教师均承担过线性代数的教学多年,拥有丰富的教学经验和厚实的数学理论。王住登和陈莉老师主讲第一章行列式,第三章向量组的线性相关性,第五章相似矩阵及二次型部分。郭曙光,韩诚老师主讲第二章矩阵及其运算。朱世平,孙映成老师主讲第四章线性方程组,相似矩阵及二次型部分。张勇,王双,黄娟娟老师担任辅导等工作。多名教师分工合作既保证了课程的多样性,能增强学生学习兴趣,也保证了教学的质量。欢迎同学们加入我们课程。谢谢。
本课程预期的受众主要是高校在读一年级与二年级非数学专业本科生;专科学校在读学生;和其他对线性代数有兴趣的同学们。
&线性代数教学大纲 &&&&&&&&&&&&&&&&& ()总学时数:学时&&&&&&&&&&&&&&&&&&&&&&&& 学 分 数:课程的性质与任务性代数是高等院校许多专业的一门重要的公共基础课程,一般于第二、三学期开设。本课程的教学任务是使学生掌握线性代数的基本概念,系统的代数理论,具有一定的逻辑思维能力和抽象思维能力; 为学习其它专业课程打下良好的基础。&&&&&& &通过对本课程的教学与学习,使学生能正确地理解线性代数基础知识、基本理论与基本运算。线性代数以行列式、矩阵为主要工具,系统地讲授线性方程组、线性空间等相关内容。&&&&本课程教学内容的选取应坚持因材施教的原则,确保学生透彻理解和掌握行列式性质,矩阵的初等变换,线性方程组的解法,矩阵特征值和特征向量等重点和难点内容。课程教学以教师讲授为主,引导学生学习,讨论为辅。课程教学既要讲授基础理论,又要重视习题课。习题课要保证一定学时。此外应加强学生作业布置、批改与讲评,从而使学生在掌握知识的同时提高分析问题和解决问题的能力。&&大纲内容与基本要求&第一章& 行列式(本章安排8学时)第一节 二阶与三阶行列式(1学时)第二节 全排列及其逆序数(0.5学时)第三节 n级行列式的定义(1学时)& 第四节 对换(0.5学时)?第五节 行列式的性质(2学时)& 第六节 行列式按行列展开(2学时)第七节 克莱姆法则(1学时)本章的重点和难点是利用行列式性质及按行(列)展开定理,计算行列式.第二章& 矩阵及其运算(本章安排10学时)第一节 矩阵(1学时)&&&& 第二节 矩阵的运算(2学时)第三节 逆矩阵(2学时)第四节 矩阵的分块法(1学时)第五节 矩阵的初等变换(1学时)第六节 初等矩阵(2学时)第七节 矩阵的秩(1学时)本章的重点是理解矩阵定义,掌握矩阵的运算;熟练掌握求逆矩阵的方法;熟练掌握矩阵初等行变换;理解矩阵秩的相关概念. 难点是掌握矩阵初等行变换及其应用.第三章&& 向量组的线性相关性(本章安排4学时)第一节 向量组及其线性组合(1学时)第二节 向量组的线性相关性(2学时)第三节 向量组的秩(0.5学时)第四节 向量空间(0.5学时)本章的重点和难点是掌握线性表示,线性相关性的充要条件;掌握计算最大线性无关组的方法.第四章&& 线性方程组(本章安排4学时)&&&&&&&&&&&&&&&& 第二节 线性方程组解的判定(2学时)第三节 线性方程组解的结构(2学时)本章的重点和难点是掌握线性方程组的解的判定与结构.第五章 相似矩阵及二次型(本章安排6学时)&&& 第一节 向量的内积、长度与正交性(1学时)&&& 第二节 方阵的特征值与特征向量(1学时)&&& 第三节 相似矩阵(1学时)&&& 第四节 实对称矩阵的对角化(0.5学时)&&& 第五节 二次型及其形(1学时)&&& 第六节 法化二次型成标准形(1学时)&&& 第七节 正定二次型(0.5学时)本章的重点是掌握方阵的特征值和特征向量的求法以及用法化二次型成标准形;难点除了上述两个部分外,本节的理论部分有一定抽象性,是学习的难点.&本课程考核由平时考核(包含单元测试;小组讨论;在线作业等)和期末闭卷考试两部分构成.?&
& &&& 本课程需要的预备知识主要是高中数学基础即可,包括初等的集合,向量等知识。
& &&&&&& 本课程证书获得要求总评超过60分。&&&&&& 总评成绩=学生平时成绩*20%+单元测试*50%+期末考试*30%。&&&&&&&平时成绩包括阅读教学视频及其他教学文件;每章的作业,小组讨论等。
[1]同济大学数学系. 工程数学线性代数. 第六版. 北京: 高等教育出版社, 2014.[2]李尚志. 线性代数. 第一版. 北京: 高等教育出版社, 2011.[3]居余马等. 线性代数. 第二版. 北京: 清华大学出版社, 2002.[4]傅长根. 线性代数. 第二版. 北京: 北京理工大学出版社, 2001[5]黄廷祝等. 线性代数与空间解析几何. 第三版. 北京: 高等教育出版社, 2008.
汇聚各省在线开放课程,促进优质教育资源共享。
| 京ICP备号-2 |
icourse163.org线性代数与矩阵论.pdf
扫描二维码,下载文件到手机
相关文档推荐
当前文件信息
浏览:3097次
保存:28次
下载:1070次
您的VIP会员已过期,是否续费?
用户应遵守著作权法,尊重著作权人合法权益,不违法上传、存储并分享他人作品。举报邮箱:
京网文[0号 京ICP证100780号矩阵乘法_百度百科
清除历史记录关闭
声明:百科词条人人可编辑,词条创建和修改均免费,绝不存在官方及代理商付费代编,请勿上当受骗。
相乘最重要的方法是一般矩阵。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义
。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。
矩阵乘法定义
的矩阵,B为
的矩阵,那么称
的矩阵C为矩阵A与B的乘积,记作
,其中矩阵C中的第
列元素可以表示为:
如下所示:
矩阵乘法注意事项
当矩阵A的列数等于矩阵B的行数时,A与B可以相乘。
矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。
矩阵乘法基本性质
乘法结合律: (AB)C=A(BC).
乘法左分配律:(A+B)C=AC+BC
乘法右分配律:C(A+B)=CA+CB
对数乘的结合性k(AB)=(kA)B=A(kB).
转置 (AB)T=BTAT.
矩阵乘法一般不满足交换律
矩阵乘法乘积-哈达马积( hadamard product)
的Hadamard积记为
。其元素定义为两个矩阵对应元素的乘积
的m×n矩阵
矩阵乘法乘积
Kronecker积是两个任意大小的矩阵间的运算,表示为
。克罗内克积也成为或
.以德国数学家利奥波德·克罗内克命名。计算过程如下例所示:
矩阵乘法实现
struct&Matrix:vector&vector&int&&&//使用标准容器vector做基类,需#include语句
&&&&Matrix(int&x=0,int&y=0,int&z=0)//初始化,默认为0行0列空矩阵
&&&&&&&&assign(x,vector&int&(y,z));
&&&&int&h_size()const//常量说明不可省,否则编译无法通过
&&&&&&&&return&size();
&&&&int&l_size()const
&&&&&&&&return&empty()?0:front().size();//列数要考虑空矩阵的情况
&&&&Matrix&pow(int&k);//矩阵的k次幂,用快速幂实现,k为0时返回此矩阵的单位矩阵
Matrix&operator*(const&Matrix&&m,const&Matrix&&n)//常量引用避免拷贝
&&&&if(m.l_size()!=n.h_size())return&Matrix();//非法运算返回空矩阵
&&&&Matrix&ans(m.h_size(),n.l_size());
&&&&for(int&i=0;&i!=ans.h_size();&++i)
&&&&&&&&for(int&j=0;&j!=ans.l_size();&++j)
&&&&&&&&&&&&for(int&k=0;&k!=m.l_size();&++k)
&&&&&&&&&&&&&&&&ans[i][j]+=m[i][k]*n[k][j];
&&&&return&
Matrix&Matrix::pow(int&k)
&&&&if(k==0)
&&&&&&&&Matrix&ans(h_size(),h_size());
&&&&&&&&for(int&i=0;&i!=ans.h_size();&++i)
&&&&&&&&&&&&ans[i][i]=1;
&&&&&&&&return&
&&&&if(k==2)return&(*this)*(*this);
&&&&if(k%2)return&pow(k-1)*(*this);
&&&&return&pow(k/2).pow(2);
矩阵乘法实际应用
矩阵乘法数据统计
某公司有四个工厂,分布在不同地区,同时三种产品,产量(单位;t),试用矩阵统计这些数据。
工厂\产品P1P2P3甲524乙382丙604丁016可用下述矩阵描述
,其中四行分别表示甲乙丙丁四个工厂的生产情况,三列分布表示三种产品P1,P2,P3的产量。
,其中第一列表示三种产品的单件利润,第二列表示三种产品的单件体积。
矩阵C的第一列数据分别表示四个工厂的利润,第二列分别表示四个工厂产品需要的存储空间。
矩阵乘法VOJ1067
我们可以用上面的方法二分求出任何一个递推式的第n项,其对应的构造方法为:在右上角的(n-1)*(n-1)的小矩阵中的上填1,矩阵第n行填对应的,其它地方都填0。例如,我们可以用下面的矩阵乘法来二分计算f(n) = 4f(n-1) - 3f(n-2) + 2f(n-4)的第k项:
利用矩阵乘法求解线性递推关系的题目有很多,这里给出的例题是系数全为1的情况。
给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值
把给定的图转为,即A(i,j)=1当且仅当存在一条边i-&j。令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点)。类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数。同理,如果要求经过k步的路径数,我们只需要二分求出A^k即可。
#include&&cmath&
#include&&cstdio&
#include&&cstring&
#include&&iostream&
#include&&algorithm&
#define&N&10
using&namespace&
const&int&mod&=&7777777;
typedef&long&long≪
struct&matrix{
&&LL&a[10][10];
matrix&multiply(matrix&x,matrix&y)
&&&matrix&
&&&memset(temp.a,0,sizeof(temp.a));
&&&for&(int&i=0;i&n;i++)
&&&&&&for&(int&j=0;j&n;j++)
&&&&&&&&&for&(int&k=0;k&n;k++)
&&&&&&&&&{
&&&&&&&&&&&&temp.a[i][j]+=x.a[i][k]*y.a[k][j];
&&&&&&&&&&&&temp.a[i][j]=(temp.a[i][j])%
&&&&&&&&&}
&&&return&
matrix&matmod(matrix&A,int&k)
&&&&matrix&
&&&&memset(res.a,0,sizeof&res.a);
&&&&for&(int&i=0;i&n;i++)&res.a[i][i]=1;
&&&&while(k)
&&&&&&&&if&(k&1)&res=multiply(res,A);
&&&&&&&&k&&=1;
&&&&&&&&A=multiply(A,A);
&&&&return&
void&print(matrix&x)
&&&for&(int&i=0;i&n;i++)
&&&&&&for&(int&j=0;j&n;j++)
&&&&&&&&&&cout&&"&"&&x.a[i][j];puts("");
&&&printf("---------------\n");
int&main()
&&&&int&k;
&&&&while&(cin&&n&&k)
&&&&&&&&memset(origin.a,0,sizeof&origin.a);
&&&&&&&&origin.a[0][0]=1;
&&&&&&&&for&(int&i=1;i&=n;i++)
&&&&&&&&&&&&origin.a[i][0]=1;
&&&&&&&&&&&&for&(int&j=0;j&i;j++)
&&&&&&&&&&&&&&&&origin.a[i][0]+=origin.a[j][0];
&&&&&&&&//&print(origin);
&&&&&&&&matrix&
&&&&&&&&memset(res.a,0,sizeof&res.a);
&&&&&&&&for&(int&i=0;i&n-1;i++)
&&&&&&&&&&res.a[i][i+1]=1;
&&&&&&&&for&(int&i=0;i&n;i++)&res.a[n-1][i]=1;
&&&&&&&&//print(res);
&&&&&&&&res=matmod(res,k-1);
&&&&&&&&LL&fans=0;
&&&&&&&&for&(int&i=0;i&n;i++)
&&&&&&&&&&&&fans+=res.a[0][i]*origin.a[i][0];
&&&&&&&&&&&&fans%=
&&&&&&&&cout&&fans&&
&&&&return&0;
矩阵乘法经典题目9
用1 x 2的多米诺骨牌填满M x N的矩形有多少种方案,M&=5,N&2^31,输出答案mod p的结果
我们以M=3为例进行讲解。假设我们把这个矩形横着放在电脑屏幕上,从右往左一列一列地进行填充。其中前n-2列已经填满了,第n-1列参差不齐。现在我们要做的事情是把第n-1列也填满,将状态转移到第n列上去。由于第n-1列的状态不一样(有8种不同的状态),因此我们需要分情况进行讨论。在图中,我把转移前8种不同的状态放在左边,转移后8种不同的状态放在右边,左边的某种状态可以转移到右边的某种状态就在它们之间连一根线。注意为了保证方案不重复,状态转移时我们不允许在第n-1列竖着放一个(例如左边第2种状态不能转移到右边第4种状态),否则这将与另一种转移前的状态重复。把这8种状态的转移关系画成一个有向图,那么问题就变成了这样:从状态111出发,恰好经过n步回到这个状态有多少种方案。比如,n=2时有3种方案,111-&011-&111、111-&110-&111和111-&000-&111,这与用多米诺骨牌覆盖3x2矩形的方案一一对应。这样这个题目就转化为了我们前面的例题8。
后面我写了一份此题的。你可以再次看到位运算的相关应用。
矩阵乘法经典题目10
题目大意是,检测所有可能的n位DNA串有多少个DNA串中不含有指定的病毒片段。合法的DNA只能由ACTG四个字符构成。题目将给出10个以内的病毒片段,每个片段长度不超过10。数据规模n&=2 000 000 000。
下面的讲解中我们以ATC,AAA,GGC,CT这四个病毒片段为例,说明怎样像上面的题一样通过构图将问题转化为例题8。我们找出所有病毒片段的前缀,把n位DNA分为以下7类:以AT结尾、以AA结尾、以GG结尾、以?A结尾、以?G结尾、以?C结尾和以??结尾。其中问号表示“其它情况”,它可以是任一字母,只要这个字母不会让它所在的串成为某个病毒的前缀。显然,这些分类是全集的一个划分(交集为空,为全集)。现在,假如我们已经知道了长度为n-1的各类DNA中符合要求的DNA个数,我们需要求出长度为n时各类DNA的个数。我们可以根据各类型间的转移构造一个边上带权的有向图。例如,从AT不能转移到AA,从AT转移到??有4种方法(后面加任一字母),从?A转移到AA有1种方案(后面加个A),从?A转移到??有2种方案(后面加G或C),从GG到??有2种方案(后面加C将构成病毒片段,不合法,只能加A和T)等等。这个图的构造过程类似于用做串匹配。然后,我们就把这个图转化成,让这个矩阵自乘n次即可。最后输出的是从??状态到所有其它状态的路径数总和。
题目中的数据规模保证前缀数不超过100,一次矩阵乘法是三方的,一共要乘log(n)次。因此这题总的是100^3 * log(n),AC了。
最后给出第9题的代码供大家参考(今天写的,熟悉了一下C++的类和运算符重载)。为了避免大家看代码看着看着就忘了,我把这句话放在前面来说:
Matrix67原创,转贴请注明出处。
#include&&cstdio&
#define&SIZE&(1&&m)
#define&MAX_SIZE&32
using&namespace&
class&CMatrix
&&&&public:
&&&&long&element[MAX_SIZE][MAX_SIZE];
&&&&void&setSize(int);
&&&&void&setModulo(int);
&&&&CMatrix&operator*&(CMatrix);
&&&&CMatrix&power(int);
&&&&private:
void&CMatrix::setSize(int&a)
&&&&for&(int&i=0;&i&a;&i++)
&&&&for&(int&j=0;&j&a;&j++)
&&&&element[i][j]=0;
&&&&size&=&a;
void&CMatrix::setModulo(int&a)
&&&&modulo&=&a;
CMatrix&CMatrix::operator*&(CMatrix&param)
&&&&CMatrix&
&&&&product.setSize(size);
&&&&product.setModulo(modulo);
&&&&for&(int&i=0;&i&&i++)
&&&&&&&&for&(int&j=0;&j&&j++)
&&&&&&&&&&&&for&(int&k=0;&k&&k++)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&product.element[i][j]+=element[i][k]*param.element[k][j];
&&&&&&&&&&&&&&&&product.element[i][j]%=
&&&&&&&&&&&&}
&&&&return&
CMatrix&CMatrix::power(int&exp)
&&&&CMatrix&tmp=(*this)*(*this);
&&&&if&(exp==1)&return&*
&&&&else&if&(exp&1)&return&tmp.power(exp/2)*(*this);
&&&&&&&&&&else&return&tmp.power(exp/2);
int&main()
&&&&const&int&validSet[]={0,3,6,12,15,24,27,30};
&&&&long&n,&m,&p;
&&&&CMatrix&
&&&&scanf("%d%d%d",&&n,&&m,&&p);
&&&&unit.setSize(SIZE);
&&&&for&(int&i=0;&i&SIZE;&i++)
&&&&&&&&for&(int&j=0;&j&SIZE;&j++)
&&&&&&&&if&(((~i)&j)&==&((~i)&(SIZE-1)))
&&&&&&&&&&&&bool&isValid=
&&&&&&&&&&&&for&(int&k=0;k&8;k++)&isValid=isValid||(i&j)==validSet[k];
&&&&&&&&&&&&unit.element[i][j]=isV
&&&&unit.setModulo(p);
&&&&printf("%d",unit.power(n).element[SIZE-1][SIZE-1]&);
&&&&return&0;
矩阵乘法矩阵乘法例题
题目大意是给你一个物品变换的顺序表,然后让你求变换了n次之后物品的位置.
解析:这个题目仔细想想并不是很难,由于每一行的变换顺序是不一样的,我们需要把所给出的矩阵每一行的变换用一个矩阵乘法维护,然而如果每次都乘一下的话就很容易超时.所以我们可以将每一行的变换得到的矩阵全部乘起来得到一个新矩阵,它就是变换k次(k是所给矩阵的行数)所乘的矩阵,那么我们就可以使用快速幂了,对于余数就暴力算就可以啦.
#include&&cstdio&
#include&&cstring&
#include&&algorithm&
using&namespace&
static&const&int&maxm=1e2+10;
#define&REP(i,s,t)&for(int&i=s;i&=t;i++)&
typedef&long&long≪
struct&matrix{
&&&&LL&mtx[maxm][maxm];
LL&A[maxm][maxm];
matrix&mul(matrix&A,matrix&B){
&&&&matrix&
&&&&memset(ret.mtx,0,sizeof&ret.mtx);
&&&&REP(i,1,n)REP(j,1,n)REP(k,1,n)
&&&&ret.mtx[i][j]=(ret.mtx[i][j]+A.mtx[i][k]*B.mtx[k][j]);
&&&&return&
matrix&pow(matrix&A,LL&n){
&&&&if(!n)return&A;
&&&&matrix&ret=A;n--;
&&&&while(n){
&&&&&&&&if(n&1)ret=mul(ret,A);
&&&&&&&&A=mul(A,A);
&&&&&&&&n&&=1;
&&&&return&
void&display(matrix&base){
&&&&for(int&i=1;i&=n;i++)printf("%lld&",base.mtx[1][i]);
&&&&puts("");
int&main(){
&&&&matrix&st,get,f;
&&&&scanf("%lld%lld%lld",&n,&m,&k);
&&&&for(int&i=1;i&=m;i++){
&&&&&&&&for(int&j=1;j&=n;j++){
&&&&&&&&&&&scanf("%lld",&A[i][j]);
&&&&&&&&&&&mx[i].mtx[A[i][j]][j]=1;
&&&&for(int&i=1;i&=n;i++)st.mtx[1][i]=i;
&&&&get=mx[1];
&&&&for(int&i=2;i&=m;i++)get=mul(get,mx[i]);
&&&&get=pow(get,k/m);k%=m;
&&&&for(int&i=1;i&=k;i++)get=mul(get,mx[i]);
&&&&st=mul(st,get);
&&&&display(st);
&&&&return&0;
//by&Exbilar
同济大学数学系.线性代数:高等教育出版社,2007年
张贤达.矩阵分析与应用:清华大学出版社,2012
李国 王晓峰.线性代数:科学出版社,2012:21
Lutkepohl H..Handbook of Matrices:New York:John Wiley &Sons,1996
.Matrix67: The Aha Moments.[引用日期]
清除历史记录关闭NumPy的矩阵和线性代数
我的图书馆
NumPy的矩阵和线性代数
内容索引矩阵 --- mat函数线性代数 --- numpy.linalg中的逆矩阵函数inv函数、行列式det函数、求解线性方程组的solve函数、内积dot函数、特征分解eigvals函数、eig函数、奇异值分解svd函数、广义逆矩阵的pinv函数In [1]:import numpy as np1. 矩阵在NumP中,矩阵是ndarray的子类,可以由专用的字符串格式来创建。我们可以使用mat、matrix、以及bmat函数来创建矩阵。1.1 创建矩阵mat函数创建矩阵时,若输入已经为matrix或ndarray对象,则不会为它们创建副本。因此,调用mat函数和调用matrix(data, copy=False)等价。在创建矩阵的专用字符串中,矩阵的行与行之间用分号隔开,行内的元素之间用空格隔开。In [2]:A = np.mat("1 2 3; 4 5 6; 7 8 9")print"Creation from string:\n", ACreation from string:[[1 2 3]&[4 5 6]&[7 8 9]]In [3]:# 转置print"Transpose A :\n", A.T# 逆矩阵print"Inverse A :\n", A.ITranspose A :[[1 4 7]&[2 5 8]&[3 6 9]]Inverse A :[[ -4. & 9. &-4.]&[ &9. &-1. & 9.]&[ -4. & 9. &-4.]]In [4]:# 通过NumPy数组创建矩阵print"Creation from array: \n", np.mat(np.arange(9).reshape(3,3))Creation from array:&[[0 1 2]&[3 4 5]&[6 7 8]]1.2 从已有矩阵创建新矩阵我们可以利用一些已有的较小的矩阵来创建一个新的大矩阵。用bmat函数来实现。In [5]:A = np.eye(2)print"A:\n", AB = 2 * Aprint"B:\n", B# 使用字符串创建复合矩阵print"Compound matrix:\n", np.bmat("A B")print"Compound matrix:\n", np.bmat("A B; B A")A:[[ 1. &0.]&[ 0. &1.]]B:[[ 2. &0.]&[ 0. &2.]]Compound matrix:[[ 1. &0. &2. &0.]&[ 0. &1. &0. &2.]]Compound matrix:[[ 1. &0. &2. &0.]&[ 0. &1. &0. &2.]&[ 2. &0. &1. &0.]&[ 0. &2. &0. &1.]]2. 线性代数线性代数是数学的一个重要分支。numpy.linalg模块包含线性代数的函数。使用这个模块,我们可以计算逆矩阵、求特征值、解线性方程组以及求解行列式。2.1 计算逆矩阵使用inv函数计算逆矩阵。In [6]:A = np.mat("0 1 2; 1 0 3; 4 -3 8")print"A:\n", Ainverse = np.linalg.inv(A)print"inverse of A:\n", inverseprint"check inverse:\n", inverse * AA:[[ 0 &1 &2]&[ 1 &0 &3]&[ 4 -3 &8]]inverse of A:[[-4.5 &7. &-1.5]&[-2. & 4. &-1. ]&[ 1.5 -2. & 0.5]]check inverse:[[ 1. &0. &0.]&[ 0. &1. &0.]&[ 0. &0. &1.]]2.2 行列式行列式是与方阵相关的一个标量值。对于一个n*n的实数矩阵,行列式描述的是一个线性变换对“有向体积”所造成的影响。行列式的值为正,表示保持了空间的定向(顺时针或逆时针),为负表示颠倒空间的定向。numpy.linalg模块中的det函数可以计算矩阵的行列式。In [7]:A = np.mat("3 4; 5 6")print"A:\n", Aprint"Determinant:\n", np.linalg.det(A)A:[[3 4]&[5 6]]Determinant:-2.02.3 求解线性方程组矩阵可以对向量进行线性变换,这对应于数学中的线性方程组。solve函数可以求解形如Ax = b的线性方程组,其中A是矩阵,b是一维或二维的数组,x是未知变量。In [8]:A = np.mat("1 -2 1; 0 2 -8; -4 5 9")print"A:\n", Ab = np.array([0,8,-9])print"b:\n", bA:[[ 1 -2 &1]&[ 0 &2 -8]&[-4 &5 &9]]b:[ 0 &8 -9]In [9]:x = np.linalg.solve(A, b)print"Solution:\n", x# checkprint"Check:\n",b == np.dot(A, x)print np.dot(A, x)Solution:[ 29. &16. & 3.]Check:[[ True &True &True]][[ 0. &8. -9.]]2.4 特征值和特征向量特征值(eigenvalue)即方程Ax = ax的根,是一个标量。其中,A是一个二维矩阵,x是一个一维向量。特征向量(eigenvector)是关于特征值的向量。在numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应特征向量的元组。In [10]:A = np.mat("3 -2; 1 0")print"A:\n", Aprint"Eigenvalues:\n", np.linalg.eigvals(A)eigenvalues, eigenvectors = np.linalg.eig(A)print"Eigenvalues:\n", eigenvaluesprint"Eigenvectors:\n", eigenvectorsA:[[ 3 -2]&[ 1 &0]]Eigenvalues:[ 2. &1.]Eigenvalues:[ 2. &1.]Eigenvectors:[[ 0..]&[ 0.4472136 & 0.]]In [11]:# check# 计算 Ax = ax的左右两部分的值for i in range(len(eigenvalues)):& & print"Left:\n", np.dot(A, eigenvectors[:,i])& & print"Right:\n", np.dot(eigenvalues[i], eigenvectors[:,i])& & printLeft:[[ 1.]&[ 0.]]Right:[[ 1.]&[ 0.]]Left:[[ 0.]&[ 0.]]Right:[[ 0.]&[ 0.]]2.5 奇异值分解SVD(Singular Value Decomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积。奇异值分解是特征值分解的一种推广。在numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。In [12]:from IPython.display import LatexLatex(r"$M=U \Sigma V^*$")Out[12]:M=UΣV?M=UΣV?*号表示共轭转置In [13]:A = np.mat("4 11 14;8 7 -2")print"A:\n", AU, Sigma, V = np.linalg.svd(A, full_matrices=False)print"U:\n", Uprint"Sigma:\n", Sigmaprint"V:\n", VA:[[ 4 11 14]&[ 8 &7 -2]]U:[[-0.9486833 &-0.]&[-0..9486833 ]]Sigma:[ 18. & 9.]V:[[-0...]&[ 0...]]In [14]:# Sigma矩阵是奇异值矩阵对角线上的值np.diag(Sigma)Out[14]:array([[ 18., & 0. & & & &],& & & &[ &0. & & & &, & 9.]])In [17]:# checkM = U*np.diag(Sigma)*Vprint"Product:\n", MProduct:[[ &4. &11. &14.]&[ &8. & 7. &-2.]]2.6 广义逆矩阵广义逆矩阵可以使用numpy.linalg模块中的pinv函数进行求解。inv函数只接受方阵作为输入矩阵,而pinv函数没有这个限制。In [18]:A = np.mat("4 11 14; 8 7 -2")print"A:\n", AA:[[ 4 11 14]&[ 8 &7 -2]]In [19]:pseudoinv = np.linalg.pinv(A)print"Pseudo inverse:\n", pseudoinvPseudo inverse:[[-0..]&[ 0..]&[ 0..]]In [20]:# checkprint"Check pseudo inverse:\n", A*pseudoinvCheck pseudo inverse:[[ &1. & 0.]&[ &8. & 1.]]得到的结果并非严格意义上的单位矩阵,但是非常近似。In [21]:A = np.mat("0 1 2; 1 0 3; 4 -3 8")print"A:\n", Ainverse = np.linalg.inv(A)print"inverse of A:\n", inverseprint"check inverse:\n", inverse * Apseudoinv = np.linalg.pinv(A)print"Pseudo inverse:\n", pseudoinvprint"Check pseudo inverse:\n", A*pseudoinvA:[[ 0 &1 &2]&[ 1 &0 &3]&[ 4 -3 &8]]inverse of A:[[-4.5 &7. &-1.5]&[-2. & 4. &-1. ]&[ 1.5 -2. & 0.5]]check inverse:[[ 1. &0. &0.]&[ 0. &1. &0.]&[ 0. &0. &1.]]Pseudo inverse:[[-4.5 &7. &-1.5]&[-2. & 4. &-1. ]&[ 1.5 -2. & 0.5]]Check pseudo inverse:[[ &1. &-2. & 8.]&[ &8. & 1. & 2.]&[ &0. & 3. & 1.]]
TA的最新馆藏
喜欢该文的人也喜欢}

我要回帖

更多关于 线性代数视频哪个好 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信