1
前言
上次讲完了数组的基本操作,不知道是否熟悉使用了,本篇将要对矩阵部分的操作再进行介绍,这部分的内容我觉得蛮有意思的,不过你们觉不觉得我就不知了,但还是想让你们可以感受到它的有趣之处。
~Show Time~
2
矩阵秀
对于矩阵的操作,通俗点说就是行列之间变来变去,当然这只是很浅面的一个体现,学过线性代数相关课程的,我想,你对矩阵的内容应该都有所了解,其在MATLAB中的精髓就等我一一揭开了~
1、转置
转置是个很好理解的东西,就是相当于将原本的行列转了一下,行列之间的关系做了对调,还没懂?那直接看实例来了解了解:
看到了吧,简单来看,转置就是把横着的行变成了竖的,MATLAB中的转置,就是直接在变量后加一个单引号,就如例子里面的A',如果A是一个复数矩阵,那么这时候的A'就相当于是共轭矩阵,来个例子看看效果
代码:
re=[1:5];im=[6:10];A=re+i*imB=A'
运行结果:
如果要弄成非共轭矩阵,就需要采用 A.' 这种形式,更改代码后,运行结果:
矩阵转置的部分就讲到这,接着开始说下矩阵重排的操作。
2、重排
对于矩阵重排这个名字,你可能会有点陌生,但是讲完后,你就肯定可以知道这个名字为什么要叫这个名了。
对于已经存在的矩阵,都可以根据存储的方式进行重排,就是将原本的行列按照自己设定的行列数进行重新排列,但是也需要按照规则进行,直接上实例,看图:
先是直接产生一个3行2列的矩阵A,然后使用冒号的功能,直接变成了只有一列的矩阵B,最后使用reshape函数将矩阵A变成了2行3列的新矩阵C,且从中都可以看到,他们都是按列的顺序进行重新排列,第一列排完了才接着下一列的数据。
注意:reshape不能改变原矩阵的元素数目。
顺便来秀一个小操作,重新赋值感觉有点用,也相当于是构成新矩阵了,直接看图进行了解吧,我就不分析了,学会了已经记录的文章,分析就很简单了:
当然,除了这种粗暴的赋值以外,还有一种温柔的赋值,可以对矩阵的单个元素进行重新赋值的操作,比如将刚刚的A的5变成555,看操作:
这种基本上就是直接按照自己的意愿来改变原矩阵中特定行列的值,假如你想说,改变不在矩阵中的行列,行不行?
可以很肯定的告诉你,行!
来看下运行结果:
看到结果,是不是猜到作用了,就是很粗暴的将原矩阵进行扩展,直到实现了你想要改变的值,其余扩展部分的值就全部赋为0。
3、拆分
看到标题名字,你也应该猜到要讲的内容是怎样的了,很明显,就是将一个大的矩阵拆掉,然后获得一个子矩阵,在进行拆分之前还需要了解一个比较重要的点,就是要清楚的了解元素的序号,该序号和下标是一一对应的,上次文章中的寻址已经有所介绍,这次再进行说明一番,和刚刚的重排一个样,都是按列进行的,序号是按列进行编号,先第一列,再第二列,依此类推,例如:
序号和下标的对应关系也已经说过,以一个m x n 的矩阵A为例,A(i,j)表示第i行j列的元素,其序号就是:(j-1)*m+i,当然你也可以直接一列一列的数
不过很显然,还有更快进行关系转换的工具,两个函数,分别用于下标转序号(sub2ind)和序号转下标(ind2sub),看下使用结果:
简单说下结果,A是一个3行2列的矩阵,然后用sub2ind将A矩阵2行2列的元素的下标转换成序号,再用ind2sub将矩阵A中序号为4的元素下标表示出来,并分别用i和j存该序号对应元素的行列标号。
回到本标题的正式内容,拆分~
拆分的形式主要可与分成两种;
第一种
第一种已经出现过很多次了,就是使用冒号来获得子矩阵。
A(i,:)表示取矩阵A第i行的全部元素;
A(:,j)表示取矩阵A第j列的全部元素;
A(i:i+m,:)表示取矩阵A第i~i+m行的全部元素;
A(:,k:k+n)表示取矩阵A第k~k+n列的全部元素;
A(i:i+m,k:k+n)表示取矩阵A第i~i+m行,第k~k+n列的全部元素。
直接演示几个看下结果:
刚刚开始讲到的A(:)直接将矩阵中的元素排成一个列向量也属于拆分的一种形式,如果忘了就翻到上面再看看。
除了以上几种使用具体的维数,来获得子矩阵的方法外,还可以和end运算符结合起来获取子矩阵,end在以前的篇章中也有过介绍,就是代表所在维的最后一行或者最后一列,继续用这个A矩阵来简单看下使用后的结果:
第二种
在MATLAB中,[ ]代表一个空矩阵,如果给某个变量X直接赋值为空矩阵,则只需要X=[ ],这种矩阵的维度是0,因此可以使用这种方法将某个大矩阵中的一些元素删除,但然后得到一个新的矩阵,直接看操作:
4、拼接
既然矩阵有拆分,当然也可以有拼接,即将多个矩阵拼成一个矩阵,拼接的方法就是使用[ ],比如要将B和C拼成A,就可以这样:A=[B,C];也可以A=[B; C];这两个的区别就是拼接的方向不同,前面的是水平方向拼接即行方向,后面的是垂直方向拼接即列方向;因此要注意对应方向的维度要一致。
举个简单的实例对比下就知道了,先产生两组列数相同,行数不同的矩阵。
然后进行拼接:
很显然,列方向进行拼接就可以,行方向拼接就不行。
此外还要一些函数也可以实现拼接的功能,如cat,调用格式:C=cat(dim,A,B)
其中dim就是拼接方向,A和B就是待拼接的矩阵,C就是拼接后的矩阵,当然也可以使用多个矩阵进行,比如C=cat(dim,A,B,D,....)
简单演示下:
从结果看得出来,dim为1是按列拼接,为2是按行拼接。
以下列出一些拼接相关的函数,不过感觉不太常用,可以自己摸索下使用:
函数 | 功能 |
cat | 拼接矩阵 |
horcat | 水平方向拼接多个矩阵 |
vercat | 垂直方向拼接多个矩阵 |
remat | 复制一个矩阵到另一个矩阵 |
blkdiag | 对角连接多个矩阵 |
5、变换
在MATLAB中还提供了一些变换函数,可以将矩阵变成想要的形式的,如rot90,tril,triu,fliplr,flipud等,做一两个演示,先产生一个3维的矩阵,然后对其做指定的变换:
图片里有些数据多的,图片的内容就弄得比较小了,应该是不影响阅读感
阅读本文共使用 秒
电子知识
一些电路设计与DIY作品
电子设计技巧与经验
FPGA
System Generator系列教程
算法介绍
通信协议分析
资料分享
Matlab系列记录
建设中~
点个赞
再走吧