![MATLAB R2020a从入门到精通(升级版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/74/38507074/b_38507074.jpg)
5.7 数组的基本运算
本节主要介绍与数组有关的一系列函数,即数组求和、数组乘法及其他处理函数。
5.7.1 数组求和
数组求和一般分为两种:数组的累加及数组的求和,所使用的函数分别是cumsum()和sum()。
1.使用cumsum()函数求数组的累加和
cumsum()函数用于求解一个数组的累加和,如果数组是一个向量,得到的仍然是一个向量;如果数组是一个矩阵,就需要从行和列这两个方面进行考虑。其调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_70.jpg?sign=1739285884-BGf8XfTXYbPnLPo0Vfz9v627cshWAj1U-0-50eb21bea98bb56cfc3f252c546f3443)
如果A是一个向量,那么返回的也是一个向量,该向量中第m行的元素是第1行到第m行的所有元素的累加和;如果A是一个矩阵,那么返回一个和原矩阵同行同列的矩阵,矩阵中第m行第n列的元素是A中第1行到第m行的所有第n列元素的累加和。
具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_71.jpg?sign=1739285884-MWUavHw85zoW3HsB4yG1n0iiAhuYxlAB-0-869b58036a3e0575896ba712d25bd69b)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_72.jpg?sign=1739285884-UUdrISSmziiZQ00ozmoVV3KpeaJvMqqG-0-ef436c47da4c85d523da69d0f35358b5)
这种调用格式返回A中由标量dim所指定的维数的累加和。例如,cumsum(A,1)返回的是沿着第1维(各列)的累加和,cumsum(A,2)返回的是沿着第2维(各行)的累加和。具体可查看MATLAB的帮助文档。
2.使用sum()函数求数组的和
sum()函数的用法很简单,它同样有两种格式,分别针对向量和矩阵。如果针对的是一个向量,那么得到的是一个数;如果针对的是一个矩阵,那么得到的是一个向量。其调用格式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_73.jpg?sign=1739285884-xiYMz1SrAraExfiBRDtvmUaO21Eh7HqW-0-b790339cfcf2873e82c3609cb76284a4)
其含义与前面的累加函数一样,具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_74.jpg?sign=1739285884-tGX94X0Qk1dF2gflI1NDAgeTTFZkPtn7-0-138a5d4f22b9e05953bf7971ddea2c32)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_75.jpg?sign=1739285884-gHs2hsJJPQ7kYw4P58NONXbdtqhsfpYV-0-b5711549034876fdfe085b033fcdcf59)
5.7.2 数组乘法
数组乘法分为点乘和叉乘,这两种乘法都有相关的函数。其中,点乘是数组元素之间的乘法,其函数为dot()。dot()函数也有两种调用形式:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_76.jpg?sign=1739285884-ryQpIZqwHx2hkuhVmJSeuVMLKrhklU4d-0-e6f29c5a3cdb65a5a46e2bf06372156c)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_77.jpg?sign=1739285884-cE7tVsaDcTLMNK40b2Efv6cSGdVPgdr4-0-17bfc9e4f98dfa78c17c508d054b117d)
其中,a与b是需要相乘的数组。具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_78.jpg?sign=1739285884-jL39fkWyL45wWTCTiu7CeYay9GtS5tME-0-a2007e1bf5243026fdf275430043e6a4)
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_79.jpg?sign=1739285884-zkmwyDiT02My5O84ZIbKziDMxtY2SlYl-0-3cc7b452f88e2f19b66f4ffeaddc6d21)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_80.jpg?sign=1739285884-H3TfkhQf5MDxUA9g2byI3CgpKvBAdCJu-0-654423ee7b3f45c0365d0cf21ee02af1)
可以看出,如果是两个相同长度的向量做点乘,就是向量之间的元素相乘后再加起来。两个具有相同行和列的矩阵做点乘,有如下两种调用方法:如果选择dim=1,则是列之间的元素相乘再相加,但这个可以忽略;如果选择dim=2,则是行之间的元素进行相乘,再相加得到一个列向量。
叉乘就是空间解析几何中所说的笛卡儿积,MATLAB中也有一个用于求解的函数,这个函数就是cross(),其调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_81.jpg?sign=1739285884-VRuWLfVjMzTIoNxyTHARO8tMfQmp9U2p-0-00909f08b175dd6da6385196c723bace)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_82.jpg?sign=1739285884-xhEHW9C737Y3qE9XbLbsfNQvnZ41Ap4p-0-80dde1f63f443a4afc4962799f385370)
其中,A与B是进行叉乘的两个向量,并且A与B必须是三元向量,其数学表达式可以表示为C=A×B;对于第二种调用形式,这里的A与B是高维数组,并且size(A,dim)和size(B,dim)的维数一定是3,返回的向量叉积维与A和B的维数一样。
具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_83.jpg?sign=1739285884-2CQTxZ8C36ee74mauLzakmDmvDH0vqXO-0-673eb03d665d85da40161e1071e379c3)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_84.jpg?sign=1739285884-Eu6GFbkNwuKQFtyT8N7absH9LK2fByHe-0-0e9b893ac3faa90d53e266531b44e1dc)
上述示例是对两个一维数组进行叉乘运算,对高维数组进行叉乘运算的示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_85.jpg?sign=1739285884-eQkVRJ4lXztWLtwn2TzYw00dPXlilFLx-0-5bb4255d46792e6025fdfb1367b54693)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_86.jpg?sign=1739285884-igkRoIQ5XeTD7wm8ltC6GZGSUAEisPWE-0-9e7d82cac5efcdaef094c4b8a952d936)
上述两个示例详细说明了cross()函数的具体用法。
5.7.3 其他处理函数
1.prod()函数
prod()函数可以用于求数组元素的乘积,其调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_87.jpg?sign=1739285884-4IdgW1NGWHxZzLytbWMZpANcrEoO7C7k-0-416abdee9453b3979cc741fa3aa012b2)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_88.jpg?sign=1739285884-WG9D49cbDXAJ6N7vEN4wOZN9HiG9SW1K-0-6c917d1c31b63c67641d13717bc861ee)
其中,A是待求解的数组。前者是数组A中每列的元素相乘,得到的是一个行向量;后者是指定对数组行或列的元素进行相乘,当dim=1时与前者的功能一样,当dim=2时代表对数组A中每行的元素相乘,得到的是一个列向量。
具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_89.jpg?sign=1739285884-5BwcsGB1uZCzKkl9c4l42Hww6cMAzUEg-0-d99c8753ca13de1c5ae29c411344133e)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_90.jpg?sign=1739285884-j5LdEaIso1oWRVvQCAKAXpRL8TNhfe9e-0-1b1514c99716e63d24fe6963c25bac5d)
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_91.jpg?sign=1739285884-5aEZvyparZ7JYzz7mf4XCrirjDpBiNhm-0-b0f571887356ea617020313bd27b59cc)
2.cumprod()函数
cumprod()函数的调用形式与cumsum()函数的调用形式一样,只不过cumprod()函数用于进行累积运算。cumprod()函数的调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_92.jpg?sign=1739285884-YHmJEHCeOMuVl7mIRDHFwgEJ5eYY3LCS-0-67ea5efc5f92b79d4d190473ad8077c2)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_93.jpg?sign=1739285884-QjbQdSbL4CH7IyKhDtdXTaCfJsKHDPyf-0-ac1236dbe40a706582d652c376fdd33d)
其中,A是待求解的数组。当dim=1时,表示求数组A中每列元素的累积,函数返回的是一个行向量;当dim=2时,表示求数组A中每行元素的累积,函数返回的是一个列向量。具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_94.jpg?sign=1739285884-1Q0aAO4QqJWOwiA9Ef8bU6Hd2YOBFhxH-0-ae794b6c7776b51fb73a0c2973abefc5)
当dim=1时,如果计算数组累积连乘,那么每列中第n个元素是原矩阵每列中前n个元素之积;当dim=2时,如果计算数组累积连乘,那么每行中第n个元素是原矩阵每行中前n个元素之积。
3.triu()函数
triu()是MATLAB中用于提取上三角矩阵的函数,其调用形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_95.jpg?sign=1739285884-S59ntUyMtC9hMUKVe60wT9JxrshVIHgI-0-ef4e2b3f2ec64a71ec6d8a61c793b7ad)
或者:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_96.jpg?sign=1739285884-3dxONtQqOohfnvKGzLVRoeQ3YPVE3O7Z-0-db1f9b0e0699b1d12cddd57c9ffd1030)
其中,X是待求解的数组。第一种调用形式返回的是数组X的主对角线及其右上方的数,并且其余位置上的元素为0。第二种调用形式返回的结果取决于k的值,当k<0时,得到主对角线下面的第-k条对角线及其右上方的元素,剩下的元素都为0;当k>0时,则往上取对角线。具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_97.jpg?sign=1739285884-EMHgSjj5pm6zwky9J6ot2rjpYvX81d1w-0-b7abec31d3257baa23be44a56bbbf5b0)
运行结果如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt006_98.jpg?sign=1739285884-DTnu8dvgdjCjV1a8ii7JfmZB7jRUtPtD-0-6b82334eebc80572a5df11afa2244eb9)
MATLAB中提供了许多矩阵操作的函数,可以实现矩阵的三角矩阵的提取(triu()函数和tril()函数)、矩阵的翻转(flipud()函数和fliplr()函数)和旋转(rot90)等各种操作。这些函数的相关使用方法可查看MATLAB的帮助文档。