MATLAB的数组与矩阵操作
数组生成及初等运算
数组(矩阵)生成
直接生成
- 用中括号创建,不同行用分号隔开,不同列用空格隔开,冒号参照冒号表达式规则快速建立矩阵;
函数生成
- ![[常用特殊矩阵.jpg|]]
冒号表达式
- 可以产生行向量:e1:e2:e3(首:步长:尾)
- 省略e2则步长默认为1;
- 还能用linespace (a,b,n)产生行向量,ab为首尾,n为元素总数,省略n时自动产生100个元素;
基本数组操作
- 包括元素的寻址、查找和排序,以及对整个矩阵的转置、重排、拆分、连接和变换等;
数组元素的寻址
-
对数组下标访问
一维寻址
A=randn(1,6) %构造随机矩阵 A([1 3 4 6]) %按下标提取矩阵元素
若采用单下标寻址,则数组中元素下标k表示为(i-1)* m+i
二维寻址
A=randn(3,4) A(6) %按列 A(3,2) %3行2列
数组元素的查找
-
find函数 , 语法为:
单下标模式 indices=find(X) %用一个列向量存储非0元素下标 indices=find(X,k) %按列从前往后找出前k个非0元素 indices=find(X,k,'first') %按列从前往后找出前k个非0元素 indices=find(X,k,'last') %按列从后往前找出前k个非0元素 多下标模式 [i,j]=find(...) %给出两个下标,具体语法同上 [i,j,v]=find(...) %v是具体的非零数值
MATLAB中经常通过多重逻辑关系组合产生逻辑数组,判断数组元素是否满足某种关系,此时find函数可以返回符合比较关系的元素索引,从而实现对数组元素的查找
数组元素的排序
- sort:
B=sort(A) %对A排序,默认升序 B=sort(A,dim) %dim指定维数(dim默认为1,A为多维数组)--在二维数组中,1为按列(一维),2为按行(二维) B=sort(...,mode) %mode为排序方式:ascend/descend [B,IX]=sort(...) %IX存储排序后的下标数组
矩阵转置
- A’:转置
- A.':非共轭转置(当A为复数矩阵时存在该区分)
矩阵重排
- 对已存在矩阵,可根据其存储方式进行重排,例如:
>> a=[1 2;3 4;5 6] a = 1 2 3 4 5 6 >> b=a(:) b = 1 3 5 2 4 6 >> c=reshape(a,2,3) %变成2x3矩阵。注意,变换前后的矩阵元素个数必须相等 c = 1 5 4 3 2 6 >> d=zeros(2,2) %先定义一个2x2的全零矩阵 d = 0 0 0 0 >> d(:)=a(3:6) %然后从a矩阵中取出4个元素,构成新矩阵 d = 5 4 2 6
矩阵拆分
-
矩阵元素
- 在给矩阵个别元素赋值时,如果超出矩阵范围,会自动扩展矩阵,中间元素填0;
- sub2ind(下标转序号);
- ind2sub(序号转下标);
- size(A)函数返回包含两个元素的向量,分别是矩阵A的行数和列数;
- length(A)函数给出行数和列数中的较大者;
- ndims(A)给出矩阵A的维数;
- reshape(A,m,n)函数在矩阵总元素保持不变的前提下,将矩阵A按列重新排成mxn的二维矩阵(需要元素个数对上)
- 注意:reshape函数只改变矩阵的逻辑结构,不改变原矩阵的元素个数及其存储结构
-
矩阵的拆分
- 冒号表达式获取子矩阵
- A(:,j)表示取矩阵A的第j列全部元素(其他比如-A(i,:)-形式类似);
- A(i:i+m,:)表示取矩阵A第i~i+m行的全部元素,其他形式类似 ;
- end表示某一维的末尾元素下标
- 利用空矩阵删除矩阵元素
- 定义[]为空矩阵,该方法与clear的区别在于:矩阵依旧存在于工作区,只是维数为0;
- A(:,[2,4])=[]即为删除A的第二列和第四列元素
- 冒号表达式获取子矩阵
矩阵连接
- 联合一个或多个矩阵形成一个新矩阵,方括号[]可以作为矩阵连接操作符:
- A=[B C] ----水平连接矩阵B和C;
- A=[B;C] ----垂直连接矩阵B和C;
- 函数连接:
- cat—连接矩阵;
- horzcat—水平连接多个矩阵;
- vertcat—垂直连接多个矩阵;
- remat—复制一个矩阵到另一个矩阵;
- blkdiag—对角连接多个矩阵;
矩阵变换
- MATLAB提供一组变换函数,可以将矩阵变换成期望的形式:
>> A=fix(10*rand(2,4)) %产生[0,10]之间均匀分布的随机矩阵(取整) A = 8 1 6 2 9 9 0 5 >> B1=tril(A,1),B2=triu(A,1) %下三角矩阵和上三角矩阵 B1 = 8 1 0 0 9 9 0 0 B2 = 0 1 6 2 0 0 0 5 >> C1=fliplr(A),C2=flipud(A) %左右、上下翻转 C1 = 2 6 1 8 5 0 9 9 C2 = 9 9 0 5 8 1 6 2
数组运算
数值运算
- 运用基本数学函数对矩阵进行运算:
>> a=[2 4;6 8] a = 2 4 6 8 >> b=sqrt(a) %平方根 b = 1.4142 2.0000 2.4495 2.8284 >> d=exp(a) d = 1.0e+03 * 0.0074 0.0546 0.4034 2.9810
逻辑运算:
- 与 & and()
- 或 | or()
- 非 ~ not()
关系运算
- MATLAB提供了六种关系运算符:分别是大于>、大于等于>=、小于<、小于等于<=、等于== 、不等于~=
- 利用关系运算符可以实现多分支处理
向量的点积、叉积、混合积
-
点积计算(dot函数)
两个向量 在其中某一个向量方向上的投影的乘积、通常引申定义为向量的模dot(a,b) %向量a、b必须同维 dot(a,b,dim) %返回向量a、b在维数为dim的点积 >> a=[1 2 3 4] a = 1 2 3 4 >> b=[2 1 1 4] b = 2 1 1 4 >> dot(a,b) %dot乘表示向量内积 ans = 23 >> a.*b %*乘表示矩阵对应位置相乘 ans = 2 2 3 16
a
a =
1 2 3 4
c
c =
1
2
3
4
>> a.*c
ans =
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
>> dot(a,c)
ans =
30
```
-
叉积
表示过两相交向量交点的且垂直于两向量所在平面的向量,由cross函数实现
- c=cross(a,b)返回向量a和b的叉积向量,即c=a x b。a和b必须为三维向量
- 设a=(X1,Y1,Z1),b=(X2,Y2,Z2) 则 a×b=(Y1Z2-Y2Z1,Z1X2-Z2X1,X1Y2-X2Y1)
-
混合积
由以上两个函数实现:dot(a,cross(b,c))
范数
- 对函数、向量和矩阵定义的一种度量形式,任何对象的范数值都是一个非负实数。使用范数来测量两个函数、向量火或矩阵之间的距离。同一向量,采用不同的范数定义可以得到不同的范数值。
- ||X||满足以下三个条件:
-
(1)非负性:||X||>=0(仅当两个向量重合时等于0);
-
(2)齐次性:α∈R,有||αX||=|α|||X||;
-
(3)三角不等式:有||X+Y||<=||X||+||Y||;
则称实数||X||为向量X的范数。
-
- ||X||满足以下三个条件:
数组的保存和载入
一般将数组保存在文件中,每次需要时进行加载
- save命令将工作区指定变量存储在.mat文件中:
save<filename><var1><var2>...<varN>
- load命令将.mat文件中的变量加载到MATLAB工作区中
load<filename><var1><var2>...<varN>
矩阵运算
基本运算
-
矩阵加减
- 需满足以下条件之一:
- (1)类型相同、即行数相同,且列数相等;
- (2)其中一个为标量,此时的加减法运算结果等于矩阵中每一个元素都与标量做加减运算;
- 需满足以下条件之一:
-
矩阵乘积
- 必须满足行列条件:(前列数等于后行数)
-
矩阵除法
- 左除(\)
C=A\B=inv(A)*B %AX=B的解
- 右除(/)
C=A/B=A*inv(B) %XA=B的解
-
矩阵乘方和开方运算
- 矩阵乘方由符号“”实现,开方由sqrtm函数实现,矩阵中每个元素都乘方则用“.”实现
-
矩阵指数和对数运算
- expm和logm(注意与exp和log之间的区别—前者是矩阵指数/矩阵对数,后者仅为指数/对数(每个矩阵元素的指数/对数))
取得矩阵信息的函数
- length:返回矩阵最长的那维长度
- numel:返回矩阵的元素数
- ndims:返回矩阵的维数
- size:返回矩阵每一维的长度
点运算
两矩阵进行点运算是指他们的对应元素进行相关运算,要求两矩阵的维数相同;
- 对应元素相乘( .* )
>> A=[1 2 3;4 5 6;7 8 9];
>> B=[-1 0 1;1 -1 0;0 1 1];
>> C=A.*B
C =
-1 0 3
4 -5 0
0 8 9
- 对应元素相除(.\ 或 ./)
>> x=[1 2 3 ;4 5 6 ];
>> y=[-2 1 3;-1 1 4];
>> z1=x./y
z1 =
-0.5000 2.0000 1.0000
-4.0000 5.0000 1.5000
>> z2=y.\x
z2 =
-0.5000 2.0000 1.0000
-4.0000 5.0000 1.5000 %显然x./y=y.\x与矩阵左右除不同
- 对应元素指数(.^)
>> x=[1 2 3];
>> y=[4 5 6];
>> z=x.^y
z =
1 32 729
指数或底都可以是标量
%指数标量
>> x=[1 2 3];
>> y=[4 5 6];
>> z=x.^2
z =
1 4 9
%底标量
>> x=[1 2 3];
>> y=[4 5 6];
>> z=2.^[x y]
z =
2 4 8 16 32 64
- 示例:当x=0.1、0.4、0.7、1时,分别求y=sinxcosx的值,可以以向量形式求解:
>> x=0.1:0.3:1;
>> y=sin(x).*cos(x);