草庐IT

MATLAB 矩阵及运算

苓诣 2023-05-18 原文

文章目录


前言

相比较其他语言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.矩阵元素的访问

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)逻辑下标方式(见取子数组)

2.取子数组

同矩阵访问元素类似,在矩阵中取出子数组操作大致相同

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的第1A(:,end)   %表示提取A的最后1A([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)

3.矩阵元素赋值

学会子数组及矩阵元素的访问后,矩阵赋值则变得十分简单
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的待赋值的元素个数(但行列数可以不相等)

4.矩阵的拼接与扩展

矩阵拼接:
将几个矩阵放在[ ]内,
水平连接用空格或逗号隔开,

[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]相同

5.矩阵元素的删除

删除矩阵元素很简单,只有通过赋值为空([]),就可以实现删除若干行元素、若干列元素和整个数组

三、矩阵的算术运算

Matlab中的运算符及特殊符号的用法可以使用 help ops 命令查看

1.基本矩阵运算

C=A+BC=plus(A,B)
C=A-BC=minus(A,B)
累加C=+AC=uplus(A)
累减C=-AC=uminus(A)
乘积C=A*BC=mtimes(A,B)
乘方A^kmpower(A,k)
左除A\B = inv(A)*Bmldivide(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 

2.向量(数组)运算

在运算符 * \ / ^ 前面加.号表示数组运算(或称为点运算)

A.*Btimes(A,B)
C=A.\BC=ldivide(A,B) ,执行后C(i,j) = B (i,j) \ A(i,j)
C=A./BC=rdivide(A,B) ,执行后C(i,j) = B (i,j) / A(i,j)
A.^Bpower(A,B)

四、矩阵的关系逻辑运算

1.关系运算符

MATLAB 中关系运算符有六种:
==(eq)、~= (ne) 、 < (lt)、<= (le)、> (gt)、>= (ge)

关系运算法则:
1)当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0。
2)当参与比较的量是两个同型的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。
3)当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。

2.逻辑运算符

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 是一个功能强大软件,对矩阵的操作对于学习这门语言来讲更是十分重要,花了一天时间去整理相关的内容写下这篇博客,总的来说是比较枯燥繁琐的,但是写完又会感到一种成就感,对知识的掌握也更加熟练,希望之后的学习之路更加顺利吧。

有关MATLAB 矩阵及运算的更多相关文章

  1. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  2. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  3. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  4. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  5. ruby - 带括号和 splat 运算符的并行赋值 - 2

    我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

  6. ruby - 定义自定义 Ruby 运算符 - 2

    问题是:除了在“OperatorExpressions”?例如:1%!2 最佳答案 是的,可以创建自定义运算符,但有一些注意事项。Ruby本身并不直接支持它,但是superatorsgem做了一个巧妙的把戏,将运算符链接在一起。这允许您创建自己的运算符,但有一些限制:$geminstallsuperators19然后:require'superators19'classArraysuperator"%~"do|operand|"#{self}percent-tilde#{operand}"endendputs[1]%~[2]#Out

  7. ruby - Ruby 中 <=> 运算符的名称是什么?他们怎么调用它? - 2

    在Ruby中有运算符(operator)。在API中,他们没有命名它的名字,只是:Theclassmustdefinetheoperator...Comparableusestoimplementtheconventionalcomparison......theobjectsinthecollectionmustalsoimplementameaningfuloperator...它叫什么名字? 最佳答案 参见上面的@Tony。然而,它也被称为(俚语)“宇宙飞船运算符(operator)”。

  8. ruby - 将运算符传递给函数? - 2

    也许这听起来很荒谬,但我想知道这对Ruby是否可行?基本上我有一个功能...defadda,bc=a+breturncend我希望能够将“+”或其他运算符(例如“-”)传递给函数,这样它就类似于...defsuma,b,operatorc=aoperatorbreturncend这可能吗? 最佳答案 两种可能性:以方法/算子名作为符号:defsuma,b,operatora.send(operator,b)endsum42,23,:+或者更通用的解决方案:采取一个block:defsuma,byielda,bendsum42,23,

  9. ruby - OR 运算符和 Ruby where 子句 - 2

    可能真的很简单,但我很难在网上找到关于这个的文档我在Ruby中有两个activerecord查询,我想通过OR运算符连接在一起@pro=Project.where(:manager_user_id=>current_user.id)@proa=Project.where(:account_manager=>current_user.id)我是ruby​​的新手,但我自己尝试使用||@pro=Project.where(:manager_user_id=>current_user.id||:account_manager=>current_user.id)这没有用,所以1.我想知道如何在

  10. ruby - Ruby 中字符串运算符 + 和 << 的区别 - 2

    我是Ruby和这个网站的新手。下面两个函数是不同的,一个在函数外修改变量,一个不修改。defm1(x)x我想确保我理解正确-当调用m1时,对str的引用被复制并传递给将其视为x的函数。运算符当调用m2时,对str的引用被复制并传递给将其视为x的函数。运算符+创建一个新字符串,赋值x=x+"4"只是将x重定向到新字符串,而原始str变量保持不变。对吧?谢谢 最佳答案 String#+::str+other_str→new_strConcatenation—ReturnsanewStringcontainingother_strconc

随机推荐