科学计算:Python VS. MATLAB(3)----线性代数基础 一、线形代数理论基础 二、MATLAB的处理 1.建立矩阵 MATLAB中,矩阵是默认的数据类型。它把向量看做1×N或者N×1的矩阵。 %建立了一个行向量,不同元素之间使用空格或者逗号分开都是可以的。 A=[1,2,3] %建立一个矩阵,使用分号隔开不同的行。 A=[1,2,3;4,5,6] %那么,建立一个列向量就好办了。每行一个元素,分号分开即可。当然也可以使用行向量的转置(一个撇号表示转置)。 A=[1;2;3] MATLAB内置了很多特殊的矩阵生成函数,建立特殊矩阵十分方便。 i)第一组用来生成特殊规则的矩阵。如全零、全一、随机、等步长等形式。 X=zeros(m,n) %生成一个m*n的全0矩阵。同理,ones(m,n)生成一个全1矩阵;eye(m,n)生成一个单位阵。它们的重要作用在于预先分配矩阵空间,所以,在预知矩阵规模但是不知道矩阵具体数据的情况下,先用这几个函数生成一个矩阵,对提高运算速度十分有用。 X=rand(m,n) %生成一个平均分布的随机矩阵,数值区间[0,1]。同理,randn(m,n)生成一个服从正态分布的随机矩阵。注意,这些所谓的随机实际上都是伪随机。 v=linspace(a,b,n) %产生线性空间矢量。a和b分别是起点和终点,n是本区间内的点数,默认100个点。同理,logspace(a,b,n)产生对数空间矢量。不过它默认点数是50个。 v=1:0.1:10 %产生一个线性的矢量。规格是---起点:步长值:终点 ii)第二组用来在原有矩阵基础上获得一个具有某些特征的矩阵。 X=diag(v,k)和v=diag(X,k) %前者用矢量v中的元素生成一个对角矩阵,k是对角移位因子,默认为0,即主对角。k>0,对角线右移。后者返回矩阵X的对角元素,存在矢量v中。k的意义相同。 X1=triu(X,k)和X1=tril(X,k) fliplr(X)/flipud(X)/rot90(X) %这都是对矩阵的翻转操作,获得新的矩阵。分别是左右翻转(left-right)、上下翻转(up-down)和逆时针旋转90°操作。 iii)第三组用来生成一些具有理论价值的,往往是以数学家命名的矩阵。 magic(n)生成行列相加均为同一个数字的方阵。pascal(n)生成帕斯卡尔矩阵。hilb(n)生成希尔伯特矩阵。vander(v)生成范德蒙德矩阵。等等。 这些矩阵一般都有相应的学术背景,用到的时候,可以用命令help elmat在最后一个栏目中看看有没有自己要找的特殊矩阵,如果有,点进去进一步研究即可。 2.矩阵的特征信息 size(X) length() ndims() numel() isempty()和isequal()等is*型函数 [V,D] =
eig(A) k =
rank(A) b =
trace(A) d =
det(X) Y =
inv(X) n =
norm(X,option) c =
cond(X) 3.矩阵分解 矩阵分解是矩阵论的重要内容。常用的分解形式在MATLAB中都有函数予以实现,并且有些分解考虑了多种情况。常见的如:eig()、qr()、schur()、svd()、chol()、lu()等。具体使用的时候 4.矩阵运算 MATLAB默认的是矩阵运算,所以如果想要按元素依次计算,在原来运算符前加一个.号。比如.*表示按元素相乘。 每一个运算符都有一个对应的函数。如: A+B=plus(A,B)、A-B=minus(A,B) A*B=mtimes(A,B)、A.*B=times(A,B) A/B=mrdivide(A,B)、A./B=rdivide(A,B)、A\B=mldivide(A,B)、A.\B=ldivide(A,B) A^B=mpower(A,B)、A.^B=power(A,B) A'=ctranspose(A)、A.'=transpose(A) 其中的前缀m自然是表示matrix的意思。没有m前缀的就是按元素进行的意思。最后那个转置操作,c前缀表示的是按照复数操作进行转置。 此外,还有一些比较常用的运算: C=cross(A,B) %矢量叉乘。类似的,C=dot(A,B) %数组元素的乘积,默认按列计算。dim=1是列,dim=2是按行。这个概念很重要!! %矩阵指数运算。与此类似的logm(), sqrtm()。其中,funm(A,fun)用来计算矩阵A对通用函数fun的函数值。 5.矩阵索引 选择使用矩阵中的某些元素,就是所谓的矩阵索引了。 A(:,j) A(:,j:k) 三、Python的处理 Python使用NumPy包完成了对N-维数组的快速便捷操作。使用这个包,需要导入numpy。SciPy包以NumPy包为基础,大大的扩展了numpy的能力。为了使用的方便,scipy包在最外层名字空间中包括了所有的numpy内容,因此只要导入了scipy,不必在单独导入numpy了!但是为了明确哪些是numpy中实现的,哪些是scipy中实现的,本文还是进行了区分。以下默认已经:import numpy as np 以及 impor scipy as sp 下面简要介绍Python和MATLAB处理数学问题的几个不同点。1.MATLAB的基本是矩阵,而numpy的基本类型是多为数组,把matrix看做是array的子类。2.MATLAB的索引从1开始,而numpy从0开始。 1.建立矩阵 a1=np.array([1,2,3],dtype=int) a2=np.array([[1,2,3],[2,3,4]]) 同样,numpy中也有很多内置的特殊矩阵: b1=np.zeros((2,3)) b2=identity(n) b3=eye(N,M=None,k=0) 此外,numpy中还提供了几个like函数,即按照某一个已知的数组的规模(几行几列)建立同样规模的特殊数组。这样的函数有zeros_like()、empty_like()、ones_like(),它们的参数均为如此形式:zeros_like(a,dtype=),其中,a是一个已知的数组。 c1=np.arange(2,3,0.1) c2=np.linspace(1,4,10) d1=np.linalg.companion(a) d2=np.linalg.triu()/tril() e1=np.random.rand(3,2) fliplr()/flipud()/rot90() xx=np.roll(x,2) 2.数组的特征信息 先假设已经存在一个N维数组X了,那么可以得到X的一些属性,这些属性可以在输入X和一个.之后,按tab键查看提示。这里明显看到了Python面向对象的特征。 X.flags X.shape X.ndim X.size X.itemsize X.dtype X.T X.trace() np.linalg.det(a) np.linalg.norm(a,ord=None) np.linalg.eig(a) np.linalg.cond(a,p=None) np.linalg.inv(a) 3.矩阵分解 常见的矩阵分解函数,numpy.linalg均已经提供。比如cholesky()/qr()/svd()/lu()/schur()等。某些算法为了方便计算或者针对不同的特殊情况,还给出了多种调用形式,以便得到最佳结果。 4.矩阵运算 np.dot(a,b)用来计算数组的点积;vdot(a,b)专门计算矢量的点积,和dot()的区别在于对complex数据类型的处理不一样;innner(a,b)用来计算内积;outer(a,b)计算外积。 专门处理矩阵的数学函数在numpy的子包linalg中定义。比如np.linalg.logm(A)计算矩阵A的对数。可见,这个处理和MATLAB是类似的,使用一个m后缀表示是矩阵的运算。在这个空间内可以使用的有cosm()/sinm()/signm()/sqrtm()等。其中常规exp()对应有三种矩阵形式:expm()使用Pade近似算法、expm2()使用特征值分析算法、expm3()使用泰勒级数算法。在numpy中,也有一个计算矩阵的函数:funm(A,func)。 5.索引 numpy中的数组索引形式和Python是一致的。如: x=np.arange(10) print
x[2] print
x[-2] print
x[2:5] print
x[:-7] print
x[1:7:2] x.shape=(2,5) print
x[1,3] print
x[0] y=np.arange(35).reshape(5,7) print
y[1:5:2,::2] -------------------------------------------------分割线------------------------------------------------- 作为第一篇正式的介绍技术操作的文章,终于写完了,很费劲。恰恰就是在这个费劲的过程中,让我能更好的认识两者的区别和联系,同时梳理了展开的思路,摸索出了进一步学习的方法。 我们可以看到,MATLAB中实现了的函数或者功能,在numpy中都有了对应,并且有些实现的更好。当然,这只是冰山一角。如果你不愿意通读文档(很枯燥,谁也不愿意干!)也应该有理由相信,Python有能胜任工作的实现已经存在。后面的内容,将不再这样列出各种函数和功能,而是以某一个实际问题为核心,进行专题式的研究。至于全方位的了解,请自己查阅文档。有个经验之谈,就是,应该充分的利用文档中的【see also】功能,依此追踪下去,必然会获得关于某主题的全方位的认识。比如,在查阅ones()的时候,MATLAB的【see also】就给出了complex|eye|true|zeros四个链接。这就说明,这几个函数其实是有关联的,点进去进行简单的学习,找到共性,那么,可能很多人都遇到过的最大的困惑——那么多函数怎么记住呀?——就已经解决了。因为,我们不需要记住所有的函数,我们只需要记住有那么回事,只需要记住一个类似的函数,就可以很轻易的在用的时候顺藤摸瓜找出需要的函数。 下面简单的给出MATLAB和Python的自查自学方法吧! 1.MATLAB help
函数名 %在控制台给出某函数或者主题的帮助信息 doc %在帮助浏览器中给出帮助信息,这个界面更友好。在help browser中既有MATLAB整个产品的浏览左窗口,也有一个搜索框。同时还有大量存在的超链接。就一个感兴趣的主题,点下去,全面学习。不过要记住:别分神哦~~点到最后都忘了自己究竟要做什么! lookfor
关键词 %这是一个模糊寻找,含有关键词的词条入口都会给出来 2.Python help(np.array) help(np.add) ================update 20121229================= 关于python科学计算,隆重推荐sage math,sage的特点和用法,在本博客较新博文中有介绍。 |
|