相比较其他语言MATLAB 在处理矩阵和向量方面可谓功能十分强大,以下主要记录整理学习过程中一些矩阵的操作
1.1矩阵的创建:
将矩阵的元素用方括号括起来,按矩阵行的顺序输入各元素;
同一行的元素间用逗号或空格隔开,行与行之间用分号或回车键隔开
例如:
>> a=[1, 2, 3; 4, 5, 6; 7, 8, 9] %矩阵创建
a =
1 2 3
4 5 6
7 8 9
>> a=[1, 2, 3] %行向量
a =
1 2 3
>> a=[1; 2; 3] %列向量
a =
1
2
3
1.2等间隔行向量的创建:
行向量在绘制图像,表达式运算等方面起着重要作用
1)冒号表达式
格式1 x1:dx:x2
格式2 x1:x2
说明:
初值 x1、增量 dx 和 终值 x2 分别表示开始值、步长和结束值。
增量可为负值, 省略时则默认增量为1;
当增量省略或 增量>0 而 初值>终值 时为空向量
当增量<0 而 初值<终值 时也为空向量。
2) 使用linspace生成等间隔行向量
linspace函数的格式: linspace(a,b,n)
说明:linspace函数的功能为生成从 a 到 b 之间等间隔的 n 个元素
的行向量(n的默认中为100)
两种创建方式的使用视情况而定,若需要控制向量的个数,则使用linspace函数较为方便,若需要控制一段范围的步长,则使用冒号表达式更快捷
两种创建方式如下:
t1=0:0.1:pi;
t2=linspace(0,2*pi,5);
1.3利用Matlab内部函数产生特殊矩阵
在MATLAB的elmat函数库中存在一些创建特殊矩阵的函数
函数名称 | 函数功能 |
---|---|
zeros | 创建零矩阵 |
ones | 创建全一矩阵 |
eye | 创建单位矩阵 |
rand | 产生[0, 1]之间均匀分布的随机数 |
randn | 产生服从标准正态分布的随机数(均值为零,标准差为1) |
函数的调用格式与用法如下:
zeros(n) | 产生n×n零矩阵 |
zeros(m,n) | 产生m×n零矩阵 |
zeros(size(A)) | 产生与矩阵A同样大小的零矩阵 |
t = rand | 产生一个[0, 1]之间均匀分布的随机数 |
t = rand(3) | 产生元素在[0, 1]之间均匀分布的3x3的随机数矩阵 |
t=rand(3,4) | 产生3x4的[0, 1]之间均匀分布的随机数矩阵 |
t=10*rand(3,4)-5 | 产生[-5,5]之间均匀分布的3x4的随机矩阵 |
t=randn(3,4)*sqrt(5)+3 | 产生3x4阶均值为3,方差为5的正态分布的随机矩阵 |
1)向量元素的访问:
设 v 是向量,则 v(i) 表示向量 v 的第 i 个元素。
注意:Matlab中数组下标从1开始。
2)矩阵元素访问——全下标方式
A(i,j) 表示矩阵A中位于第 i 行、第 j 列的元素
例如:
A=[1, 2, 3; 4, 5, 6; 7, 8, 9]中
A( 1, 2 ) 即为 2
3)单下标方式
也可以根据矩阵元素在内存中的存储次序(序号)来引用矩阵元素
注意:在Matlab中矩阵的书写按行的顺序书写,但在内存中,按照列的顺序存储!
4)逻辑下标方式(见取子数组)
1)全下标方式
格式:A(Rows, Cols)
得到的是一个子矩阵,其中,
Rows是由(要取的行的)行下标组成的向量(如果只取1行,则Rows 是标量)
Cols是由(要取的列的)列下标组成的向量(如果只取1列,则Cols 是标量)
“ :”出现在行下标的位置表示所有行,
“ :”出现在列下标的位置表示所有列,
end出现在行下标的位置表示最大的行下标,
end出现在列下标的位置表示最大的列下标
例如:
>>A=[1 2 3 4;5 6 7 8;9 10 11 12];
A(1,:) %表示提取A的第1 行
A(:,end) %表示提取A的最后1 列
A([3 1], :) %表示提取A的第3行和第1行(行的顺序和A([1 3],:)不同
2)单下标方式:
通俗的来讲呢,就是将多个元素按照向量的形式取出
格式:A(S), 得到的是由A中(部分或所有)元素组成的向量
其中,S是由这些元素的单下标组成的向量
例如:
>>A=[1 2 3 4;5 6 7 8;9 10 11 12];
>>A(1:6)
ans =
1 5 9 2 6 10
3)逻辑表达式
1.利用find函数
基本格式:indexes=find(X)
功能:返回数组X中非零元素的序号(单下标),如无非零元素,则返回空数组
格式:[I, J]=find(X), X是矩阵
功能:返回矩阵X中非零元素的行号和列号。
格式:[I, J, V]=find(X), X是矩阵
功能:返回矩阵X中非零元素的行号、列号及值
2.逻辑数组作为下标
关系表达式及逻辑表达式 的运算结果为逻辑数组,还可以用logical函数将数值数组转换为逻辑数组
格式:logical(X)
功能:将数值数组X转换为逻辑数组
这种取数组的方式通常用于筛选出数组中的特殊元素
例如:
已知A=[4,-5,0,0,4; -5,0,7,-6,0],找出A的元素中的正偶数,统计个数、并求和。
方法一:使用find()函数
A=[4,-5,0,0,4; -5,0,7,-6,0]
xp=find(A>0 & rem(A,2)==0) %A中正偶数的序号
yp=A(xp) %A中的正偶数
N=length(xp) % A中正偶数的个数
sum(yp) %A中正偶数之和
方法二:利用逻辑数组下标
A=[4,-5,0,0,4; -5,0,7,-6,0]
Lp = A>0 & rem(A,2)==0
yp=A(Lp) %A中的正偶数,也可直接写成yp=A(A>0 & rem(A,2)==0)
N=length(yp)
sum(yp)
学会子数组及矩阵元素的访问后,矩阵赋值则变得十分简单
1)全下标方式
格式:A(Rows, Cols)=B
功能:给矩阵A的部分元素赋
其中, Rows和Cols 均为标量或向量,分别指定待赋值元素所在的行和列。
当B为标量时,表示将A的指定元素均赋值为B;
当B不为标量时,要求矩阵B的行、列数必须和左边子矩阵的行、列数完全一致
需要特别注意的是 A = B 则意味着赋值后的 A 变为一个标量
2)单下标方式:
格式:A(Indexes) = B
功能:给矩阵A的部分元素赋值
其中,Indexes为标量或向量(用于指定待赋值元素的序号)
注意:当A为矩阵时,其单下标(序号)不能越界
当B为标量时,表示将A的指定元素均赋值为B;
当B不为标量时,要求B的元素个数必须等于A的待赋值的元素个数(但行列数可以不相等)
矩阵拼接:
将几个矩阵放在[ ]内,
水平连接用空格或逗号隔开,
[A B] 或 [A , B] 也可以写成 horzcat(A,B)
垂直连接用分号或回车键隔开,
[A ; B] 也可以写成 vertcat(A,B)
矩阵扩展:
函数repmat
格式:repmat(A, row,col) 或repmat(A, [row,col])
功能:将矩阵A沿行和列的方向分别重复row和 col次
例如: repmat(A , 2 , 3) 和 [A A A ; A A A]相同
删除矩阵元素很简单,只有通过赋值为空([]),就可以实现删除若干行元素、若干列元素和整个数组
Matlab中的运算符及特殊符号的用法可以使用 help ops 命令查看
加 | C=A+B | C=plus(A,B) |
---|---|---|
减 | C=A-B | C=minus(A,B) |
累加 | C=+A | C=uplus(A) |
累减 | C=-A | C=uminus(A) |
乘积 | C=A*B | C=mtimes(A,B) |
乘方 | A^k | mpower(A,k) |
左除 | A\B = inv(A)*B | mldivide(A,B) |
右除 | A/B = A*inv(B) | mrdivide(A,B) |
共轭转置 | A’ | ctranspose(A) |
非共轭转置 | A.’ | transpose(A) |
上诉计算式,当 A为标量时,该标量与矩阵每一个元素进行运算,否则,服从线性代数运算法则
需要特别注意的是左除操作
x=A \ b 为线性方程组 A*x = b 的解
即:若要求解线性方程组
只需以下代码即可实现:
A=[2 2 -1 1;4 3 -1 2;8 3 -3 4;3 3 -2 -2];
b=[4 6 12 6]';
x=A\b %等价于 x=inv(A)*b
在运算符 * \ / ^ 前面加.号表示数组运算(或称为点运算)
A.*B | times(A,B) |
C=A.\B | C=ldivide(A,B) ,执行后C(i,j) = B (i,j) \ A(i,j) |
C=A./B | C=rdivide(A,B) ,执行后C(i,j) = B (i,j) / A(i,j) |
A.^B | power(A,B) |
MATLAB 中关系运算符有六种:
==(eq)、~= (ne) 、 < (lt)、<= (le)、> (gt)、>= (ge)
关系运算法则:
1)当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0。
2)当参与比较的量是两个同型的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。
3)当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。
a&b | 当 a和b都非零时,运算结果为1;只要a和b中有一个为零,则结果为0. |
a|b | 只要a和b中有一个非零,则结果为1 (只有当a和b 都为零时,运算结果为0,否则为1) |
~a | 当a是零时,运算结果为1;当a非零时,运算结果为0 |
xor(a,b) | 当a和b中恰好一个为0,另一个不为0时运算结果为1,否则为0 |
a && b (先决与) | 当a为0时,则结果为0,而不去计算&&右边表达式的值(只有当该逻辑运算符的左边非零时,才继续执行该符号右边的运算)。 |
a || b (先决或) | 当a为1时,则结果为1,而不去计算 |
(1)若参与逻辑运算的是两个同型矩阵,则对两个矩阵相同位置的元素逐对按标量规则进行逻辑运算。 最终运算结果是一个与原矩阵同型的逻辑矩阵。
(2)若参与逻辑运算的一个是标量,一个是矩阵,则分别用矩阵的每个元素和标量进行逻辑运算。最终运算结果是一个与原矩阵同型的逻辑矩阵。
(3) 逻辑非是一个单目运算。若A是一个数组,~A 对矩阵A的每个元素进行逻辑非运算,得到的结果是一个与A同型的逻辑矩阵。
矩阵分析
函数 | 功能 |
---|---|
inv(A) | 方阵A的逆 |
pinv(A) | 矩阵A 的广义逆(或称为伪逆) |
det(A) | 方阵A的行列式. |
rank(A) | 矩阵的秩 |
trace(A) | 矩阵A的迹 (即主对角线元素之和 ). |
poly (A) | 当A是方阵时,求矩阵A的特征多项式 |
fliplr | 用于将矩阵各列左右颠倒, |
flipud | 将矩阵各行上下颠倒, |
rot90 | 将矩阵元素绕矩阵的中心逆时针旋转90度 |
flipdim(A,dim) | 功能:将A关于第d维翻转得到B。dim=1, 对行下标进行反转; dim=2, 对列下标进行反转 |
any(x) | 功能:1)若x是一个向量,如果x中存在非零元素,则返回1;否则,返回0。2)若x为矩阵,则分别对矩阵的每一列进行判断,最后返回一个由元素0和1组成的行向量。 |
all(x) | 功能:(1)若x是一个向量,如果x中所有元素都非0,则返回1;否则,返回0 (2)若x为矩阵,则分别对矩阵的每一列进行判断,最后返回一个由元素0和1组成的行向量。 |
isempty(A) | 判断A是否为空矩阵,如果是返回1,否则返回0. |
isnan(A) | 对于A的每个元素分别判断是否为NaN |
isinf(A) | 对于A的每个元素分别判断是否为无穷大(inf或者-inf) |
isfinite(A) | 对于A的每个元素分别判断是否为有限的值 |
isa(x, ‘ClassName’) | 判断x是否为’ClassName’类型的数据(常量或变量),例如:isa(x,’double’)判断x是否为双精度型的变量,isnumeric(A) 判断A是否为数值型,islogical(A) 判断A是否为逻辑型,类似的还有:isfloat(A), isinteger(A),isreal(A) ,ischar(A), iscell(A), isstruct(A)等 |
isscalar(A) | 判断A是否为标量 |
isvector(A) | 判断A是否为向量 |
isrow(A) | 判断A是否为行向量 |
iscolumn(A) | 判断A是否为列向量 |
isequal(A,B) | 如果A和B是同型的,并且数组的元素也相同,则返回1,否则返回0 |
exist | 判断是否存在指定的变量或者文件 |
矩阵运算
函数 | 功能 |
---|---|
expm | 矩阵指数运算 |
logm | 矩阵指数运算 |
sqrtm | 矩阵开方运算 |
funm | 调用函数,例如:funm(A,’exp’)或funm(A, @exp)等价于expm(A) ;funm(A,’log’) 等价于 logm(A) ; funm(A,’sqrt’) 等价于sqrtm(A) |
线性代数
函数 | 功能 |
---|---|
Z=null(A) | Z的各列为矩阵A零空间的一组标准正交基,即:A*Z=0, Z’*Z=I 且size(Z,2)=dim(null(A)),可用于求Ax=0的基础解系 |
B=orth(A) | 得到range(A)的一组标准正交基,即B’*B=I, 并且B和A张成相同的线性空间 |
rref(A) | 利用高斯消元法产生矩阵A的行阶梯形矩阵(即矩阵非零行的第1个非零元素为1,且该非零元素所在列的其它元素均为零,可用于求Ax=b的解或通解) |
subspace(A,B) | 用于求两个子空间之间的夹角 |
矩阵的范数与条件数
函数 | 功能 |
---|---|
norm | - 求矩阵或向量的范数 |
normest | - 估计矩阵的2范数. |
normest1 | - 估计矩阵的1范数. |
cond | - 求矩阵的条件数 |
rcond | - 估计1范数下的条件数的倒数 |
condest | - 估计1范数下的条件数 |
condeig | - 计算矩阵特征值的条件数 |
矩阵分解
函数 | 功能 |
---|---|
chol | - Cholesky分解. |
cholinc | - 不完全Cholesky分解. |
ldl | - 块LDL’分解. |
lu | - LU 分解. |
luinc | - 不完全LU 分解. |
qr | - QR分解 |
特征值与奇异值分解
函数 | 功能 |
---|---|
eig | - 特征值分解,计算特征值问题及广义特征值问题. |
svd | - 奇异值分解 |
gsvd | - 广义奇异值分解 |
eigs | - 计算最大(或最小)的k个特征值及对应的特征向量(也可用于求广义特征值问题). |
svds | - 计算最大(或最小)的k个奇异值 |
MATLAB 是一个功能强大软件,对矩阵的操作对于学习这门语言来讲更是十分重要,花了一天时间去整理相关的内容写下这篇博客,总的来说是比较枯燥繁琐的,但是写完又会感到一种成就感,对知识的掌握也更加熟练,希望之后的学习之路更加顺利吧。